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

问题描述 投票:0回答:7

我有来自 TIGER LINE 数据集的详细美国县地图。我如何对数据进行采样、平滑或降级,以便获得更直、更四四方方、更少“噪音”的形状来表示地理特征——在本例中只是县边界和州界线,但也许在一般情况下也是如此?

如果可以有效地完成采样,则可以在渲染时进行采样,或者可以生成并存储并行数据集。我正在使用 PostGIS,这些线条是由

shp2pgsql
生成的多段线——但是任何将一条波浪线简化为对人类解释器具有大致相同意义的平滑线的解决方案都将非常有用.

algorithm geometry gis postgis
7个回答
64
投票

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

alt text

最终得到这样的结果:

alt text

在 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
将导出任何几何图形的简化形状文件,并将其作为图层添加到当前项目中。

这是一个非常基本的工具集,我在太低的水平上提出了这个问题,尽管学习底层数学很好,但这里有一个很好的解释:http://www.mappinghacks.com/ code/PolyLineReduction/,以及示例代码,事实证明并不是太必要!


31
投票
简单地丢弃点的问题是你可以快速扭曲原始多边形的形状。更好的方法是从另一个方向来解决这个问题。从多边形的基本近似开始,然后将其向上细化为复杂的形状。

这种方法的一个很好的例子是

Douglas-Puecker 算法。您从从完整多边形绘制的两个顶点开始。通过选择距前两个顶点之间绘制的边最远的顶点来添加第三个顶点。继续添加点,直到得到与原始多边形足够相似的点。


26
投票
我建议使用ogr2ogr代替QGIS,因为它

不会删除多边形

ogr2ogr output.shp input.shp -simplify 0.0001
    

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

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

重复直到满意为止。


8
投票
您还可以尝试 Visvalingam 算法,该算法会迭代删除线条中最不易察觉的部分。这是该算法的一个很好的解释:

  • http://bost.ocks.org/mike/simplify/

5
投票
您还可以使用

Simplify.js,它结合了 Douglas-Peucker 和径向距离算法。还有指向 github 项目 上列出的其他语言的许多端口的链接


2
投票
@unmounted 的回答是正确的,但我想再补充一个建议。

在 PostGIS 中始终使用函数 ST_SimplifyPreserveTopology 而不是 ST_Simplify。两者都使用相同的基础算法(Douglas-Peucker),但前者避免了任何会导致无效几何图形的简化。例如,ST_Simplify 可能会导致几何体与自身相交。

© www.soinside.com 2019 - 2024. All rights reserved.