如何智能降级或平滑 GIS 数据(简化多边形)?
Posted
技术标签:
【中文标题】如何智能降级或平滑 GIS 数据(简化多边形)?【英文标题】:How to intelligently degrade or smooth GIS data (simplifying polygons)? 【发布时间】:2010-12-23 10:10:41 【问题描述】:我有来自TIGER LINE 数据集的详细美国县地图。我如何对数据进行采样、平滑或降级,以便获得更直、更四四方方、更少“嘈杂”的形状来表示地理特征——在这种情况下只是县界和州界线,但也许在一般情况下也是如此?
如果可以有效地完成采样,则可以在渲染时进行采样,或者可以生成和存储并行数据集。我正在使用PostGIS,这些线是由shp2pgsql
生成的多段线——但任何解决方案,如果你采用波浪线并将其缩减为对人类解释器具有大致相同意义的更平滑的线,将非常有用.
【问题讨论】:
【参考方案1】:@unmounted 的回答是正确的,但我想再补充一个建议。
在 PostGIS 中始终使用函数 ST_SimplifyPreserveTopology 而不是 ST_Simplify。两者都使用相同的底层算法(Douglas-Peucker),但前者避免了任何会导致无效几何的简化。例如,ST_Simplify 可能会导致几何与自身相交。
【讨论】:
【参考方案2】:您还可以使用Simplify.js,它结合了Douglas-Peucker 和径向距离算法。 github project 上列出的许多其他语言的端口也有链接
【讨论】:
【参考方案3】:我建议使用 ogr2ogr 而不是 QGIS,因为它does not delete polygons!
ogr2ogr output.shp input.shp -simplify 0.0001
【讨论】:
简化的单位是投影的单位吗?例如,也许那些是纬度或经度? 看来单位确实是文件中坐标的单位。 改用 ST_SimplifyPreserveTopology。它使用与 ST_Simplify (Douglas-Pecker) 相同的算法,但保证不会产生无效的几何图形。【参考方案4】:您也可以尝试 Visvalingam 的算法,该算法迭代地删除一条线中最不易察觉的部分。这是对该算法的一个很好的解释:
http://bost.ocks.org/mike/simplify/【讨论】:
【参考方案5】:Douglas-Peucker 绝对是正确的方法。有一些简单的方法可以在 PostGIS 和 QGIS 中访问它的实现,我想我会在这里为那些遇到类似问题的人添加这些方法。我们的目标是从这样的事情开始:
最终得到这样的结果:
在 PostGIS 中,Douglas-Peucker 被实现为 simplify
,语法,详细的 here at bostongis.org,是以下的一些变体:
SELECT transform(simplify(transform(the_geom, 2249), 500),4326) from the_geo_table
即使在完整的国家数据集上,这也能很好地工作,有一些错误似乎是由于基础数据不佳造成的。事实证明,在 QGIS 中,菜单项 Tools > Geometry Tools > Simplify Geometries
将导出任何几何图形的简化 shapefile,并将其作为图层添加到您当前的项目中。
这是一个非常基本的工具集,我问的问题太低了,虽然学习底层数学很好,但有一个很好的解释 here: http://www.mappinghacks.com/code/PolyLineReduction/,以及结果示例代码不要太需要!
【讨论】:
不错。有没有办法在保持与其他多边形的共同边缘的同时做到这一点?例如欧洲的简化国家,有共同的边界。 其他多边形泛化选项与 QGIS 在姐妹 GIS-SE 站点上的How to smooth/generalize a polygon in qgis。 很酷,但是当它们相邻时如何处理多个多边形?比如你有不同邮政编码区域的形状? 在 QGIS 2.14.1-Essen 中:处理 > 工具箱 > QGIS 地理算法 > 矢量几何工具 > 简化几何 只是为了更新版本的 PostGIS 函数简化将名称更改为 st_simplify。与变换相同。【参考方案6】:简单地丢弃点的问题是您可以快速扭曲原始多边形的形状。更好的方法是从另一个方向来。从多边形的基本近似开始,然后将其向上细化为您的复杂形状。
这种方法的一个很好的例子是Douglas-Puecker algorithm。您从从完整多边形绘制的两个顶点开始。通过选择距离前两个顶点之间绘制的边最远的顶点来添加第三个顶点。继续添加点,直到得到与原始多边形足够相似的东西。
【讨论】:
【参考方案7】:这是一个简单的迭代平滑算法:
对于任何路径上的每三个连续点,如果中间点没有交点并且在两个外部点之间的直接路径的某个小的阈值角度内,则将其删除。
重复直到满意为止。
【讨论】:
以上是关于如何智能降级或平滑 GIS 数据(简化多边形)?的主要内容,如果未能解决你的问题,请参考以下文章