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.
quelle
Antworten:
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.
quelle
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):
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.
quelle
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.
quelle
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.
Spirale sieht so aus, als ob ich es möchte:
quelle