Algorithmus: Verschieben einer Quellpolylinie in eine Referenzpolylinie (ganz oder teilweise)

10

In unserem System gibt es die Anforderungen, dass wir einige Quellzeilen (mit geringer Genauigkeit) in Referenzzeilen (mit hoher Genauigkeit) verschieben möchten. Die folgenden Bilder zeigen die normalen Anwendungsfälle. Die rote ist eine Quelllinie und die blaue ist eine Referenzlinie.

Die rote ist die Quelllinie und die blaue ist die Referenzlinie

In diesem Fall würde die Quelllinie teilweise verschoben, und das Ergebnis wäre wie in der grünen Linie dargestellt:

Ergebnis 1 verschieben

Es gibt Situationen, in denen die Quellzeile vollständig verschoben werden muss.

Beispiel 2

Ergebnis:

Ergebnis 2 verschieben

Derzeit besteht unsere Lösung darin, den Kopf- / Endpunkt der Quelllinie auf die Referenzlinie und umgekehrt zu projizieren und dann projizierte Punkte auf der Quell- und Referenzlinie zu finden. Mit diesen projizierten Punkten können wir den benötigten Teil der Quell- und Referenzlinie extrahieren und sie dann zu einem neuen kombinieren.

Dies funktioniert in den meisten Fällen, aber es gibt Fälle, in denen diese Methode nicht funktioniert. Insbesondere, wenn eine der Linien eine "C" -ähnliche Form hat oder der Kopfpunkt sehr nahe am Endpunkt liegt. Die nächsten beiden Bilder zeigen das Szenario.

C wie Formlinie

Bei Anwendung meines Algorithmus erhalten wir das Ergebnis:

Ergebnisse

In gewisser Weise ist es verständlich, weil der aktuelle Algorithmus nur projizierte Punkte findet und Linien extrahiert.

Was wir erwartet haben, ist ungefähr so:

erwartete Ergebnisse

Also, was ich brauche, um dies robuster zu machen, damit es auch Sonderfälle wie den vorhergehenden behandeln kann. Ich habe versucht, alle Punkte von einer Linie auf eine andere zu projizieren und die beiden projizierten Punkte zu finden, die dem Kopf- / Endpunkt der projizierten Linie am nächsten liegen, aber es gab kein Glück. Trotzdem kann ich Fälle finden, die zu unerwarteten Ergebnissen führen.

Hat jemand schon einmal ähnliche Probleme gehabt? Es wäre auch toll, wenn es eine Software oder Bibliothek gibt, die ähnliche Aufgaben erledigen kann. Jede Antwort wird geschätzt.

mfdev
quelle
1
Vielleicht hilft es Ihnen, wenn Sie sehen, wie die Topologie in ArcGIS prüft, ob Objekte übereinstimmen: help.arcgis.com/de/arcgisdesktop/10.0/help/index.html#//… Absatz "Clusterverarbeitung".
Jens
Vielen Dank für Ihre Antwort, @Jens. Aber ich fürchte, das will ich nicht.
Mfdev
Stellen diese Linien ein Netzwerk dar? Gibt es topologische Beziehungen zwischen ihnen?
Julien
Es muss kein Netzwerk sein und möglicherweise keine topologischen Beziehungen.
Mfdev

Antworten:

4

Nach meiner Einschätzung handelt es sich bei Endfällen häufig um Ausnahmen, die nicht maschinenprogrammierbar sind. Ich habe mit ähnlichen Problemen gearbeitet und sie erforderten immer eine gewisse manuelle Bearbeitung. Was Sie einstellen müssen, sind Ausnahmen, die vom Fall erzeugt werden und die einem Endbenutzer in einem Arbeitsverwaltungssystem zur Verfügung gestellt werden.

Lewis
quelle
Ein etwas ähnliches Beispiel hierfür ist hier zu sehen: vividsolutions.com/jcs JCS trägt wesentlich zur Automatisierung der Geometriekonflation bei, enthält jedoch auch eine manuelle Qualitätssicherung für Geometrien, die nicht vollständig zusammengeführt werden können. vividsolutions.com/… Wird daraus erstellt und ermöglicht die Qualitätssicherung und fügt die Problemverfolgung für schwierige Geometrien hinzu.
DPierce
1
Alle topologischen Lösungen können nicht durch Programmierung automatisiert werden, und in großen Unternehmen werden solche Lösungen ähnlich wie im Beispiel entwickelt, da der Konfliktausfall bei komplexen Transportgeometrien mit einer hohen Änderungsrate groß und zyklisch sein kann.
Lewis
2

Für diesen Algorithmus benötigen Sie eine Schnapptoleranz und eine Drehtoleranz (ich gehe davon aus, dass Sie bereits eine Schnapptoleranz haben).

Projizieren Sie den Kopfpunkt von der Quelllinie auf die Referenzlinie. Brechen Sie die Referenzlinie an diesem projizierten Punkt.

Überqueren Sie die Quelllinie vom Kopfpunkt zum ersten Scheitelpunkt, um die Fahrtrichtung entlang der Quelllinie zu erhalten. Überqueren Sie jede Ihrer beiden Referenzlinien vom projizierten Quellpunkt zum nächsten Scheitelpunkt. Wenn die Fahrtrichtung innerhalb der Drehtoleranz der Fahrtrichtung vom Kopfpunkt auf Ihrer Quelllinie liegt, wenden Sie Ihren Algorithmus normal an, verwenden Sie jedoch nur diesen Abschnitt der Referenzlinie. Wenn der Algorithmus das Ende der Quellzeile erreicht, sind Sie fertig. Wenn nicht, unterbrechen Sie die Quelllinie zwischen dem transformierten und dem nicht transformierten Teil (einschließlich des Endpunkts).

Nehmen Sie nun das nicht transformierte Stück und projizieren Sie den Endpunkt auf die ursprüngliche Referenzlinie. Gehen Sie genauso vor wie zuvor ... durchlaufen Sie die Quelle vom Endpunkt bis zum ersten Scheitelpunkt, um die Fahrtrichtung zu ermitteln. Brechen Sie die Referenzlinie am Projektendpunkt und durchqueren Sie jede Linie, um festzustellen, ob die Fahrtrichtung vom projizierten Endpunkt innerhalb der Drehtoleranz liegt. Wenn ja, verwenden Sie diesen Teil der Referenzlinie, um den Algorithmus normal anzuwenden.

Denken Sie daran, dass Sie zu diesem Zeitpunkt nur das nicht transformierte Teil verwenden, damit Sie sich nicht mit der Kopfpunkttransformation überschneiden.

Führen Sie schließlich die beiden resultierenden Linienstücke zusammen, falls erforderlich: das Kopfpunkt-transformierte Stück vom projizierten Kopfpunkt zum nicht transformierten Bruchpunkt und dann das Endpunkt-transformierte Stück vom nicht transformierten Bruchpunkt zum projizierten Endpunkt.

Blord-Castillo
quelle