ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从栅格到矢量:map-vectorizer中GDAL地理配准与投影转换的实现原理

从栅格到矢量:map-vectorizer中GDAL地理配准与投影转换的实现原理 从栅格到矢量map-vectorizer中GDAL地理配准与投影转换的实现原理【免费下载链接】map-vectorizerAn open-source map vectorizer项目地址: https://gitcode.com/gh_mirrors/ma/map-vectorizer地图矢量化map vectorization是把扫描版的历史地图、街区图等栅格图像转化为带地理坐标的矢量数据Shapefile / GeoJSON的过程。开源项目map-vectorizer正是为此而生——它用 OpenCV 识别图形、用 GIMP 做图像预处理、用 GDAL 完成地理配准与投影转换最终把一张普通 GeoTIFF 变成可用的 GIS 数据。本文带你拆解其中最核心的 GDAL 环节坐标从哪来、如何写进图像、又如何在投影间旅行。一、为什么栅格地图必须做地理配准扫描下来的地图只是一张画像素坐标第几行、第几列与真实经纬度毫无关系。地理配准Georeferencing就是建立像素 ↔ 地理坐标的映射关系让地图真正落地。map-vectorizer 对此有硬性要求输入地图必须使用WGS84 投影否则先用gdalwarp转换例如gdalwarp -t_srs EPSG:4326 input.tif output.tif这一步是后续所有矢量结果的坐标基础直接决定生成的 Shapefile 能否与真实 GIS 数据对齐。二、map-vectorizer 的整体矢量化流程打开入口脚本 vectorize_map.py可以看到一条清晰的流水线函数process_file阈值化GIMP把彩色地图转成线条黑、背景白的二值图地理配准GDAL读取并写入 WGS84 坐标投影转换GDAL从 EPSG:4326 转到 Web Mercator栅格转矢量gdal_polygonize.py生成粗多边形多边形简化R 脚本 simplify_map.R 用 alpha 形状重建平滑轮廓合并与属性提取计算颜色、圆点、十字标记输出最终 Shapefile 和 GeoJSON。其中第 2、3 步就是 GDAL 地理配准与投影转换的核心所在。三、GDAL地理配准的实现坐标如何写入 GeoTIFF关键代码在 vectorize_map.py 的thresholdize函数中它分两步完成配准。第一步用 gdalinfo 从原始 GeoTIFF 中读出四个角的坐标。代码通过正则表达式解析命令行输出提取左上W, N与右下E, S两点的经纬度geoText subprocess.Popen([gdalinfo, os.path.abspath(inputfile)], stdoutsubprocess.PIPE).communicate()[0] pattern re.compile(rUpper Left\s*\(\s*([0-9\-\.]*),\s*([0-9\-\.]*).*\n.*\n.*\nLower Right\s*\(\s*([0-9\-\.]*),\s*([0-9\-\.]*).*)第二步用 gdal_translate 把坐标写回阈值图生成带地理配准信息的新 GeoTIFFgdal_translate -a_srs projlatlong datumWGS84 -of GTiff \ -co INTERLEAVEPIXEL -a_ullr W N E S thresholdfile outputwsg这里的-a_ullr指定Upper Left / Lower Right左上/右下的地理坐标范围-a_srs声明坐标系为 WGS84 经纬度。至此一张普通 TIFF 就被钉在了真实的地理空间上——这就是最朴素也最可靠的地理配准方式。四、投影转换的实现从经纬度到 Web Mercator配准完成后图像坐标还是经纬度EPSG:4326。但后续的 alpha 形状计算、面积过滤都以米为单位因此 map-vectorizer 用gdalwarp做投影转换转到 Web MercatorEPSG:3785即后来的 EPSG:3857gdalwarp -s_srs EPSG:4326 -t_srs EPSG:3785 -r bilinear outputwsg outputgdal-s_srs/-t_srs指定源与目标坐标系-r bilinear双线性插值重采样让转换后的图像更平滑。转换后的图像中每个像素都对应真实的米坐标面积过滤minarea20、maxarea3000平方米才有意义。五、栅格转矢量gdal_polygonize 生成粗轮廓投影转换完成后polygonize函数调用 GDAL 自带的矢量化工具把二值栅格变成多边形gdal_polygonize.py outputgdal -f ESRI Shapefile shapefile base_name这一步得到的是粗粒度的巨多边形每个色块一个多边形随后 R 脚本会按 50000 个一组切分、用alphahull::ashape重建边界并简化顶点产出平滑的建筑轮廓。六、坐标系的回家之旅质心坐标反算经纬度矢量结果默认在 Web Mercator 下而最终 Shapefile 需要 WGS84 经纬度。consolidate函数里用 OGR 的osr模块完成反向投影转换把每个多边形的质心坐标转回经纬度source_srs osr.SpatialReference(); source_srs.ImportFromEPSG(3785) target_srs osr.SpatialReference(); target_srs.ImportFromEPSG(4326) transform osr.CoordinateTransformation(source_srs, target_srs) centroid.Transform(transform)最后ogr2ogr -s_srs EPSG:3857 -t_srs EPSG:4326生成 GeoJSON输出的字段里除了几何图形还带有CentroidX / CentroidY经纬度质心、Color颜色类别、DotCount / CrossCount圆点与十字标记数量等属性——这些属性由 detect.py 中的 HoughCircles 与模板匹配得到。七、颜色配置与参数调优不同地图的纸张底色、建筑配色差异很大项目通过配置文件 vectorize_config_default.txt 管理参数第一行是亮度/对比度/阈值默认-50,95,160,255第二行起是纸张色与各建筑色的 RGB 值解析逻辑见 vectorize_config_parser.py。调整这些颜色值是让矢量化效果适配自己地图的关键。八、快速上手验证拿到仓库后直接对测试图运行python vectorize_map.py test.tif约 70 秒后会在test/目录生成test-traced.shp / .dbf / .prj / .shx与 GeoJSON。若需要批量处理将输入参数换成文件夹即可再配合bin/consolidator.py合并多个输出。结语map-vectorizer 的巧妙之处在于把读坐标 → 写坐标 → 换投影 → 转矢量 → 算属性封装成一条自动流水线而GDAL 地理配准与投影转换正是这条流水线的地理基座没有它再漂亮的矢量轮廓也只是没有灵魂的画。理解这几个 GDAL 命令的原理你就能举一反三把任何历史地图搬进现代 GIS 世界。【免费下载链接】map-vectorizerAn open-source map vectorizer项目地址: https://gitcode.com/gh_mirrors/ma/map-vectorizer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表