Algorithmus zur Berechnung der Abdeckung + Überlappungen aus einer Reihe von Bögen


10

Ich habe ein Shapefile mit Bögen, die den Weg eines Lastwagens darstellen, der Dünger auf eine Farm verteilt.

Angenommen, ich weiß, dass die Streubreite 30 m beträgt, dh der LKW kann Dünger 15 m auf beiden Seiten des Fahrzeugs verteilen.

Ich möchte eine Reihe von Polygonen erzeugen, die Folgendes zeigen:
1) Die Gesamtfläche, die Dünger erhalten hat.
2) Die Überlappungsflächen, dh wo zwei getrennte Durchgänge zu nahe beieinander lagen, so dass einige Teile der Farm die doppelte richtige Dosis erhielten "von Dünger.

Ein naiver Ansatz besteht darin, die Abdeckungspolygone nur als Puffer um die Bögen zu erstellen. Dies funktioniert in dem speziellen Fall, in dem die Ausbreitungslinien voneinander verschieden sind. Es ist jedoch denkbar, dass der LKW in einer immer kleiner werdenden Spirale um die Farm fährt, und ein einfacher Puffer würde keine Überlappungen anzeigen, wenn zwei Durchgänge der Spirale zu nahe beieinander liegen (wenn die Spirale ein einzelner Bogen ist, würde ich am Ende mit ein einzelnes Polygon ohne überlappende Teile).

Wenn es relevant ist, verwende ich die TatukGIS VCL DK, aber ich suche wirklich nach einem Algorithmus und nicht nach einer bestimmten Lösung.

Einige Klarstellungen als Antwort auf die bisherige Diskussion:

1) Ich kann mich nicht darauf verlassen, dass die Vektordaten bestimmte Metadaten enthalten (z. B. GPS-Protokolle oder Ausbreitungsrate). Ich erlaube dem Benutzer, eine Ebene auszuwählen und eine Spreizbreite anzugeben, dann wird der Bericht ausgeführt.

2) Der Zweck des Berichts besteht darin, dem Benutzer zu zeigen, wie "qualifiziert" der Fahrzeugführer war, wobei "qualifiziert" bedeutet "die höchste Abdeckung mit der geringsten Überlappung erreicht".

3) Ich fühle mich im Vektorland wohler als im Rasterland und bevorzuge daher vektorbasierte Lösungen.

Vielen Dank,

Darren.


1
Ich frage mich, ob dies mit Methoden vergleichbar wäre, die kumulative Niederschläge basierend auf vorhergesagten Sturmpfaden vorhersagen.
Kirk Kuykendall

Antworten:


3

Die vielleicht einfachste Lösung besteht darin, die einzelne Geometrie in Segmente aufzuteilen und diese einzelnen Segmente zu puffern: In Ihrem Spiralfall würden Sie jeden Bogen puffern und dann die einzelnen Bögen schneiden, um eine Zählung zu erhalten. Vermeiden Sie falsche Überlappungen, indem Sie die Enden der Segmente nicht puffern, sondern nur links und rechts von den Segmenten.

Ein anderer Ansatz besteht darin, ein Polygongitter über die Daten zu legen und dann in jeder Gitterzelle jedes sich schneidende Liniensegment separat zu puffern. Um genau zu sein, möchten Sie die zu analysierende Gitterzelle nehmen, puffern, dann die sich überschneidenden Segmente sammeln und diese puffern, um Ihre Analyse im ursprünglichen Zellenfenster durchzuführen.

Jede dieser Optionen sollte Ihnen eine vernünftige Schätzung der Überlappung geben. Ich kann mir ein paar genauere Ansätze vorstellen, aber sie würden erfordern, etwas über die Daten zu wissen.


Vielen Dank. Ich habe nach dem Vorbild Ihres ersten Vorschlags gedacht - die Geometrie in Segmente aufteilen und diese puffern. Ich denke, ich muss auch die Enden der Segmente puffern, damit ich an den Ecken abgerundete Kanten bekomme. Wenn ich an den Fall denke, in dem ich mit einer rechtwinkligen Linie beginne - wenn ich die Enden nicht puffere, werden am Ende zwei überlappende Rechtecke mit einem Quadrat an der Außenseite der Ecke fehlen (schwer als Text auszudrücken!).
Dbruning

