代码之家  ›  专栏  ›  技术社区  ›  unmounted

如何智能降级或平滑地理信息系统数据(简化多边形)?

  •  49
  • unmounted  · 技术社区  · 15 年前

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

    如果可以有效地完成采样,或者可以生成和存储并行数据集,那么采样可能在渲染时发生。我正在使用 PostGIS ,线条是由 shp2pgsql --但是,任何一种解决方案,如果你把一条弯弯曲曲的线简化成一条对人类口译员来说大致相同的平滑线,都是非常有用的。

    7 回复  |  直到 6 年前
        1
  •  30
  •   ire_and_curses    15 年前

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

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

        2
  •  61
  •   Community CDub    8 年前

    道格拉斯·佩克绝对是正确的方法。有一些简单的方法可以访问Postgis和Qgis中的IT实现,我想在这里为遇到类似问题的人添加这些方法。目标是从这样的事情开始:

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

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

        3
  •  19
  •   Carlos Rendon    11 年前

    我建议使用ogr2ogr而不是qgis,因为它 does not delete polygons !

    ogr2ogr output.shp input.shp -simplify 0.0001
    
        4
  •  8
  •   Will    15 年前

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

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

    重复直到满意为止。

        5
  •  7
  •   Lars Grammel    12 年前

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

        6
  •  4
  •   Anthony Hatzopoulos    11 年前

    你也可以用 Simplify.js 它结合了 Douglas-Peucker 以及径向距离算法。也有到上列出的其他语言的多个端口的链接。 github project

        7
  •  0
  •   Rauni Lillemets    6 年前

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

    在postgis中始终使用函数st-simplifypreservetopology而不是st-simply。两者都使用相同的底层算法(Douglas Peucker),但前者避免了任何可能导致无效几何的简化。例如,st_Simplify可能导致几何体与自身相交。