Überlappende Polygone aus einem Shapefile mit ArcGIS Desktop zählen?

10

Ich habe ein Shapefile mit 16.400 Polygonen. Jedes Polygon zeigt die Ausdehnung einer Vogelart für die ganze Welt.

Geben Sie hier die Bildbeschreibung ein

Jetzt muss ich die überlappenden Polygone zählen. Ich habe es mit Vereinigung versucht und aufgelöst (zähle die Vereinigung), aber die Vereinigung funktioniert nicht für so viele Polygone.

Dann habe ich versucht, Kontinente zu beschneiden, aber das funktioniert auch wegen der großen Anzahl von Polygonen nicht. Außerdem habe ich diese Methode auch ohne Erfolg ausprobiert .

Deshalb frage ich Sie, ob es eine Möglichkeit gibt, überlappende Polygone zu zählen, wenn sich 16400 Polygone in einem Shapefile befinden.

Ich arbeite mit 10.0 und kann mit 10.2 arbeiten. Eine ArcPy-Lösung ist auch wunderbar.

Im Moment denke ich darüber nach, ein Fischnetz zu erstellen und mit den 16400 Polygonen über die Zeilen des shp zu iterieren und 1 in ein Wertefeld einer Fischnetzzelle zu schreiben, wenn sich das Polygon in dieser Zelle befindet, und dann die nächste Zeile (Polygon) und zu nehmen wenn dies auch in der Fischnetzzellenzahl +1 ist.

Aber ich weiß nicht, ob dies eine gute Lösung ist und wie ich sie realisieren kann. Oder ich muss R lernen, um diesen Ansatz zu verwenden.

Das Ergebnis: Es sollte eine Form sein, in der Sie neue Polygone aus den überlappenden haben, und ein Feld, in dem die Überlappungen gezählt werden.

Am Ende sollte es also ein Shapefile geben, in dem Sie sehen können, wie viele Vogelarten am selben Ort gefunden werden.

Nora
quelle
Ihr Problem ist aufgrund der Größe Ihres Datensatzes ein Problem. Die Antworten (und der von Ihnen vorgeschlagene Link) sind korrekt, aber Sie haben Speicherprobleme. Vielleicht könnten Sie zuerst versuchen, Ihre Daten mit einigen hundert Metern (basierend auf der erwarteten Genauigkeit) zu integrieren, um die Bildung von Milliarden von Splitterpolygonen zu vermeiden. Stellen Sie sicher, dass Sie an einer Kopie arbeiten, da dadurch Ihre Daten geändert werden.
Radouxju
1
Teilen Sie unser Shapefile in regionale Shapefiles auf, führen Sie dann die Analyse für die regionalen Shapefiles durch und lösen Sie sie auf, um die vollständige Datei erneut zu erhalten.
til_b
Ich habe versucht, diese Form mit nur einem Land zu schneiden, aber ich habe den Fehler 999999 zurückbekommen.
Nora
1
Haben Sie sich das Würfel-Werkzeug angesehen , um die Komplexität Ihrer Polygone zu verringern? Auch wenn Sie eine 999999-Fehlermeldung erhalten, wenn Sie nur versuchen, Ihre Daten zu beschneiden, haben Sie das Tool zum Überprüfen der Geometrie ausprobiert, um festzustellen, ob sich daraus Erkenntnisse ergeben?
Hornbydd
2
Ich habe eine teilweise Geometrieprüfung der Daten durchgeführt und es gibt viele Selbstüberschneidungen. Ich würde vorschlagen: 1. Maximale RAM-Nutzung und große Auslagerungsdatei sicherstellen. 2. Geometrie reparieren. 3. Falls erforderlich, Polygone vereinfachen. 3. Daten auf 1 / 3s oder 1 / 4s (oder was auch immer erforderlich) unterteilen. 4. Union-Dissolve-Rasterize-Workflow ausführen wie in dieser Antwort 5. Summiere die Raster.
Cotton.Rockwood

Antworten:

9

Ich würde empfehlen, das benutzerdefinierte Werkzeug Anzahl überlappender Polygone zu verwenden.

Geben Sie hier die Bildbeschreibung ein

Beschreibung:

Dieses Beispiel enthält eine Toolbox mit einem Werkzeug, Anzahl überlappender Polygone. Bei einer Feature-Class oder Layer mit überlappenden Polygonen wird eine neue Feature-Class mit entfernten Überlappungen und ein Join_Count-Feld mit der Anzahl überlappender Polygone ausgegeben.

Aaron
quelle
Ich habe es auch versucht und es funktioniert nicht für mein shp (zu groß). Danke für die Antwort
Nora
5

Mit Arcpy-Geometrie-Token können Sie Folgendes ausprobieren:

Geben Sie hier die Bildbeschreibung ein

import os
import arcpy

arcpy.env.workspace = r"" #path to workspace
arcpy.env.overwriteOutput = 1

polygon_fc = r"" #path to polygon fc

base = [row for row in arcpy.da.SearchCursor(polygon_fc,["OID@","SHAPE@"])]
compare = base

overlaps_stats = {}

for b in base:
    for c in compare:
        if b[1].overlaps(c[1]):
            #print "{0} overlaps {1}".format(b[0],c[0])
            if overlap_stats.has_key(b[0]):
                overlap_stats[b[0]].append(c[0])
            else:
                overlap_stats[b[0]] = [c[0]]

for key,value in overlap_stats.iteritems():
    print "Polygon {0}:  Overlaps: {1}.".format(key,len(value))

Für die obigen Beispieldaten gibt der Code die folgenden Überlappungszählungen zurück: Geben Sie hier die Bildbeschreibung ein

