ARTICLE DETAIL

资讯详情

深耕网站SEO优化与搜索引擎排名提升的一线实战洞察。

为什么map-vectorizer要用R脚本简化多边形?图论与alpha shape在GIS中的应用

为什么map-vectorizer要用R脚本简化多边形?图论与alpha shape在GIS中的应用 为什么map-vectorizer要用R脚本简化多边形图论与alpha shape在GIS中的应用【免费下载链接】map-vectorizerAn open-source map vectorizer项目地址: https://gitcode.com/gh_mirrors/ma/map-vectorizermap-vectorizer 是一款开源的地图矢量化工具由纽约公共图书馆实验室NYPL Labs开发目标是像 OCR 识别文字那样把 19 世纪的保险地图图册自动转换成带属性的 GIS 多边形图层。然而直接从栅格中提取的多边形又碎又锯齿远达不到 GIS 分析的要求。为此项目专门用 R 脚本simplify_map.R完成多边形简化这一关键环节其中用到的核心技术正是 alpha shape 与图论。本文将以通俗易懂的方式拆解这套 GIS 矢量化流程背后的算法逻辑。map-vectorizer 是什么像 OCR 一样自动读地图NYPL 拥有几百本图册、数万张地图人工提取实在太慢过去协调志愿者花了整整三年才完成 17 万个带属性的多边形而 map-vectorizer 现在只需要约 24 小时就能产出同等规模的数据还能自动抽取形状、颜色、圆点、十字标记等属性。整个处理流水线入口脚本vectorize_map.py分为四步阈值化调用 GIMP 把地图变成线条黑、其余白的二值图粗矢量化用gdal_polygonize.py把栅格转成粗糙的多边形 shapefile多边形简化交给 R 脚本simplify_map.R精修本文主角合并与属性提取合并分块、计算颜色/圆点/十字输出最终 shapefile 与 GeoJSON。上面这张test.tif是项目自带的测试地图来自纽约唐人街附近的街区图册可以清楚看到粉色、黄色、绿色的地块和街道名正是典型的历史地图矢量化输入。粗矢量化后的多边形为什么见不得人栅格转矢量的第一步用的是gdal_polygonize它按像素连通域逐个圈出区域结果往往存在三大问题锯齿严重边界沿像素格走全是 90° 台阶过度细分一个完整地块被噪声切成几十个小碎片带孔洞地块内部的空洞或符号会生成多余的环。如果直接把这样的 shapefile 拿去做 GIS 分析面积、周长、拓扑关系全是错的。所以必须有多边形简化步骤——这正是 R 脚本simplify_map.R的职责也是整个项目最见算法功力的地方。alpha shape用 1000 个采样点还原真实轮廓R 脚本的第一步是对每个粗多边形做点采样再拟合轮廓。代码里设置了numsample1000每个多边形采样 1000 个点采样方式依次尝试hexagonal六边形、regular规则、nonaligned错位、stratified分层直到有一种能成功算出 alpha shape 为止。什么是 alpha shape简单说它是凸包convex hull的推广。凸包只能给出最外层的凸轮廓会把凹进去的街巷全部吞掉而 alpha shape 通过参数alpha脚本里取 2备选 1.6控制贴合程度能贴着凹凹凸凸的真实地块边界走还原街角、巷口等细节。这是地图矢量化中多边形简化最关键的一步也正是 R 包alphahull的强项。图论登场如何把散乱边拼成一个闭环alpha shape 算出来的只是一堆边edge list并不是现成的多边形。此时 R 脚本引入图论用igraph包把边表构造成一张无向图然后用图论手段修复它度数检查一个合法的多边形环每个顶点恰好有 2 条边degree 2。如果存在degree 1的顶点说明有甩出去的毛刺直接用delete.vertices剪掉空洞修复如果图被分成多个连通分量clusters()$no 1说明地块内部有空洞产生了多余环。脚本用decompose.graph拆解后只保留最大的分量最外层轮廓内部空洞自然消失连通性校验用is.connected确认整个图是连通的不满足条件就换一种采样方式重来环路径还原去掉任意一条边后图变成一条链两端顶点度数变为 1再用get.shortest.paths求出两端之间的最短路径就得到完整的边界点序列最后拼成Polygon。这一步把图论修复多边形空洞与毛刺的经典套路展现得淋漓尽致原本又脏又碎的边界在图上做几次度数、连通性操作就被外科手术式地修好了。Douglas-Peucker最后一步减肥边界点序列往往还有成百上千个点直接存成 shapefile 会很臃肿。R 脚本最后调用dp(temp, 0.5)——这是经典的Douglas-Peucker 算法由shapefiles包提供用 0.5 的容差合并近似共线的点在几乎不影响形状的前提下把顶点数量大幅减少输出轻量、平滑的多边形。面积过滤与参数调优minarea 与 maxareasimplify_map.R顶部还有两个关键参数minarea20、maxarea3000单位平方米。小于 20 平方米的多是噪声碎片大于 3000 平方米的多是大块街区都不适合作为建筑地块输出。这套面积过滤 采样容错 图论修复的组合正是让历史地图矢量化结果可直接用于 GIS 分析的关键。完整流程串起来从 test.tif 到最终 shapefile运行python vectorize_map.py test.tif约 70 秒后vectorize_map.py会通过命令行调用 RR --vanilla --silent --slave -f simplify_map.R --args ...每个精简后的多边形会单独写成*-polygon.shp再经过consolidate合并为test-traced.shp并补充颜色、圆点计数、十字标记见map_vectorizer/detect.py基于 OpenCV与质心经纬度等属性。特征检测的效果如下图所示多边形、圆点、属性表一目了然小结为什么是R 脚本回到标题的问题为什么 map-vectorizer 要用 R 脚本做多边形简化答案在于 R 生态里恰好集齐了这套组合拳所需的全部组件——alphahullalpha shape、igraph图论修复、shapefilesDouglas-Peucker 与 shapefile 读写、rgdalOGR 读写而且这些包久经 GIS 社区考验、开箱即用。项目还把整套方法整理成论文map-poly-paper.pdf发表在 ACM SIGSPATIAL 的 MapInteract 13 上并获得最佳论文奖。对于想学习 GIS 多边形简化算法的读者来说这份代码就是最生动的算法教材。️【免费下载链接】map-vectorizerAn open-source map vectorizer项目地址: https://gitcode.com/gh_mirrors/ma/map-vectorizer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表