Я пытаюсь сопоставить небольшие сегменты с более крупным сегментом, с которым они, скорее всего, связаны: относительно близко, схожим подшипником и лицом друг к другу.
Вот типичный пример данных, которые у меня есть:
Здесь я должен был бы соответствовать сегменту 652 к 198969, в то время как 711 и 707 не соответствуют ничему.
Я искал различные методы, в частности расстояние Хаусдорфа (на основе ответов здесь ). Я вычислил его, используя PostGIS, но получаю странные результаты: самое короткое расстояние, которое я получаю, находится между 707 и 198985, и 652 имеет большее расстояние до 198969, чем, например, 198985 (я могу добавить запрос и результаты, если необходимо).
Хаусдорф на самом деле правильный метод для решения этой проблемы? Есть ли другие подходы? Я думал просто о создании набора проверок для параметров, которые я упомянул (расстояние, азимут и т. Д.), Но я боюсь, что мне нужно будет добавить целый ряд условий для обработки краевых случаев или таких вещей, как пороговое значение, на сколько они обращенных друг к другу.
Обновление: я нашел метод, который кажется приемлемым компромиссом:
- Сначала я нахожу 10 ближайших черных сегментов из синего, который я пытаюсь сопоставить (используя
<->
оператор PostGIS ), которые находятся на расстоянии менее 10 метров. - Затем я создаю новый сегмент путем нахождения ближайших точек к концам синего сегмента на каждом из черных (используя
ST_ClosestPoint
) и отфильтровываю результаты, длина которых составляет менее 90% синего (то есть сегменты не являются или разница подшипников составляет более ~ 20 °) - Затем я получаю первый результат, отсортированный по расстоянию и расстоянию Хаусдорфа, если таковые имеются.
Там может быть какая-то тонкая настройка, но пока она кажется приемлемой. Все еще ищу какие-либо другие методы или дополнительные проверки для запуска, если я пропустил некоторые крайние случаи.
источник
Ответы:
Вот пара функций, которые я написал, которые должны позволить вам делать то, что вам нужно. Проверьте и посмотрите, является ли линия полилинией или сегментом, если ломаная линия взорвет линию, затем сравните азимут и инверсию первой точки и последней точки на линиях, установите приемлемые критерии для кода, который будет принимать решение за вас. Это дугообразные методы, но они могут быть изменены.
вернуть азимут из отрезка линии ESRI @shape
вернуть обратно из точек ESRI
взорвать ломаную линию на отрезок
беги через свой стол вот так
эти свойства должны быть доступны в postgis - firstpoint, lastpoint, pointarray Я предполагаю, что свойства esri выше, потому что это то, что я знаю лучше, но выше можно легко изменить для работы с postgis.
источник