Mehr

GIS-Analyse, um doppelte Geometrien zu finden

GIS-Analyse, um doppelte Geometrien zu finden


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

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

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

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


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


Ich würde Pythons itertools und einen SearchCursor verwenden, um die gewünschten räumlichen Beziehungen sehr effizient zu finden. Sie können die Geometriemethoden einbindenüberlappt,enthält, undgleichum an die Geometrieeigenschaften zu gelangen.

  1. Beginnen Sie mit der Erstellung einer Funktion zur besseren Organisation des Arbeitsablaufs und für die Wiederholbarkeit

    def findOverlaps(x):

  2. Öffnen Sie einen Suchcursor, um eine einzelne Feature-Geometrie zu durchlaufen

    mit arcpy.da.SearchCursor(x, ['[email protected]', ​​'[email protected]']) als cur:

  3. benutzenitertools.combinations()um Teilfolgen von Elementen aus der Eingabe iterierbar zurückzugebenheilen

    für feature1,feature2 in itertools.combinations(cur, 2):

  4. Greifen Sie mit den folgenden Methoden auf die Geometrieeigenschaften zu:gleich(),überlappt(), undenthält(). Diese sind in einer logischen Reihenfolge aufgebaut – Sie können dies bei Bedarf anpassen, um Ihre spezifischen Ziele zu erreichen.

    if feature1[1].equals(feature2[1]): print "{} entspricht {}".format(feature1[0],feature2[0]) if feature1[1].overlaps(feature2[1]): print "{} überlappt {}".format(feature1[0],feature2[0]) if feature1[1].contains(feature2[1]): print "{} enthält {}".format(feature1[0], Funktion2[0])
  5. Starte es…

Code hier eingebenfindOverlaps(fc)


import itertools, arcpy fc = r'C:path	oyourfc' def findOverlaps(x): with arcpy.da.SearchCursor(x, ['[email protected]', ​​'[email protected]']) as cur: for feature1,feature2 in itertools.combinations(cur, 2): if feature1[1].equals(feature2[1]): print "{} entspricht {}".format(feature1[0],feature2[0]) if feature1 [1].overlaps(feature2[1]): print "{} überlappt {}".format(feature1[0],feature2[0]) if feature1[1].contains(feature2[1]): print "{ } enthält {}".format(feature1[0],feature2[0]) findOverlaps(fc)

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


Sie können dies in SQL mit einem räumlichen Self-Join tun. Sie geben nicht an, welchen SQL-Dialekt Sie verwenden, daher verwendet dieses Beispiel Postgres/Postgis, könnte aber leicht an Oracle oder SQL Server angepasst werden. Angenommen, eine Tabelle namens Gebäude, deren Geometrie in einer Spalte namens geom gespeichert ist:

SELECT a.id, b.id von Gebäuden a, Gebäude 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 beides:

SELECT a.id, b.id von Gebäuden a, Gebäude 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, was es a) schneller macht und b) Ihnen eine Liste gibt, mit der Sie die Hälfte der überlappenden Polygone löschen können, ohne sie alle zu löschen . Natürlich ist dies immer noch ein O(n²)-Algorithmus, aber in der Praxis wird er viel schneller sein, wenn Sie einen räumlichen Index haben – was wirklich eine absolute Voraussetzung für jeden nicht-trivialen Datensatz ist.

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


Ich habe eine Idee, was für Sie funktionieren 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 eine manuelle Überprüfung der Duplikate erfordern. Basierend auf den Kommentaren scheint es, als würden die automatisierten Tools keine Attribute vergleichen, damit Sie nicht versehentlich Funktionen löschen können.

Verwenden von ArcMap

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

(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 Runden kein Problem darstellt.

(4) Führen Sie eine Zusammenfassung (Zusammenfassung) für diese Spalte aus. Stellen Sie sicher, dass Sie in der Zusammenfassung einen eindeutigen Bezeichner auswählen und sowohl den ersten als auch den letzten markieren.

(5) Suchen Sie in Ihrer Ausgabetabelle nach den Datensätzen, bei denen die zählen Feld ist höher als 1.

(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, dass möglicherweise zwei nicht identische Features mit derselben Fläche vorhanden sind.

Eine andere Technik mit ArcPy

Als ich die obige Antwort erstellte, dachte ich an die Möglichkeit, dass die mehreren Autoren dieser Daten möglicherweise tatsächlich dieselben eindeutigen Bezeichner für duplizierte Funktionen verwendet haben. WENN 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) Machen Sie eine Kopie Ihres Shapefiles (für den Fall wieder)

(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 funktioniert, würde funktionieren.

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

(4) Führen Sie einen Update-Cursor aus (arcpy.UpdateCursor('LAYERNAME')). Überprüfen Sie für jeden Datensatz Ihre Liste, um zu sehen, ob sie diesen Bezeichner enthält, und markieren Sie Ihre Spalte auf Duplikate, wenn sie vorhanden ist.

myList = [] rows = arcpy.UpdateCursor("layername") für Zeile in Zeilen: if str(row.UniqueIdentifier) ​​in myList: #value duplizierte Zeile.DuplicateColumnName = "y" else: #not there, add 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 anzustellen, aber das sind zwei, die meiner Meinung nach funktionieren oder Ihnen 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 die Minimale Begrenzungsgeometrie Werkzeug im Datenmanagement. Nachdem ich die Optionen überprüft habe, denke ich, dass ich die CONVEX_HULL Option wäre wahrscheinlich am besten.

Wenn du die vergleichst MBG_APodX/Y1, MBG_APod_X/Y2 Felder zusammen mit MBG_Orientierung Bei Duplikaten sollten Sie sich ein gutes Bild von duplizierten Features machen können. Ich würde vorschlagen, die zu verwenden Zusammenfassen Methode, die ich oben beschrieben habe, um zu vergleichen. Wählen Sie einen der Scheitelpunkte (Koordinaten) aus dem umgebenden Rechteck aus, um Duplikate zu finden. Sie können ein paar zufällige "Übereinstimmungen" erhalten, aber sobald Sie die anderen Scheitelpunkte plus Ausrichtung hinzufügen, ist es eine ziemlich sichere Wette, dass die Ergebnismerkmale Duplikate sind.

Obwohl ich es noch nicht verwendet habe und mir der Ergebnisse dieses Werkzeugs nicht ganz sicher bin, fällt es Ihnen möglicherweise leichter, das resultierende Shapefile zu untersuchen, wenn Sie das Werkzeug Summary Statistics in ArcMap verwenden. Es sieht so aus, als ob Sie auf diese Weise mehrere Spalten zusammenfassen können, anstatt meiner Einzelspaltenoption.

Ich glaube nicht, dass es einen vollständig automatisierten Weg geben würde, dies zu tun, ohne sich Sorgen machen zu müssen, dass ein nicht dupliziertes Feature gelöscht werden könnte. Diese Methoden sollten jedoch dazu beitragen, die Anzahl der Funktionen zu begrenzen, die Sie manuell überprüfen müssen.


Das Topology Checker-Plugin ist ein gutes Werkzeug, wenn es richtig verwendet wird. Sie müssen noch ein grundlegendes Verständnis Ihrer Daten haben UND die 'Korrekturen' manuell vornehmen. Das Plugin wird hervorheben, was es für Fehler hält. Es liegt an Ihnen, diese jeweils zu prüfen und die für Sie und Ihre Daten passende Entscheidung zu treffen. Mit 90.000 Artikeln in Ihrem Layer können Sie bis Weihnachten zu Hause sein!


Schau das Video: 7 wichtige GIS-Analysen in ArcGIS Online - Tool 5: Positionen suchen