GIS分析以查找重复的几何


9

我有一个很大的shapefile,其中包含我工作所在的城镇的所有建筑物和房屋(约90,000个要素)。建筑物/房屋的数据由镇的测量工程师保存,并且由于不当做法以及不同测量师对数据的访问,许多建筑物/房屋已被保存两次并在地图上显示为重复项。

其中一些是完全重复的(它们一个出现在另一个之上),而另一些则是在两个对象之间留有间隔的(例如,一个对象在另一个对象内部,请参见所附的屏幕截图)。

在此处输入图片说明

我想清理这些数据,以便在城镇中只有正确的建筑物/房屋,所以我的问题是:

我是否可以运行任何GIS分析或SQL表达式来查找所有重复的功能(确切的功能和位于其他功能内的功能)?我同时拥有ArcGIS和QGIS,因此欢迎您提出所有建议。


您可以尝试探索“ 删除相同工具”。但是,它需要企业许可证级别。您可以查看技术文章36031中可用的其他一些选项。ArcGIS是否提供一种方法来识别或删除具有重复几何图形要素,最好的选择是Data Reviewer Extenstion。这些工具都无法解决您的几何拆分问题
MDHald 2014年

同样,您将不得不考虑不会在删除相同工具中比较表格组件。我知道这不是答案,但希望它能帮助解决问题。
MDHald 2014年

数据在数据库中吗?哪一种
罗素在ISC 2014年

一种选择是在ArcMap中使用“相交工具”(如本答案所述),该工具将输出任何重叠位置。这将需要手动检查并确定要删除的多边形,但是对于不完全相同的副本,我认为您仍然需要这样做。
埃里卡(Erica)2014年

4
在这个问题上,术语“重复”的使用有点误导。对于完全相同,堆叠的副本,是的,它们是(或可能是-属性可能有所不同)重复项,并且正如其他人建议的那样,如果您具有该许可证级别,则“删除或查找相同”工具可能会有所帮助。但是,如果它们完全偏移或形状不同,则它们本身并不是真正的重复项。如果您拥有高级许可证,我将查看地理数据库拓扑,并运行“不得重叠”检查。如果没有Advanced,QGIS和一个插件可能可以完成同样的工作,就像Luigi的答案所暗示的那样。
克里斯·W

Answers:


4

在QGIS中,拓扑检查器插件可以正确解决您的问题


3
我同意拓扑可能是清除数据问题的最佳单一解决方案。但是,您可能希望通过提供插件的链接以及关于拓扑是什么或做什么以及将要运行的检查的简短描述来扩大回答范围。我担心您输入的答案可能会被标记为低质量。
克里斯·W

好的:插件的描述在这里:docs.qgis.org/2.2/en/docs/user_manual/plugins/…和“必须不重叠”可以解决这个问题。该插件的视频指南位于:youtube.com/watch?v=huhkTZkoKC8
路易吉·皮雷利

6

我将使用Python的itertoolsSearchCursor获得一种非常有效的方式来找到您想要的空间关系。您可以并入几何方法 overlapscontainsequal获得几何属性。

  1. 首先创建一个功能以更好地组织工作流程并提高可重复性

    def findOverlaps(x):

  2. 打开搜索光标以遍历各个要素几何

    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:

  3. 用于itertools.combinations()从可迭代输入中返回元素的子序列cur

    for feature1,feature2 in itertools.combinations(cur, 2):

  4. 用下面的方法访问几何属性: equals()overlaps(),和contains()。这些设置是按照逻辑顺序进行的-如果需要,您可以对此进行调整以满足特定的目标。

        if feature1[1].equals(feature2[1]):
            print "{} equals {}".format(feature1[0],feature2[0])
        if feature1[1].overlaps(feature2[1]):
            print "{} overlaps {}".format(feature1[0],feature2[0])
        if feature1[1].contains(feature2[1]):
            print "{} contains {}".format(feature1[0],feature2[0])
    
  5. 运行...

enter code herefindOverlaps(fc)


import itertools, arcpy

fc = r'C:\path\to\your\fc'

def findOverlaps(x):
    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:
        for feature1,feature2 in itertools.combinations(cur, 2):
            if feature1[1].equals(feature2[1]):
                print "{} equals {}".format(feature1[0],feature2[0])
            if feature1[1].overlaps(feature2[1]):
                print "{} overlaps {}".format(feature1[0],feature2[0])
            if feature1[1].contains(feature2[1]):
                print "{} contains {}".format(feature1[0],feature2[0])

findOverlaps(fc)

在此处输入图片说明

屏幕快照显示了重叠,重叠和相同且唯一的各种功能。

在此处输入图片说明


2

我知道什么可能对您有用。它将基于一些假设,但这将有助于缩小可能的相同功能的列表。这不是一个自动化的过程,但需要手动查看重复项。根据注释,自动化工具似乎无法比较属性,因此这将帮助您避免意外删除功能。

使用ArcMap

(1)制作shapefile的副本,以防出现问题。

(2)将一列添加为您的shapefile。

