我有详细的美国县地图,来自TIGER LINE数据集。我如何对数据进行采样、平滑或降级,以便获得更直、更四四方方、更少“嘈杂”的形状来表示地理特征——在这种情况下只是县界和州界线,但也许在一般情况下也是如此?
如果可以有效地完成采样,则可以在渲染时进行采样,或者可以生成和存储并行数据集。我正在使用PostGIS,这些线是由生成的多折线shp2pgsql
- 但是任何将波浪线缩小为对人类解释器具有大致相同意义的平滑线的解决方案都将非常有用。
Douglas-Peucker 绝对是正确的方法。有一些简单的方法可以在 PostGIS 和 QGIS 中访问它的实现,我想我会在这里为那些遇到类似问题的人添加这些方法。我们的目标是从这样的事情开始:
最终得到这样的结果:
在 PostGIS Douglas-Peucker 实现为 中,在 bostongis.orgsimplify
上详细介绍的语法是以下的一些变体:
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/,以及事实证明不是太必要的示例代码!
简单地丢弃点的问题是您可以快速扭曲原始多边形的形状。更好的方法是从另一个方向来。从多边形的基本近似开始,然后将其向上细化为您的复杂形状。
这种方法的一个很好的例子是Douglas-Puecker 算法。您从从完整多边形绘制的两个顶点开始。通过选择距离前两个顶点之间绘制的边最远的那个来添加第三个顶点。继续添加点,直到你有足够类似于原始多边形的东西。
我建议使用 ogr2ogr 而不是 QGIS,因为它不会删除多边形!
ogr2ogr output.shp input.shp -simplify 0.0001
这是一个简单的迭代平滑算法:
对于任何路径上的每三个连续点,如果中间点没有交叉点并且在两个外部点之间的直接路径的某个小的阈值角度内,则将其删除。
重复直到满意。
您也可以尝试 Visvalingam 的算法,它会迭代地删除一条线中最不易察觉的部分。这是对该算法的一个很好的解释:
您还可以使用结合了Douglas-Peucker和径向距离算法的Simplify.js 。github项目中还列出了许多其他语言的端口的链接
@unmounted 的回答是正确的,但我想再添加一个建议。
在 PostGIS 中始终使用函数 ST_SimplifyPreserveTopology 而不是 ST_Simplify。两者都使用相同的底层算法(Douglas-Peucker),但前者避免了任何可能导致无效几何的简化。例如,ST_Simplify 可能会产生与自身相交的几何图形。