Der Code wie er ist gibt nur Zählungen für Polygone zurück, die mindestens eine Überlappung haben.

Nxaunxau
quelle
@ Nxau: Ok, ich habe wohl einen Fehler gemacht, um zu erklären, wie das Ergebnis aussehen soll. Es sollte eine Form sein, in der Sie neue Polygone aus den überlappenden haben. In Ihrem Bild überlappen sich beispielsweise die Kreise 4 und 5. Die neue Form sollte drei Polygone haben. (Union arbeitet nicht für diese große Form). Der überlappende Bereich sollte in einem Feld den Wert 2 haben, und die übrigen Kreise 4 und 5 sollten in diesem Feld den Wert 1 haben. Am Ende sollte es also ein Shapefile geben, in dem Sie sehen können, wie viele Vogelarten am selben Ort gefunden werden. Danke für dein Skript!
Nora
5

Eine sehr einfache Methode ist:

  1. Vereinige das Shapefile mit sich selbst;
  2. Konvertieren Sie mehrteilige Ausgaben in einzelne Teile .
  3. Verwenden Sie das räumliche Verknüpfungswerkzeug , um Überlappungen zu zählen (verwenden Sie die Übereinstimmungsoption ARE_IDENTICAL_TO).
  4. Symbolisieren Sie mit dem join_countFeld.

Geben Sie hier die Bildbeschreibung ein

user2856
quelle
1

Ich denke, Sie haben diese Methode ausprobiert: Zählen und Rastern von Polygonüberlappungen in ArcGIS Desktop?

16.400 Polygone sind nicht so viele. Eine mögliche Lösung besteht jedoch darin, einfach einen regulären Spatial Join durchzuführen. In der ArcMap toolbox, > Analysis Tools -> Overlap -> Spatial Join.

Stellen Sie sowohl die targetals auch die joinFeatures auf dasselbe Dataset ein und geben Sie eine Ausgabe an. Belassen Sie die restlichen Einstellungen.

Nach einigen Augenblicken sollten Sie ein Shapefile zurückerhalten, das eine Spalte "Join Count" enthält. Subtrahieren Sie 1 davon (da sich offensichtlich jedes Merkmal selbst schneiden sollte), und das sollte die Anzahl der "Überlappungen" (tatsächlich schneidet) für jedes Polygon sein.

Ich habe es gerade aufgeführt

GIS-Jonathan
quelle
Ja, ich habe den Ansatz bereits über den Link ausprobiert. Aber Union zu benutzen ist für diesen shp unmöglich. Beim Versuch, die räumliche Verbindung herzustellen, habe ich Folgendes zurückbekommen: FEHLER 000426: Nicht genügend Speicher.
Nora
Ich verwende es auf einem Computer mit nur 4 GB RAM und hatte ungefähr fünfmal so viele Funktionen. Ich bin also überrascht, dass es nicht mit einer viel niedrigeren Anzahl funktioniert. Möglicherweise haben Ihre Daten zu viele Scheitelpunkte (meine waren ungefähr 60 MB groß; wie groß ist Ihre .shp-Datei?). Versuchen Sie es zu verallgemeinern.
GIS-Jonathan
Wenn sich nur der shp in einer fgdb befindet, hat die fgdb 1,73 GB. In einem Ordner hat die Form 2,00 GB.
Nora
Ich habe diesen Datensatz ebenfalls verwendet und denke, dass viele der Probleme auftreten, weil einige der Polygone viele Teile haben. Dies in Verbindung mit der Auflösung macht dies zu einer sehr speicherintensiven Aufgabe.
Cotton.Rockwood
@ Cotton.Rockwood: Und du findest die Lösung in R, richtig? Ich denke daran, die Toolbox 'Anzahl überlappender Polygone' mit der Eingabe von 500 Polygonen (33 Auswahlen) als Polygon zu verwenden, um mit dem Wert "Anzahl der Verknüpfungen" zu rasteren und am Ende das Raster zu berechnen (ModelBuilder). Es dauert lange ...
Nora
1

Ich habe das Tool "Count Overlapping Polygons" heruntergeladen und ausprobiert. Es könnte funktionieren, aber es dauert furchtbar lange (wahrscheinlich wegen der Dateigröße, aber mein Eingabe-FC hatte nur <5.000 Datensätze).

Während ich darauf wartete, dass dieses Tool ausgeführt wurde, öffnete ich ein weiteres ArcMap-Fenster und es waren nur ein paar schnelle Schritte erforderlich, um das zu erhalten, was ich wollte. 1) Spatial Join - Verwenden Sie dieselbe Feature-Class wie Target- und Join-Features und wählen Sie die Option "One to Many verbinden". 2) Auflösen - unter Verwendung der Ausgabe aus dem letzten Schritt. Verwenden Sie "TARGET_FID" als Auflösungsfeld und für die Statistik können Sie entweder das Feld "Join_Count" summieren oder das Feld "JOIN_FID" zählen. 3) Verwenden Sie in der Ausgabedatei von Schritt 2 den Feldrechner und subtrahieren Sie 1 vom Statistikfeld ("SUM_Join_Count" oder "COUNT_JOIN_FID"), da sich jedes Feature selbst schneidet.

Ich schlage vor, diese Methode über das Werkzeug "Anzahl überlappender Polygone zählen" zu verwenden. Ich habe ~ 5 Minuten vor dem Starten dieser Join-> Dissolve-Methode mit dem Ausführen des COP-Tools begonnen. Das Ergebnis hatte genügend Zeit, dies aufzuschreiben, bevor das Tool "Count Overlapping Polygon" überhaupt fertig war.

Hoffe das hilft!

Brian in Buffalo
quelle