Алгоритм: переміщення вихідної полілінії до еталонної полілінії (повністю або, можливо, частково)


10

У нашій системі є вимоги, згідно з якими ми хочемо перемістити деякі вихідні лінії (з низькою точністю) до опорних ліній (з високою точністю). На наступних фотографіях наведено звичайні випадки використання. Червона - це вихідна лінія, а синя - опорна.

Червона - це вихідна лінія, а синя - опорна

У цьому випадку рядок джерела буде переміщений частково, а результат буде таким, як показує зелена лінія:

Результат переміщення 1

Існують ситуації, що вихідну лінію потрібно повністю перемістити.

Приклад 2

Результат:

Переміщення результату 2

В даний час наше рішення полягає в тому, щоб проектувати головну / кінцеву точку вихідної лінії на опорну лінію і навпаки, а потім знаходити прогнозовані точки на джерело та опорну лінію. За допомогою цих проектованих точок ми можемо витягти потрібну частину вихідного та опорного рядка, а потім об'єднати їх у нову.

Це працює в більшості випадків, але є випадки, коли цей метод не працює. Зокрема, коли будь-яка з рядків має форму "C" у формі, або точка голови дуже близька до кінцевої точки. Наступні дві картини дають сценарій.

C як лінія фігури

Застосовуючи мій алгоритм, ми отримуємо результат:

Результати

Певним чином це зрозуміло, оскільки поточний алгоритм просто знаходить прогнозовані точки та витягує рядки.

Ми очікували приблизно такого:

очікувані результати

Отже, для цього мені потрібен більш надійний алгоритм, щоб він також міг обробляти особливі випадки, як попередній. Я намагався спроектувати кожну точку від прямої до іншої та знайти дві проектовані точки, які є найближчими до головної / кінцевої точки проектованої лінії, але не пощастило. Ще я можу знайти випадки, які дають несподівані результати.

Хтось раніше стикався з подібними проблемами? Було б також чудово, якщо програмне забезпечення чи бібліотека можуть виконати подібну роботу. Будь-яка відповідь буде вдячна.


1
Можливо, це допоможе вам, коли ви подивитесь, як топологія в ArcGIS перевіряє, чи об’єкти збігаються: help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//… параграф "Обробка кластерів".
Єнс

Дякую за вашу відповідь, @Jens. Але я боюся, що це не те, що я хочу.
mfdev

Ці лінії представляють мережу? Чи є між ними топологічні зв’язки?
липень

Це не повинно бути мережею і, можливо, не має топологічних відносин.
mfdev

Відповіді:


4

Я вважаю, що кінцеві випадки часто будуть винятками, які не можна програмувати машиною. Я працював з подібними проблемами, і вони завжди вимагали певної кількості ручного редагування. На що вам потрібно налаштуватись, - це винятки, які створюються випадком і подають їх у систему управління роботою кінцевому користувачеві.


Дещо подібний приклад цього можна побачити тут: vividsolutions.com/jcs JCS проходить довгий шлях до автоматизації взаємозв'язку геометрії, але також включає в себе ручний QA для геометрій, який не може повністю злитися. vividsolutions.com/… Побудовано з нього та дозволяє отримати QA та додає відстеження випусків для складних геометрій.
DPierce

1
Всі топологічні рішення не можуть бути автоматизовані програмуванням, і на великих підприємствах такі рішення розробляються аналогічно прикладу, оскільки випадання конфляції може мати великі та циклічний характер зі складною транспортною геометрією з високою швидкістю зміни.
lewis

2

Вам знадобиться терпіння допуску та відхилення повороту для цього алгоритму (я припускаю, що у вас вже є терпіння припуску).

Проектуйте головну точку від вихідної лінії до опорної лінії. Розбийте опорну лінію в цій прогнозованій точці.

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

Тепер візьміть непереформований шматок і спроектуйте кінцеву точку на початкову опорну лінію. Виконайте ту саму процедуру, що і раніше ... пройдіть джерело від кінцевої точки до першої вершини, щоб знайти напрямок руху. Розбийте опорну лінію в кінцевій точці проекту та пройдіть кожну, щоб виявити, чи напрямок руху від прогнозованої кінцевої точки знаходиться в межах допуску повороту. Якщо так, використовуйте цей фрагмент опорного рядка для нормального застосування алгоритму.

Пам'ятайте, що в цей момент ви використовуєте лише неперетворений фрагмент, тому ви не будете перетинатися з перетворенням точки голови.

Нарешті, при необхідності з’єднайте дві отримані шматки лінії: головна точка перетворюється шматок від прогнозованої точки голови до непроформованої точки розриву, а потім у кінцевій точці трансформується шматок від непереформованої точки розриву до прогнозованої кінцевої точки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.