Ich denke, ich muss auch die Enden der Segmente puffern, damit ich an den Ecken abgerundete Kanten bekomme. Ich dachte weiter daran, den Puffer für jedes Segment mit dem Puffer für das vorherige Segment zu schneiden und dann nur die "neuen" Teile jedes Puffers in einem Hauptpuffer zu akkumulieren. Die Idee ist, Überlappungen mit dem vorherigen Segment zu ignorieren, aber Überlappungen mit älteren Segmenten.
Dbruning

2

Keine Lösung, aber einige Eingaben:

Dieses Problem scheint dem Problem der Linienkoaleszenzerkennung bei der Kartenverallgemeinerung ähnlich zu sein . Es passiert, wenn ein großer Stil auf eine gewundene Linie angewendet wird (das Symbol überlappt sich selbst):

Geben Sie hier die Bildbeschreibung ein

Dieses Dokument S. 176 bis 180 (auf Französisch ... sorry) enthält einen Algorithmus zum Erkennen solcher sich selbst überschneidenden Teile. Das Prinzip besteht darin, wie von scw vorgeschlagen , einen einzelnen Seitenpuffer jedes Segments zu verwenden, der aus einem Segment plus 0, 1 oder 2 Kreisbögen besteht. JTS enthält eine Implementierung dieses einseitigen Puffers, die nützlich sein kann.


Warum sind Sie besorgt darüber, Selbstüberschneidungen zu erkennen? Und warum schlagen Sie "einseitige" Puffer vor? Beides scheint für das Problem nicht von Belang zu sein.
whuber

Der Zweck besteht darin, zu erkennen, wo der LKW mehrmals Dünger verteilt, dh wo sich der Ausbreitungsbereich selbst schneidet.
Julien

2

Eine Vektorlösung wird eine potenziell kritische Variable übersehen : die Zeit und dadurch die Ausbreitungsrate. Wenn sich der Traktor schneller bewegt, wird weniger Dünger pro Flächeneinheit ausgebracht, und wenn er sich langsamer bewegt (in eine Kurve verlangsamen und aus einer heraus beschleunigen), wird mehr Dünger pro Flächeneinheit ausgebracht. Wenn der Traktor während des Abbiegens Material verteilt, ist das Material außerdem stärker nach innen und weniger nach außen konzentriert.

Zeitdaten wären in einer GPS-Aufzeichnung des Fortschritts des Traktors verfügbar. Steigungen (zurückgelegte Strecke geteilt durch verstrichene Zeit) schätzen die Geschwindigkeiten an jedem Punkt. Alternativ könnte man (als Annäherung) eine konstante Geschwindigkeit innerhalb des Inneren eines Feldes und eine langsamere Geschwindigkeit innerhalb eines vernünftigen internen Puffers der Feldgrenze annehmen.

Eine Rasterdarstellung kann diese Probleme behandeln. Rastern Sie den Weg des Traktors. Dadurch werden alle vom Traktor nicht gekreuzten Zellen auf NoData-Werte (oder auf Null) gesetzt. Wenn sich der Traktor mit einer konstanten Standardgeschwindigkeit bewegen würde, würde es ausreichen, in jede der Datenzellen einen konstanten Wert einzugeben. Wenn sich der Traktor beispielsweise mit der doppelten Geschwindigkeit bewegen würde, würde sich (vermutlich) seine Aufwandmenge halbieren, und dies kann durch Halbieren des Werts in den Zellen dargestellt werden.

Im Allgemeinen ist der Wert, der in eine Zelle eingefügt werden soll, die Aufwandmenge pro Flächeneinheit . Wenn der Traktor bei einer Geschwindigkeit von y m / s gleichmäßig x kg Dünger pro Sekunde auf 15 m auf jeder Seite verteilt , verteilt er x / y kg / s / [m / s] / (2 *) 15 m) = x / (30 y ) kg / m 2 Dünger. Somit ist x / (30 y ) der Wert, der in jede Zelle eingegeben werden soll. x ist gegeben und y wird aus den GPS-Daten berechnet.

Selbstüberschneidungen sind grundsätzlich kein Problem . Wenn sich der Pfad des Traktors kreuzt, fügen Sie die Beiträge jedes Mal hinzu, wenn er eine Zelle neu kreuzt. Je nachdem, wie das Raster erstellt wird und welche Funktionen die GIS-Software bietet, ist möglicherweise eine spezielle Verarbeitung erforderlich, um dies zu erreichen.

Nach dieser Vorbereitung ist der Rest schnell und einfach: Eine Brennpunktsumme dieses Gitters, die eine kreisförmige Nachbarschaft mit einem Radius von 15 m verwendet, ermittelt die kumulierte Menge, die pro Flächeneinheit in jeder Zelle verteilt ist.