(3)使用最描述(最精确)的格式计算每个特征的面积。四舍五入可能不是问题。

(4)在该列上运行摘要(汇总)。确保在摘要中选择一个唯一的标识符,并标记第一和最后。

(5)在输出表中,查找计数字段大于1的那些记录。

(6a)手动检查功能并重复该过程,直到不再有重复为止。

(6b)您可以仅创建这些唯一ID的列表,然后通过arcpy删除要素,但是您可能会在同一区域拥有两个不相同的要素。

使用ArcPy的另一种技术

当我构造以上答案时,我想到了这样一种可能性,即该数据的多个作者实际上可能对重复的特征使用了相同的唯一标识符。 如果是这种情况,则可以通过在arcpy中循环来找到重复项。

我考虑使用ArcPy进行此操作的方式可能会加重您的系统负担,并且会花费一些时间。

(1)复制您的shapefile(以防万一)

(2)添加新列以表示重复项。诸如“ y”或“ n”或0或1之类的东西会起作用。

(3)在python中创建一个列表以存储唯一标识符。

(4)运行更新光标(arcpy.UpdateCursor('LAYERNAME'))。对于每条记录,请检查您的列表以查看其是否包含该标识符,并在该列中将其标记为重复项。

myList = []
rows = arcpy.UpdateCursor("layername")
for row in rows:
  if str(row.UniqueIdentifier) in myList:
    #value duplicated
    row.DuplicateColumnName = "y"
  else:
    #not there, add it
    myList.append(row.UniqueIdentifier)
  rows.updateRow(row)

(5)然后,您可以对标记的列进行比较或执行任何所需的操作。

进行这些比较可能有更好的方法,但是我认为这应该是可行的,或者至少可以帮助您入门。

编辑

根据elrobis的注释,您可以利用最小边界矩形进一步减少删除不正确特征的机会。

使用ArcMap,可以运行“ 数据管理”中的“ 最小边界几何”工具。在检查了选项之后,我认为使用CONVEX_HULL选项可能是最好的。

如果将MBG_APodX / Y1MBG_APod_X / Y2字段与MBG_Orientation进行重复比较,则应该能够很好地了解重复功能。我建议使用上面介绍的“ 汇总”方法进行比较。从边界矩形中选择一个顶点(坐标)以查找重复项。您可能会得到一些偶然的“匹配”,但是一旦添加了其他顶点加方向,就可以肯定地确信结果要素是重复的。

尽管我还没有使用过它,也不太确定该工具的结果,但是如果使用ArcMap中的“ 摘要统计”工具,您可能会发现检查生成的shapefile更容易。看起来您可以用这种方式汇总多个列,而不是我的单个列选项。

我认为不会有一种完全自动化的方法来执行此操作,而不必担心会删除不重复的功能。这些方法应有助于限制您需要手动查看的功能数量。


我假设这些是多边形。如果它们是线,则可以使用长度。X / Y坐标最简单。
Branco 2014年

2
我也考虑过“等面积特征​​”,但让我感到惊讶的是,bldg足迹可能具有足够多的相同类型的形状来创建意外的匹配。我认为,通过特征的MBR交集进一步完善事物会增加几率。也就是说,如果它们具有相同的面积(并且可能具有相同的特征)并且它们的MBR相交,则可能它们是同一特征的两代。那有意义吗?
elrobis 2014年

2

您可以使用空间自连接在SQL中执行此操作。您没有说明使用的是哪种SQL方言,因此本示例使用Postgres / Postgis,但可以轻松地将其适应Oracle或SQL Server。假设有一个名为buildings的表,其几何存储在名为geom的列中:

SELECT a.id, b.id from buildings a, buildings b WHERE 
  ST_INTERSECTS(a.geom, b.geom) AND a.id < b.id;

这将发现相交。如果要完全相等,则将ST_Intersects替换为ST_Equals。或者,将两者结合起来:

SELECT a.id, b.id from buildings a, buildings b WHERE 
   (ST_INTERSECTS(a.geom, b.geom) OR ST_EQUALS(a.geom, b.geom)) 
   AND a.id < b.id;

请注意,a.id <b.id意味着您仅考虑自连接中一半的情况,这使其a)速度更快,并且b)提供了一个列表,您可以使用该列表删除一半重叠的多边形而不删除所有重叠多边形。显然,这仍然是O(n²)算法,但是在实践中,如果您有适当的空间索引,它将更快得多-这实际上是任何非平凡数据集的总要求。

您可能需要稍微按摩一下以适应重叠的定义-您不想删除经过严重调查的邻近房屋。


如果您在shapefile中缺少唯一属性,则可以使用a.rowid代替a.idrowid是SQLite中的关键字,它将为您提供数据集的内部ID。
LuWi

1

如果使用正确,Topology Checker插件是一个很好的工具。您仍然必须对数据有基本的了解,并且必须手动进行“更正”。该插件将突出显示其认为是错误的内容。然后由您自己检查每个数据,并为您和您的数据做出适当的决定。图层中有9万个项目,您可能在圣诞节回家!

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.