如何智能地降低或平滑GIS数据(简化多边形)?

unm*_*ted 49 gis algorithm geometry postgis

我有详细的美国县地图,来自TIGER LINE数据集.我如何对数据进行采样,平滑或降级,以便我得到更直,更宽松,更少"嘈杂"的形状来表示地理特征 - 在这种情况下只是县界和州界线,但也可能在一般情况下?

如果可以有效地完成采样,则可以在渲染时发生采样,或者可以生成并存储并行数据集.我正在使用PostGIS,并且这些线是由shp2pgsql- 生成的多折线- 但是任何解决方案都是非常有用的,你可以采用波浪线并将其缩小到与人类解释器大致相同的平滑线.

unm*_*ted 62

Douglas-Peucker绝对是正确的方法.在PostGIS和QGIS中有一些简单的方法来访问它的实现,我想我会在这里为那些遇到类似问题的人添加.目标是从这样的事情开始:

替代文字

并最终得到这样的东西:

替代文字

在PostGIS中,Douglas-Peucker实现为simplify,bostongis.org上的语法,是以下的一些变体:

SELECT transform(simplify(transform(the_geom, 2249), 500),4326) from the_geo_table

这甚至在完整的国家数据集上也能很好地工作,其中一些错误似乎是由于底层数据不好造成的.事实证明,在QGIS中,菜单项Tools > Geometry Tools > Simplify Geometries将导出任何几何体的简化shapefile,并将其作为图层添加到当前项目中.

这是一个非常基础的工具集,我问的问题太低了,虽然学习基础数学很好,这里有一个很好的解释:http://www.mappinghacks.com/code/ PolyLineReduction /,以及样本代码,结果证明不是太必要!

  • 尼斯.有没有办法在保持与其他多边形的共同边缘的同时做到这一点?例如欧洲的简化国家,具有共同边界. (5认同)
  • 很酷,但是当它们彼此相邻时如何处理多个多边形?比如当你有不同的邮政编码区域的形状? (2认同)

ire*_*ses 30

简单地丢弃点的问题是你可以快速扭曲原始多边形的形状.更好的方法是从另一个方向来到它; 从多边形的基本近似开始,然后向上精炼到复杂的形状.

Douglas-Puecker算法就是这种方法的一个很好的例子.首先从完整多边形绘制两个顶点.通过选择距离前两个顶点之间绘制的边距最远的顶点来添加第三个顶点.继续添加点,直到您有足够类似于原始多边形的内容.


Car*_*don 20

我建议使用ogr2​​ogr而不是QGIS,因为它不会删除多边形!

ogr2ogr output.shp input.shp -simplify 0.0001
Run Code Online (Sandbox Code Playgroud)

  • 这些单位是简化投影的单位吗?例如,也许是纬度或长度? (3认同)

Wil*_*ill 8

这是一个简单的迭代平滑算法:

对于任何路径上的每三个连续点,如果中间点没有交叉点并且在两个外部点之间的直接路径的某个小阈值角度内,则将其移除.

重复直到满意.


Lar*_*mel 7

您还可以尝试使用Visvalingam的算法,该算法迭代地删除行中最不易察觉的部分.以下是该算法的一个很好的解释:


Ant*_*los 5

您还可以使用Simplify.js,它结合了Douglas-Peucker和径向距离算法。也有许多端口的链接到github 项目中列出的其他语言