1
+1 Wenn Sie ein Tool hätten, mit dem sich ein Kernel (der den Traktor darstellt) auf einem Pfad (anstatt entlang jeder Zeile) bewegen könnte, wäre dieses Problem leichter zu bewältigen.
Kirk Kuykendall

@Kirk Es ist nicht nötig, einem Pfad oder Zeilen oder was auch immer mit einem Kernel zu folgen. Es ist wichtig, die Änderung der Sichtweise zu verstehen, die mit einer Fokussumme einhergeht: Anstatt das Problem als das Verteilen von Material aus einem Pfad von Punkten zu betrachten, betrachten Sie es als das Berechnen, wie viel Material sich an jedem Punkt im Feld ansammelt . Offensichtlich ist es das gleiche Problem mit der gleichen Lösung. Der Moving-Kernel-Ansatz (und die vorgeschlagenen Pufferungsansätze) nehmen den ersten Standpunkt ein; die Brennsumme, die zweite. Das Fokalsummen-Tool ist jedoch verfügbar. Eine Moving-Kernel-Berechnung gibt es nicht.
whuber

Ich denke, der von Ihnen skizzierte Rasteransatz wäre die beste Methode, wenn wir Geschwindigkeit und Ausbreitungsrate kennen würden. Leider wissen wir in diesem speziellen Szenario beides nicht. Unser Endbenutzer kann eine beliebige Ebene als Eingabe für diesen Abdeckungsbericht auswählen, und wir können uns nicht darauf verlassen, dass die Geometrie bestimmte Metadaten enthält.
Dbruning

@dbruning Dieser Ansatz scheint keine bekannten Geschwindigkeits- / Ausbreitungsraten zu erfordern. es erlaubt sie nur (+ das genauere Modell der Realität), wenn Sie sie haben. Es wird jedoch auch mehr Zellenschwellen + Zählen erfordern, um die gewünschten Metriken (Gesamtflächenabdeckung; Überlappungsfläche) aus dem System herauszuholen, und es gibt auch Kompromisse bei der Genauigkeit.
Dan S.

@dbruning Wenn Sie die Spread-Rate nicht kennen, erhalten Sie eine relative Spread-Rate. Wenn Sie die Geschwindigkeit nicht kennen, wissen Sie immer noch (oder sollten wissen), wie Menschen Traktoren fahren, und sollten in der Lage sein, vernünftige Schätzungen der relativen Geschwindigkeiten abzuleiten. Wenn Sie von konstanten Geschwindigkeiten und konstanten Ausbreitungsraten ausgehen, erhalten Sie immer noch vernünftige Antworten. Sie stimmen mit den pufferbasierten Antworten über gerade Abschnitte der Traktorrouten überein. und sie sind wahrscheinlich in den gekrümmten Abschnitten realistischer.
whuber

2

Ich bin mir beim StackExchange-Protokoll nicht 100% sicher, daher poste ich dies als Antwort auf meine Frage. Es ist die Antwort, die ich sowieso verwendet habe.

Der grundlegende Algorithmus lautet:
1. Teilen Sie jede Geometrie auf der Ebene in Segmente auf, die nicht länger als die Hälfte der Spreizbreite sind.
2. Für jedes Segment:
- Erstellen Sie einen "Rolling Buffer", indem Sie entlang der Form nach hinten schauen und alle vorherigen Segmente puffern, bei denen die kumulative Länge dieser Segmente kleiner als die Spreizbreite ist (Pufferradius = 1/2 Spreizbreite).
- Erstellen ein "nächster Segmentpuffer" nur des nächsten Segments (Pufferradius = 1/2 Spreizbreite)
- Subtrahieren Sie den "rollenden Puffer" vom "nächsten Segmentpuffer", um "neuen Puffer" zu erhalten
- verbinden Sie den gesamten "neuen Puffer" Polygone zusammen, um ein einzelnes Polygon pro Form zu erhalten.

Im Wesentlichen ermöglicht dies dem Fahrer des Spreizfahrzeugs, rechtwinklige (oder breitere) Kurven ohne Überlappungsstrafe zu fahren. Wenn sie jedoch zu stark zurückdrehen, so dass sie sich über "alten Boden" ausbreiten, kommt es zu Überlappungen.

Überlappungen in blau

Spirale sieht so aus, als ob ich es möchte:

Spiral-

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.