Angesichts mehrerer Polygone, die sich auf mehrere Arten überlappen, möchte ich aus diesen Features alle Polygone exportieren, die sich iterativ nicht mit anderen überlappen.
Das Produkt wäre eine Reihe von Merkmalen ohne Überlappung, die zusammengenommen das Original bilden.
Die Produkte könnten dann als Eingabe für die Zonenstatistik verwendet werden, und dies wäre viel schneller als das Iterieren der Zonenstatistik über jedes Polygon.
Ich habe versucht, dies in ArcPy ohne Erfolg zu codieren.
Gibt es dafür bereits Code?
arcpy
algorithm
overlapping-features
ndimhypervol
quelle
quelle
Antworten:
Dies ist ein Problem beim Färben von Grafiken .
Denken Sie daran, dass eine Diagrammfärbung eine Zuordnung einer Farbe zu den Scheitelpunkten eines Diagramms ist, sodass keine zwei Scheitelpunkte, die eine Kante gemeinsam haben, dieselbe Farbe haben. Insbesondere sind die (abstrakten) Eckpunkte des Graphen die Polygone. Zwei Eckpunkte werden immer dann mit einer (ungerichteten) Kante verbunden, wenn sie sich schneiden (als Polygone). Wenn wir eine Lösung für das Problem finden - das eine Folge von (sagen wir k ) disjunkten Sammlungen der Polygone ist - und jeder Sammlung in der Folge eine eindeutige Farbe zuweisen, haben wir eine k- Färbung des Graphen erhalten . Es ist wünschenswert, ein kleines k zu finden .
Dieses Problem ist ziemlich schwierig und bleibt für beliebige Graphen ungelöst. Stellen Sie sich eine ungefähre Lösung vor, die einfach zu codieren ist. Ein sequentieller Algorithmus sollte reichen. Der Welsh-Powell-Algorithmus ist eine gierige Lösung, die auf einer absteigenden Reihenfolge der Eckpunkte nach Grad basiert. Sortiert in die Sprache der ursprünglichen Polygone, sortieren Sie die Polygone zunächst in absteigender Reihenfolge nach der Anzahl der anderen Polygone, die sie überlappen. Geben Sie dem ersten Polygon eine Anfangsfarbe. Versuchen Sie in jedem Schritt, das nächste Polygon mit einer vorhandenen Farbe zu färben. Wählen Sie also eine Farbe aus, die nicht vorhanden istbereits von einem der Nachbarn dieses Polygons verwendet. (Es gibt viele Möglichkeiten, zwischen den verfügbaren Farben zu wählen. Probieren Sie entweder die am wenigsten verwendete oder eine zufällig ausgewählte Farbe aus.) Wenn das nächste Polygon nicht mit einer vorhandenen Farbe gefärbt werden kann, erstellen Sie eine neue Farbe und färben Sie sie damit.
Wenn Sie eine Färbung mit einer kleinen Anzahl von Farben erreicht haben, führen Sie Zonenstatistiken Farbe für Farbe durch: Durch die Konstruktion wird garantiert, dass sich keine zwei Polygone einer bestimmten Farbe überlappen.
Hier ist Beispielcode in
R
. (Python-Code wäre nicht viel anders.) Zunächst beschreiben wir Überlappungen zwischen den sieben gezeigten Polygonen.Das heißt, die Polygone 1 und 2 überlappen sich, ebenso wie die Polygone 2 und 3, 3 und 4, ..., 1 und 7.
Sortieren Sie die Eckpunkte nach absteigendem Grad:
Ein (roher) sequentieller Farbalgorithmus verwendet die früheste verfügbare Farbe, die noch nicht von einem überlappenden Polygon verwendet wird:
Initialisieren Sie die Datenstrukturen (
colors
undcolor.next
) und wenden Sie den Algorithmus an:Teilen Sie die Polygone nach Farben in Gruppen auf:
Die Ausgabe in diesem Beispiel verwendet vier Farben:
Es hat die Polygone in vier nicht überlappende Gruppen unterteilt. In diesem Fall ist die Lösung nicht optimal ({{3,6,5}, {2,4}, {1,7}} ist für dieses Diagramm dreifarbig). Im Allgemeinen sollte die Lösung jedoch nicht schlecht sein.
quelle
Die von #whuber empfohlene Methodik hat mich dazu inspiriert, eine neue Richtung einzuschlagen, und hier ist meine bogenförmige Lösung in zwei Funktionen. Das erste, countOverlaps genannt, erstellt zwei Felder, "Overlaps" und "ovlpCount", um für jede Poly aufzuzeichnen, deren Polys sich überlappen und wie viele Überlappungen aufgetreten sind. Die zweite Funktion, explodeOverlaps, erstellt ein drittes Feld, "expl", das jeder Gruppe nicht überlappender Polys eine eindeutige Ganzzahl gibt. Der Benutzer kann dann basierend auf diesem Feld neue fc exportieren. Der Prozess ist in zwei Funktionen unterteilt, da sich das countOverlaps-Tool meiner Meinung nach als nützlich erweisen kann. Bitte entschuldigen Sie die Schlamperei des Codes (und die unachtsame Namenskonvention), da er ziemlich vorläufig ist, aber funktioniert. Stellen Sie außerdem sicher, dass der "idName" Feld stellt ein Feld mit eindeutigen IDs dar (nur mit ganzzahligen IDs getestet). Vielen Dank, dass Sie mir den Rahmen zur Verfügung gestellt haben, der zur Lösung dieses Problems erforderlich ist!
quelle
countOverlaps
entspricht den beiden Zeilennbrhoods <- sapply(vertices, neighbors); degrees <- sapply(nbrhoods, length)
in meinem Code:degrees
ist die Überlappungszahl. Natürlich ist Ihr Code länger, da er den größten Teil der GIS-Analyse widerspiegelt, die in meiner Lösung als selbstverständlich angesehen wird: Sie identifizieren zunächst, welche Polygone sich überlappen, und am Ende verwenden Sie die Lösung zur Ausgabe von Polygon-Datasets. Es wäre eine gute Idee, die graphentheoretischen Berechnungen zu kapseln. Wenn Sie also jemals einen besserenEs ist eine Weile her, aber ich habe diesen Code für meine eigene Anwendung verwendet und er hat großartig funktioniert - danke. Ich habe einen Teil davon neu geschrieben, um ihn zu aktualisieren, auf Zeilen anzuwenden (mit einer Toleranz) und ihn erheblich zu beschleunigen (siehe unten - ich verwende ihn auf 50 Millionen sich überschneidenden Puffern und es dauert nur ein paar Stunden).
quelle
In diesen Fällen verwende ich im Allgemeinen die folgende Methode:
Ich glaube, das Ergebnis wird das sein, das Sie wollten, und Sie können sogar die Anzahl der Überlappungen zählen. Ich weiß nicht, ob es in Bezug auf die Leistung besser für Sie ist oder nicht.
quelle