GIS-Analyse zum Auffinden doppelter Geometrien


9

Ich habe ein großes Shapefile, das alle Gebäude und Häuser der Stadt enthält, in denen ich arbeite (ca. 90.000 Features). Die Daten der Gebäude / Häuser werden von den Vermessungsingenieuren der Stadt gespeichert. Aufgrund der schlechten Praxis und des Zugriffs verschiedener Vermessungsingenieure auf diese Daten wurden viele Gebäude / Häuser zweimal gespeichert und in der Karte als Duplikate angezeigt.

Einige von ihnen sind genau dupliziert (sie erscheinen übereinander), während andere mit einem Leerzeichen zwischen den beiden Objekten dupliziert werden (so wie sich ein Objekt im anderen befindet - siehe den beigefügten Screenshot).

Geben Sie hier die Bildbeschreibung ein

Ich möchte diese Daten bereinigen, damit ich nur die richtigen Gebäude / Häuser in der Stadt habe. Meine Frage lautet also:

Gibt es eine GIS-Analyse oder einen SQL-Ausdruck, den ich ausführen kann, um alle duplizierten Funktionen zu finden (sowohl die genauen als auch die Funktionen, die sich in anderen befinden)? Ich habe sowohl ArcGIS als auch QGIS und bin daher offen für alle Ihre Vorschläge.


Sie können versuchen, das Tool zum Löschen identischer Daten zu erkunden . Es ist jedoch eine Unternehmenslizenzstufe erforderlich. Sie können einige andere im technischen Artikel 36031 verfügbare Optionen überprüfen. Bietet ArcGIS eine Möglichkeit, Features mit doppelten Geometrien zu identifizieren oder zu entfernen ? Am besten ist die Datenprüfererweiterung . Keines dieser Werkzeuge wird jedoch Ihre geteilten Geometrien
ansprechen

Außerdem müssen Sie berücksichtigen, dass die tabellarischen Komponenten im identischen Löschwerkzeug nicht verglichen werden. Ich weiß, dass es keine Antwort ist, aber hoffentlich hilft es bei der Problemlösung.
MDHald

Befinden sich die Daten in einer Datenbank? Welcher Typ?
Russell bei ISC

Eine Option könnte die Verwendung des Schnittwerkzeugs (wie in dieser Antwort beschrieben ) in ArcMap sein, das alle Überlappungsstellen ausgibt. Das würde eine manuelle Überprüfung und Entscheidung erfordern, welches Polygon gelöscht werden soll, aber im Fall von nicht exakten Duplikaten denke ich, dass Sie das trotzdem tun müssten.
Erica

4
Die Verwendung des Begriffs "Duplikat" ist in dieser Frage etwas irreführend. Für den Fall exakter, identischer, gestapelter Kopien handelt es sich um Duplikate (oder könnte dies sein - Attribute können variieren). Wie andere vorgeschlagen haben, kann das Tool "Löschen" oder "Identisch suchen" hilfreich sein, wenn Sie über diese Lizenzstufe verfügen. Aber wenn sie überhaupt versetzt sind oder eine andere Form haben, sind sie an sich keine wirklichen Duplikate. Wenn Sie eine erweiterte Lizenz haben, würde ich mir eine Geodatabase-Topologie ansehen und die Prüfung "Nicht überlappen" ausführen. Ohne Advanced kann vielleicht dasselbe mit QGIS und einem Plugin gemacht werden, wie Luigis Antwort nahe legt.
Chris W

Antworten:


4

In QGIS kann das Topology Checker-Plugin Ihr Problem wahrscheinlich lösen


3
Ich bin damit einverstanden, dass eine Topologie wahrscheinlich die beste Einzellösung für das Problem der Datenbereinigung ist. Möglicherweise möchten Sie Ihre Antwort jedoch ein wenig erweitern, indem Sie einen Link zum Plugin und eine kurze Beschreibung der Topologie oder der Funktion und der von Ihnen ausgeführten Prüfung bereitstellen. Ich befürchte, dass Ihre getippte Antwort wahrscheinlich als minderwertig gekennzeichnet wird.
Chris W

ok: Eine Beschreibung des Plugins finden Sie hier: docs.qgis.org/2.2/en/docs/user_manual/plugins/… und "darf sich nicht überlappen" kann sich dem Problem nähern. Eine Videoanleitung des Plugins finden Sie hier: youtube.com/watch?v=huhkTZkoKC8 .
Luigi Pirelli

6

