在公差范围内溶解QGIS(GEOS)中的多边形


11

我有一个多边形矢量层,代表洪水淹没的区域。该层的制作方式使得某些区域由多个较小的接触多边形组成(请参见下面的屏幕快照,标记为“原始数据”)。

我想溶解它们接触的多边形。如果我在使用GEOS库的QGIS fTools中使用了溶解地理处理工具,则会得到一些意外的结果(请参阅“使用QGIS fTools溶解”)。似乎在这些问题中提到,GEOS并没有使用阈值来确定多边形是否在接触:

http://trac.osgeo.org/qgis/ticket/3126

http://trac.osgeo.org/qgis/ticket/3184

http://hub.qgis.org/issues/2806

在ArcGIS中,相同的方法可以提供预期的结果(请参阅“使用ArcGIS 10.1分解”)。

显然,这是GEOS的“功能”,而不是错误。有什么办法可以修复我必须产生预期结果的数据?对我来说,轻微的精度损失(几厘米?)是可以接受的。理想情况下,解决方案是可以将其写入QGIS插件中,作为预处理步骤。

相关问题(无答案):如何在QGIS中设置地理处理工具的公差值?

以shapefile链接到示例数据:https : //www.dropbox.com/s/c8ns7wwfv289ad0/sample.zip

溶解多边形 v。溶解


一种解决方法是先增大然后缩小fTools溶解的多边形(方法是先用正缓冲区缓冲,然后用负缓冲区缓冲)。
杰克

我确实尝试过此方法,但最终遇到其他问题(例如i.stack.imgur.com/LnFJy.png)。在这里,我在不应该缓冲/溶解/负缓冲时创建了蓝色区域。这并没有比原来的问题好太多了。我看不到如何恢复原始的“尖锐”角落。
Snorfalorpagus

Answers:


14

在这种情况下,您似乎需要通过首先修复拓扑来帮助溶解工具。这是您在GRASS中执行此操作的方法。

加载shapefile时,GRASS会看到它:

每个十字标记一个区域。您会看到边界线上有一些十字:这些是由边界线之间的微小偏移引起的条形多边形。

  1. 删除由真实多边形之间的间隙形成的条形多边形:

    v.clean input=sample output=tempA --o tool=rmarea thresh=0.001
  2. 捕捉边界线:

    v.clean input=tempA output=tempB --o tool=snap thresh=0.001
  3. 在新的相交处断开边界线:

    v.clean input=tempB output=tempA --o tool=break thresh=0.001
  4. 删除现在重复的边界线:

    v.clean input=tempA output=tempB --o tool=rmdupl thresh=0.001
  5. 溶解多边形

    v.dissolve input=tempB output=cleaned --o column=ID

等等:


谢谢@杰克。这是一个非常明确的答案。不幸的是,当我尝试将该过程应用于整个数据集(覆盖2500 km2)时,从捕捉工具收到错误消息“错误:G_realloc:无法在snap.c:186分配144720024字节的内存”。我想我将不得不将其分解为较小的块。不过应该没关系,因为我已经将其分解为0.25 km2的正方形,以加快交点/空间索引编制(这是示例数据中的“ ID”字段)。
Snorfalorpagus

7

使用GRASS GIS命令v.dissolve(在Sextante插件-> GRASS命令->矢量中)

如果我快速重现您的示例: 在此处输入图片说明

v.dissolve的结果:

在此处输入图片说明

说明

这个问题很容易理解。shapefile没有拓扑,如果两个区域共享一个公共边界,则该边界将被数字化两次,并且也将重复存储。

当您尝试编辑shapefile时,您会清楚地看到以下内容:

在此处输入图片说明

GRASS GIS(作为ArcGIS)是一种拓扑gis。在GRASS中导入shapefile时,结果层具有拓扑结构:两个区域之间的公共边界存在一次并被共享。

在此处输入图片说明

因此,当您要分解shapefile(分解两个边界)时,可能会遇到问题(在QGIS,GvSIG,OpenJUMP或旧的ArcView 3.x中),请参阅ArcUserI:Understanding Topology和Shapefiles

在GRASS中,v.dissolve旨在消除具有相同类别编号的区域之间的公共边界


1
我的猜测是这是一个数值问题,我想知道您的OP几何图形的良好副本是否会捕获相同的数值属性?
2013年

@Chau:v.dissolve具有公差参数,用于解决OP的问题。
杰克

该细节应纳入上述答案,谢谢您的澄清:)
Chau

我在问题中添加了到原始数据的链接作为shapefile。当我使用v.dissolve它时,它确实可以工作,除了它可以“填充”要素中间的小方块。i.stack.imgur.com/AA59l.png
Snorfalorpagus

1
我提出一个解释
基因
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.