Ich versuche, kleine Segmente mit einem größeren Segment abzugleichen, mit dem sie am wahrscheinlichsten zu tun haben: relativ eng, ähnlich gelagert und einander zugewandt.
Hier ist ein typisches Beispiel für die Daten, die ich habe:
Hier müsste ich das Segment 652 mit 198969 abgleichen, während 711 und 707 zu nichts passen.
Ich habe nach verschiedenen Methoden gesucht, insbesondere nach der Hausdorff-Distanz (basierend auf den Antworten hier ). Ich habe es mit PostGIS berechnet, aber ich erhalte merkwürdige Ergebnisse: Die kürzeste Entfernung, die ich erhalte, liegt zwischen 707 und 198985, und 652 hat eine größere Entfernung zu 198969 als zum Beispiel zu 198985 (ich kann die Abfrage und die Ergebnisse bei Bedarf hinzufügen).
Ist Hausdorff tatsächlich die richtige Methode, um dies zu lösen? Gibt es noch andere Ansätze? Ich habe überlegt, einfach eine Reihe von Überprüfungen der von mir genannten Parameter (Entfernung, Peilung usw.) durchzuführen, aber ich habe Angst, eine ganze Reihe von Bedingungen hinzufügen zu müssen, um Randfälle oder Dinge wie Schwellenwerte für deren Höhe zu behandeln Einander gegenüberstehen.
Update: Ich habe eine Methode gefunden, die als akzeptabler Kompromiss erscheint:
- Ich finde zuerst die 10 nächsten schwarzen Segmente von dem blauen, das ich (mit dem PostGIS-
<->
Operator) abgleichen möchte und die weniger als 10 Meter entfernt sind. - Ich erstelle dann ein neues Segment, indem ich die nächsten Punkte zu den Enden des blauen Segments auf jedem der schwarzen finde (mit
ST_ClosestPoint
) und die Ergebnisse herausfiltere, deren Länge weniger als 90% des blauen ist (was bedeutet, dass die Segmente nicht sind) oder dass die Peilungsdifferenz mehr als ~ 20 ° beträgt) - Dann erhalte ich das erste Ergebnis sortiert nach Entfernung und Hausdorff-Entfernung, falls vorhanden.
Möglicherweise müssen einige Feinabstimmungen vorgenommen werden, aber es scheint vorerst eine akzeptable Arbeit zu leisten. Ich suche immer noch nach anderen Methoden oder zusätzlichen Überprüfungen, die ausgeführt werden sollen, wenn ich einige Randfälle verpasst habe.
quelle
Antworten:
Hier sind ein paar Funktionen, die ich geschrieben habe, damit Sie tun können, was Sie tun müssen. Überprüfen Sie, ob es sich bei der Linie um eine Polylinie oder um ein Segment handelt, wenn die Linie durch eine Polylinie aufgelöst wird. Vergleichen Sie dann den Azimut und die Umkehrung des ersten Punkts und des letzten Punkts auf der Linie, und legen Sie die akzeptablen Kriterien für die Entscheidung des Codes fest. Dies sind arcpy-Methoden, die jedoch geändert werden können.
Rückgabe des Azimuts vom Liniensegment ESRI @shape
Rückgabe invers von ESRI-Punkten
Polylinie in Liniensegment zerlegen
renn so durch deinen Tisch
diese eigenschaften sollten in postgis verfügbar sein - firstpoint, lastpoint, pointarray Ich nehme esri-eigenschaften an, da es das ist, was ich am besten kenne, aber die obigen können leicht geändert werden, um mit postgis zu arbeiten.
quelle