Ich würde Pythons itertools und einen SearchCursor verwenden , um die räumlichen Beziehungen, nach denen Sie suchen, sehr effizient zu finden. Sie können die inkorporieren Geometrie Methoden overlaps , containsund equalan den Geometrieeigenschaften zu erhalten.

  1. Beginnen Sie mit der Erstellung einer Funktion zur besseren Organisation des Workflows und zur Wiederholbarkeit

    def findOverlaps(x):

  2. Öffnen Sie einen Suchcursor, um die einzelnen Feature-Geometrien zu durchlaufen

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

  3. Verwenden Sie itertools.combinations()diese Option, um Teilsequenzen von Elementen aus der iterierbaren Eingabe zurückzugebencur

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

  4. Greifen Sie auf die Geometrieeigenschaften mit den folgenden Methoden: equals(), overlaps(), und contains(). Diese werden in einer logischen Reihenfolge eingerichtet - Sie können diese bei Bedarf anpassen, um Ihre spezifischen Ziele zu erreichen.

        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. Starte es...

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)

Geben Sie hier die Bildbeschreibung ein

Der Screenshot zeigt eine Vielzahl von Funktionen, die sich überlappen, überlappen und identisch und einzigartig sind.

Geben Sie hier die Bildbeschreibung ein


2

Ich habe eine Idee, was für Sie arbeiten könnte. Es wird auf einigen Annahmen basieren, aber es würde helfen, Ihre Liste möglicher identischer Funktionen einzugrenzen. Dies wäre kein automatisierter Prozess, sondern würde ein manuelles Betrachten der Duplikate erfordern. Basierend auf den Kommentaren scheinen die automatisierten Tools keine Attribute zu vergleichen, sodass Sie Features nicht versehentlich löschen können.

Verwenden von ArcMap

(1) Erstellen Sie eine Kopie Ihres Shapefiles, falls etwas schief gehen sollte.

(2) Fügen Sie Ihrem Shapefile eine Spalte als Double hinzu.

(3) Berechnen Sie die Fläche für jedes Feature mit dem aussagekräftigsten (genauesten) Format, das Sie können. Etwas, bei dem Rundungen möglicherweise kein Problem darstellen.

(4) Führen Sie eine Zusammenfassung (Zusammenfassung) für diese Spalte aus. Stellen Sie sicher, dass Sie in der Zusammenfassung eine eindeutige Kennung auswählen und sowohl die erste als auch die letzte markieren.

(5) Suchen Sie in Ihrer Ausgabetabelle nach den Datensätzen, bei denen das Zählfeld höher als 1 ist.

(6a) Überprüfen Sie die Funktionen manuell und wiederholen Sie den Vorgang, bis keine Duplikate mehr vorhanden sind.

(6b) Sie könnten einfach eine Liste dieser eindeutigen IDs erstellen und die Features über arcpy löschen, aber Sie haben die Möglichkeit, möglicherweise zwei nicht identische Features mit demselben Bereich zu haben.

Eine andere Technik mit ArcPy

Während ich die obige Antwort konstruierte, dachte ich an die Möglichkeit, dass die mehreren Autoren dieser Daten tatsächlich tatsächlich dieselben eindeutigen Kennungen für doppelte Merkmale verwendet haben. WENN dies der Fall ist, können Sie möglicherweise Duplikate durch Schleifen in arcpy finden.

Die Art und Weise, wie ich dies mit ArcPy tun würde, könnte Ihr System belasten und ein wenig dauern.

(1) Erstellen Sie eine Kopie Ihres Shapefiles (falls erneut)

(2) Fügen Sie eine neue Spalte hinzu, um Duplikate zu kennzeichnen. Etwas, das wie ein 'y' oder 'n' oder 0 oder 1 oder was auch immer dauert, würde funktionieren.

(3) Erstellen Sie eine Liste in Python, um die eindeutige Kennung zu speichern.

(4) Führen Sie einen Aktualisierungscursor aus ( arcpy.UpdateCursor('LAYERNAME')). Überprüfen Sie für jeden Datensatz Ihre Liste, um festzustellen, ob sie diesen Bezeichner enthält, und markieren Sie Ihre Spalte für Duplikate, falls vorhanden.

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) Dann können Sie mit diesen markierten Spalten vergleichen oder tun, was Sie wollen.

Es gibt wahrscheinlich bessere Möglichkeiten, diese Vergleiche durchzuführen, aber das sind zwei, von denen ich glaube, dass sie funktionieren oder zumindest den Einstieg erleichtern sollten.

Bearbeiten

Basierend auf dem Kommentar von elrobis können Sie das minimale Begrenzungsrechteck verwenden, um die Wahrscheinlichkeit des Entfernens falscher Features weiter zu verringern.

Mit ArcMap können Sie das Werkzeug Minimale Begrenzungsgeometrie in der Datenverwaltung ausführen . Nach dem Überprüfen der Optionen denke ich, dass die Verwendung der Option CONVEX_HULL wahrscheinlich am besten ist.

