Próbuję dopasować małe segmenty do większego segmentu, z którym są najprawdopodobniej powiązane: stosunkowo blisko, podobne namiarowanie i zwrócone do siebie.
Oto typowy przykład danych, które posiadam:
Tutaj musiałbym dopasować segment 652 do 198969, mając 711 i 707, które niczego nie pasują.
Szukałem różnych metod, w szczególności odległości Hausdorffa (na podstawie odpowiedzi tutaj ). Obliczyłem to za pomocą PostGIS, ale otrzymuję dziwne wyniki: najkrótsza odległość, jaką mam, wynosi między 707 a 198985, a 652 ma większy dystans na przykład do 198969 niż na przykład do 198985 (w razie potrzeby mogę dodać zapytanie i wyniki).
Czy Hausdorff jest właściwie właściwą metodą rozwiązania tego problemu? Czy są inne podejścia? Myślałem o stworzeniu zestawu kontroli parametrów, o których wspomniałem (odległość, łożysko itp.), Ale obawiam się, że muszę dodać całą masę warunków, aby obsłużyć przypadki krawędziowe lub takie rzeczy, jak próg określający ich wysokość stawiać sobie czoła.
Aktualizacja: Znalazłem metodę, która wydaje się akceptowalnym kompromisem:
- Najpierw znajduję 10 najbliższych czarnych segmentów z niebieskiego, które próbuję dopasować (za pomocą
<->
operatora PostGIS ), które są w odległości mniejszej niż 10 metrów. - Następnie tworzę nowy segment, znajdując najbliższe punkty na końcach niebieskiego segmentu na każdym z czarnych (używając
ST_ClosestPoint
) i odfiltrowuję wyniki, których długość jest mniejsza niż 90% niebieskiego (co oznacza, że segmenty nie są okładzina lub że różnica łożysk jest większa niż ~ 20 °) - Następnie otrzymuję pierwszy wynik posortowany według odległości i odległości Hausdorffa, jeśli istnieje.
Może być trochę dostrojenia, ale wydaje się, że na razie wykonuje zadowalającą pracę. Wciąż szukam innych metod lub dodatkowych kontroli do uruchomienia, jeśli przegapiłem niektóre przypadki krawędzi.
źródło
Odpowiedzi:
Oto kilka funkcji, które napisałem, które powinny pozwolić ci robić to, co musisz zrobić. Sprawdź, czy linia jest polilinią czy segmentem, jeśli polilinia eksploduje linię, a następnie porównaj azymut i odwrotność pierwszego punktu i ostatniego punktu na liniach, ustaw dopuszczalne kryteria dla kodu, aby podjąć decyzję za Ciebie. Są to metody Arcpy, ale można je modyfikować.
zwraca azymut z segmentu linii ESRI @shape
zwraca odwrotność od punktów ESRI
rozbij polilinię na segment linii
przebiegnij przez swój stół w ten sposób
właściwości te powinny być dostępne w postgis - firstpoint, lastpoint, pointarray Zakładam, że właściwości esri powyżej, ponieważ to jest to, co wiem najlepiej, ale powyższe można łatwo zmienić, aby działały z postgis.
źródło