Алгоритм: переместить исходную полилинию в опорную полилинию (полностью или возможно частично)

10

В нашей системе есть требования, по которым мы хотим переместить некоторые исходные строки (с низкой точностью) в опорные линии (с высокой точностью). Следующие картинки дают нормальные варианты использования. Красный - это исходная линия, а синий - контрольная.

Красный - исходная линия, а синий - контрольная.

В этом случае исходная строка будет частично перемещена, и результат будет таким, как показывает зеленая линия:

Переместить результат 1

Есть ситуации, когда исходная строка должна быть полностью перемещена.

Пример 2

Результат:

Переместить результат 2

В настоящее время наше решение является руководитель проекта / конечную точку исходной линии к опорной линии, и наоборот, а затем найти проецируемые точки на линии источника и ссылки. С учетом этих прогнозируемых точек, мы можем извлечь необходимую часть исходной строки и эталонным, а затем объединить их в новую.

Это работает в большинстве случаев, но есть случаи, когда этот метод не работает. В частности, когда любая из линий имеет форму, подобную букве «С», или точка начала очень близка к конечной точке. Следующие две картинки дают сценарий.

C-образная линия

Применяя мой алгоритм, мы получаем результат:

Результаты

В некотором смысле это понятно, потому что текущий алгоритм просто находит спроецированные точки и извлекает линии.

Мы ожидали что-то вроде этого:

Ожидаемые результаты

Так что мне нужен более надежный алгоритм, чтобы сделать это, чтобы он мог также обрабатывать особые случаи, как в предыдущем. Я пытался проецировать каждую точку от линии к другой и находить две проецируемые точки, которые ближе всего к точке начала / конца проецируемой линии, но не было удачи. Тем не менее я могу найти случаи, которые дают неожиданные результаты.

Кто-нибудь сталкивался с подобными проблемами раньше? Было бы также хорошо, если бы программное обеспечение или библиотека могли выполнять аналогичную работу. Любой ответ будет оценен.

mfdev
источник
1
Возможно, это поможет вам, когда вы посмотрите, как Topology в ArcGIS проверяет, совпадают ли объекты: help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//… пункт "Обработка кластеров".
Йенс
Спасибо за ваш ответ, @Jens. Но я боюсь, что это не то, что я хочу.
mfdev
Эти линии представляют сеть? Есть ли между ними топологические отношения?
Жюльен
Это не обязательно должна быть сеть и, возможно, никаких топологических связей.
mfdev

Ответы:

4

Моя оценка состоит в том, что конечные случаи часто являются исключениями, которые не программируются машиной. Я работал с похожими проблемами, и они всегда требовали определенного ручного редактирования. То, что вам нужно настроить, - это исключения, которые вырабатываются делом и передают их в систему управления работой конечному пользователю.

Льюис
источник
Несколько похожий пример этого можно увидеть здесь: vividsolutions.com/jcs JCS имеет большое значение для автоматизации сопоставления геометрии, но также включает ручной контроль качества для геометрий, которые он не может объединить полностью. vividsolutions.com/… построен из него и позволяет проводить тестирование и добавляет отслеживание проблем для сложных геометрий.
DPierce
1
Все топологические решения не могут быть автоматизированы с помощью программирования, и на крупных предприятиях такие решения разрабатываются аналогично примеру, так как выпадение взаимосвязи может быть крупным и циклическим по своей природе со сложной геометрией транспортировки с высокой скоростью изменения.
Льюис
2

Для этого алгоритма вам понадобится допуск на привязку и поворот (я предполагаю, что у вас уже есть допуск на привязку).

Спроецируйте верхнюю точку от исходной линии до контрольной линии. Разбейте контрольную линию в этой спроецированной точке.

Пройдите линию источника от головной точки до первой вершины, чтобы получить направление движения вдоль линии источника. Пройдите каждую из двух опорных линий от проектируемой исходной точки до следующей вершины. Если направление движения находится в пределах допустимого отклонения от направления движения от головной точки на исходной линии, примените свой алгоритм в обычном режиме, но только с использованием этого участка контрольной линии. Если алгоритм достигает конца строки источника, все готово. Если нет, разорвите линию источника между преобразованной частью и нетрансформированной частью (которая будет включать конечную точку).

Теперь возьмите нетрансформированный фрагмент и спроецируйте конечную точку на исходную контрольную линию. Проделайте ту же процедуру, что и раньше ... Пройдите источник от конечной точки до первой вершины, чтобы найти направление движения. Разбейте контрольную линию в конечной точке проекта и проследите каждую из них, чтобы определить, находится ли направление движения от проектируемой конечной точки в пределах допустимого поворота. Если это так, используйте эту часть контрольной линии, чтобы применить алгоритм нормально.

Помните, что в данный момент вы используете только нетрансформированную фигуру, поэтому вы не будете пересекаться с трансформацией заголовка.

Наконец, при необходимости объедините две результирующие отрезки линии: преобразованную точку головной точки из спроецированной верхней точки в нетрансформированную точку разрыва, а затем в конечную точку, преобразованную деталь из непревращенной точки разрыва в прогнозируемую конечную точку.

blord-Castillo
источник