如何智能地降解或平滑GIS数据(简化多边形)?
我有详细的美国县地图,从TIGER LINE数据集。 我怎样才能对数据进行采样,平滑或降级,这样我就可以得到更直观,更方便,更“嘈杂”的形状来代表地理特征 – 在这种情况下,只是县界限和州界线,但也可能在一般情况下?
如果可以高效地完成抽样,则抽样可能发生,或者可以生成并存储并行数据集。 我使用的是PostGIS ,而这些行是由shp2pgsql
生成的多重多段线,但是任何解决方法都是使用一条波浪线,并将其减less到与人类解释程序大致相同的平滑线,这将非常有用。
简单地扔掉点的问题是,你可以很快扭曲原来的多边形的形状。 更好的方法是从另一个方向来看待它。 从多边形的基本近似开始,然后朝向复杂的形状向上细化。
这种方法的一个很好的例子是Douglas-Pueckeralgorithm 。 您从两个顶点开始,从完整的多边形绘制。 通过select距前两个顶点之间绘制的边距最远的顶点来添加第三个顶点。 继续添加点直到您有一些足够类似于您的原始多边形的东西。
道格拉斯 – 皮克绝对是正确的做法。 有一些简单的方法可以在PostGIS和QGIS中访问它的实现,我想我会在这里为那些遇到这个post的人添加一个类似的问题。 目标是从这样的事情开始:
并最终得到这样的东西:
在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
将导出任何几何体的简化形状文件,并将其作为图层添加到当前项目中。
这是一个非常基本的工具集,我问这个问题的级别太低了,虽然学习底层math很好,但是这里有一个很好的解释:http://www.mappinghacks.com/code/ PolyLineReduction / ,以及示例代码,结果不是太必要!
而不是QGIS,我build议使用ogr2ogr,因为它不会删除多边形 !
ogr2ogr output.shp input.shp -simplify 0.0001
这里有一个简单的迭代平滑algorithm:
对于任何path上的每三个连续的点,如果中间点没有交点,并且在两个外点之间的直接path的一些小的阈值angular内,则将其去除。
重复,直到满意。
你也可以尝试Visvalingam的algorithm,迭代地去除线条中最不可感知的部分。 这是对该algorithm的一个很好的解释:
您也可以使用Simplify.js ,它使用Douglas-Peucker和Radial Distancealgorithm的组合。 也有许多端口链接到github项目上列出的其他语言