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

时间:2009-12-04 21:59:45

标签: algorithm geometry gis postgis

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

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

7 个答案:

答案 0 :(得分:61)

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

alt text

并最终得到类似的结果:

alt text

在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/,以及示例代码结果证明不是太必要了!

答案 1 :(得分:30)

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

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

答案 2 :(得分:19)

我建议使用ogr2​​ogr而不是QGIS,因为它does not delete polygons

ogr2ogr output.shp input.shp -simplify 0.0001

答案 3 :(得分:8)

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

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

重复直到满意为止。

答案 4 :(得分:7)

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

答案 5 :(得分:4)

您还可以使用Simplify.js,它使用Douglas-Peucker和径向距离算法的组合。还有许多端口链接到github project

上列出的其他语言

答案 6 :(得分:0)

@unmount的答案是正确的,但我想再添加一个建议。

始终使用函数ST_SimplifyPreserveTopology代替PostGIS中的ST_Simplify。两者都使用相同的基础算法(Douglas-Peucker),但是前者避免了任何简化操作,这些简化操作都会导致无效的几何形状。例如,ST_Simplify可能会导致自身相交的几何。