使用QGIS简化几何图形工具简化相邻的多边形


10

我有一个有200,000个多边形的大Shapefile,但是对于使用它的应用程序来说,该文件太大了。我想概括这些多边形并创建更小的文件。

我尝试使用“简化几何图形”工具在QGIS中执行此操作。我已经在我的Shapefile的很小一部分上进行了尝试,并且对结果感到满意,但是有一个小问题,我不知道如何解决。我已附加图像以显示问题。

白色边界是简化之前的边界。RED边界经过简化。问题区域用橙色圈出。如您所见,“简化边界”包含一些在简化后不属于任何先前多边形的区域。

如何简化Shapefile并将多边形之间的公共边界保持为一条直线,并消除简化后创建的区域?

QGIS中的简化多边形

附加信息:

在遵循建议的说明之后

  1. 将多边形转换为线
  2. 简化线
  3. 将线转换回多边形

我得到以下结果。它比以前要好一些,但仍然可以得到原始多边形以外的区域(请参见下图中的白色区域)。

@Andrew建议我将每条线与相邻的多边形相关联,但是我不知道如何在QGIS中进行。

在此处输入图片说明

我仍在尝试完成简化多边形的过程。我遵循了这篇文章中建议的说明,当我认为我得到可接受的结果时,又出现了一个问题。以下是我对结果图像所做的摘要。所有步骤均已使用QGIS中的“处理”工具箱执行。

  1. 首先,我将多边形转换为线
  2. 其次,我使用带有break选项的v.clean清理了行。这导致清洁了矢量层和错误层。错误层(提供的图像上的绿点)在每个线的交点处都有绿点。我不知道这是什么意思。
  3. 第三,我使用“ SIMPLIFY GEOMETRY”工具简化了线条(导致图像中出现红线)。比较简化的红线和原始的橙色线,我对结果感到满意。
  4. 第四,我想使用“处理”中的“多边形化”工具将线转换回多边形,并得到了我没有想到的结果(第二个图像带有深橄榄色多边形)。看起来像是多边形生成器连接了错误图层的相交点,并创建了完全不同的多边形集,而忽略了简化线。

有人可以解释这里出了什么问题吗?

为什么红色简化线没有正确转换为简化多边形?

如您所见,我不是GIS专家,但需要自己进行此操作。我不知道我是否离解决方案太远,但是令人沮丧的是,我看到我认为可以接受但无法将其转换为多边形的简化线。

这是两个图像,显示该过程的最后两个步骤的结果:

简化线和原始线

多边形简化线的结果


@nhopton在Polygonizer网页plugins.qgis.org/plugins/Polygonizer上说,它“根据相交线创建多边形”。这表明只要有直线相交就会创建多边形(但也许我的解释是错误的)。我需要的是摆脱那些使用“简化几何图形”工具时创建的间隙,如果Polygonizer可以做到,那么我将非常高兴。
David

考虑一下,您原始的多边形层应该没有问题地简化。如果没有这样做,我认为这可能意味着原始数据中的多边形不良。多边形稍微重叠或它们之间有微小间隙的多边形。尝试放大问题区域,以查看是否可以找到类似的内容。N.
nhopton

保留拓扑的一种好方法是@radouxju建议的工作流程(除了不需要进行质心计算),并在我的回答中的处理模型中表示出来。另外,我认为GRASS v.generalize是另一个不错的选择。希望这可以帮助。
Antonio Falciano 2014年

Answers:


7

使用默认值从“处理工具箱”中使用GRASS v.generalize获得了相当不错的结果:

在此处输入图片说明

某些行保持不变。


按照@Kantan的建议,将v.in.ogr的捕捉容差从-1(无捕捉)设置为0.00001 后,此方法取得了良好的成功。
cm1

4

我遇到了Qgis2.16的问题,但无法让GRASS给出@AndreJ之类的拓扑正确结果。

一个不错的解决方法是在v.generalize.simplify工具的高级参数中更改v.in.ogr捕捉容差。默认值为-1,以防止在GRASS中对齐。

通过在此处放置一个较小的值(例如1e-05 m),可以启用捕捉功能,并且GRASS可以识别多边形的共享边界。然后,简化得到拓扑正确的层,没有孔。

注意:通过将捕捉公差设置为更高的值,甚至可以更改多边形,以便根据需要删除非常细的多边形。使用rmarea和阈值大到足以删除少量剩余物的v.clean进行该操作,到此您就完成了!


3

首先将多边形转换成线

使用v.clean清理拓扑(带有“ break”选项)

然后你简化你的台词

最后,将线转回多边形。(使用多边形)

编辑:要获取多边形的属性,最好的方法是,如果原始数据集中没有多部分多边形,则是获取旧多边形和简化多边形的质心,并根据最近的位置将它们加入(质心应如果只稍微修改边界,就不会移动太多)


1
在我看来,这似乎省略了一些步骤,尽管工作流最终可能会起作用。将多边形转换为线时,可能需要将线与所有相邻的多边形关联。然后,在简化之后,您需要将线变回多部分多边形。如果原始多边形是凸形的,则可以使用质心将原始多边形与简化多边形进行匹配(例如,如果原始多边形的质心包含在简化多边形中,则为匹配项)。如果它们不是凸面的,那将会更加困难。
安迪W

嗨,我遵循了radouxju建议的过程,但是我仍然得到原始多边形超出其原始边界的部分。如何将线与QGIS中的所有相邻多边形关联?我打算在Web应用程序中使用这些多边形,并且需要减少节点数量以加快加载速度。我现在得到的是良好的还原效果,但是经过简化后,我无法摆脱这些小区域。任何解决此问题的想法将不胜感激。
大卫

@大卫。我认为您的问题可能出在第3步(线到多边形)上。在Processing Toolkit中,有一个名为“多边形”的工具,我会尝试一下。我认为这仍需要安装Shapely和Numpy软件包。这就是说,我无法立即在QGIS-Master中使用“多边形化”来为我工作。N.
nhopton 2014年

2

您可以使用以下处理模型(例如SEXTANTE)解决问题:

在此处输入图片说明

脚本版本:

##Simplify polygons=name
##vectorlayer_input=vector
##number_tolerance=number 0.0
##output_layer_alg3=output vector
outputs_0=Processing.runalg("qgis:polygonstolines", vectorlayer_input, None)
outputs_1=Processing.runalg("qgis:simplifygeometries", outputs_0['OUTPUT'], number_tolerance, None)
outputs_2=Processing.runalg("qgis:linestopolygons", outputs_1['OUTPUT'], None)
outputs_3=Processing.runalg("qgis:joinattributestable", outputs_2['OUTPUT'], vectorlayer_input, ID, ID, output_layer_alg3)

注意:唯一的约束是公共字段必须ID在in中Join attributes table,因为它是输出的唯一字段Lines to polygons。这就是为什么公共字段不是模型的变量输入的原因。因此ID,输入多边形图层中的字段必须可用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.