Wenn Sie die Felder MBG_APodX / Y1 , MBG_APod_X / Y2 mit MBG_Orientation für Duplikate vergleichen, sollten Sie in der Lage sein, eine gute Vorstellung von doppelten Funktionen zu erhalten. Ich würde vorschlagen, die oben beschriebene Summarize- Methode zum Vergleich zu verwenden. Wählen Sie einen der Eckpunkte (Koordinaten) aus dem Begrenzungsrechteck aus, um Duplikate zu finden. Möglicherweise erhalten Sie einige zufällige "Übereinstimmungen", aber wenn Sie die anderen Scheitelpunkte plus Ausrichtung hinzufügen, ist es ziemlich sicher, dass die Ergebnismerkmale Duplikate sind.

Obwohl ich es nicht verwendet habe und mir der Ergebnisse dieses Tools nicht ganz sicher bin, ist es möglicherweise einfacher, das resultierende Shapefile zu untersuchen, wenn Sie das Tool " Zusammenfassungsstatistik" in ArcMap verwendet haben. Es sieht so aus, als könnten Sie auf diese Weise mehrere Spalten anstelle meiner Option für eine einzelne Spalte zusammenfassen.

Ich glaube nicht, dass es eine vollständig automatisierte Möglichkeit gibt, dies zu tun, ohne die Sorge zu haben, dass eine nicht doppelte Funktion gelöscht werden könnte. Diese Methoden sollten helfen, die Anzahl der Funktionen zu begrenzen, die Sie manuell überprüfen müssten.


Ich gehe davon aus, dass dies Polygone waren. Wenn es sich um Linien handelt, können Sie die Länge verwenden. Punkte sind mit X / Y-Koordinaten am einfachsten.
Branco

2
Ich habe auch über "Flächengleichheitsmerkmale" nachgedacht, aber es scheint mir wahrscheinlich, dass Gebäude-Fußabdrücke genug von den gleichen Formen haben, um unbeabsichtigte Übereinstimmungen zu erzeugen. Ich denke, es würde die Chancen verbessern, die Dinge mit einem MBR-Schnittpunkt der Merkmale weiter zu verfeinern. Das heißt, wenn sie denselben Bereich haben (und möglicherweise dasselbe Merkmal haben) UND sich ihre MBRs überschneiden, ist es wahrscheinlich, dass sie zwei Generationen desselben Merkmals sind. Ist das sinnvoll?
Elrobis

2

Sie können dies in SQL mithilfe eines räumlichen Self-Joins tun. Sie geben nicht an, welchen SQL-Dialekt Sie verwenden. In diesem Beispiel wird Postgres / Postgis verwendet, es kann jedoch problemlos an Oracle oder SQL Server angepasst werden. Angenommen, eine Tabelle namens Gebäude mit Geometrie wird in einer Spalte namens Geom gespeichert:

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

Dadurch werden die Schnittpunkte gefunden. Wenn Sie vollständige Gleichheit wünschen, ersetzen Sie ST_Intersects durch ST_Equals. Oder kombinieren Sie einfach beide:

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;

Beachten Sie, dass a.id <b.id bedeutet, dass Sie nur die Hälfte der Fälle im Self-Join berücksichtigen. Dies macht es a) schneller und b) gibt Ihnen eine Liste, mit der Sie die Hälfte der überlappenden Polygone löschen können, ohne sie alle zu löschen . Dies ist natürlich immer noch ein O (n²) -Algorithmus, aber in der Praxis ist dies viel schneller, wenn Sie einen räumlichen Index haben - was wirklich eine Gesamtanforderung für jeden nicht trivialen Datensatz ist.

Möglicherweise müssen Sie dies ein wenig massieren, um eine Definition von Überlappung zu erhalten. Sie möchten benachbarte Häuser, die schlecht vermessen wurden, nicht löschen.


Wenn Sie ein eindeutiges Attribut im Shapefile vermissen, können Sie a.rowidstattdessen anstelle von verwenden a.id. rowidist ein Schlüsselwort in SQLite, das Ihnen die interne ID des Datasets gibt.
LuWi

1

Das Topology Checker-Plugin ist ein gutes Werkzeug, wenn es richtig verwendet wird. Sie müssen immer noch ein grundlegendes Verständnis Ihrer Daten haben UND die 'Korrekturen' manuell vornehmen. Das Plugin hebt hervor, was es für Fehler hält. Es liegt an Ihnen, jeden einzelnen zu untersuchen und die richtige Entscheidung für Sie und Ihre Daten zu treffen. Mit 90 000 Artikeln in Ihrer Schicht können Sie bis Weihnachten zu Hause sein!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.