Розташування проекту на шляху (велике коло)


9

Я шукав цей веб-сайт вже досить багато годин, і я все ще намагаюся знайти рішення свого питання. Моя мета полягає в тому, щоб, маючи шлях в OSM та моєму розташуванні (lat / lon координати), я хочу знайти найближче місце (lat / lon координати) на цьому шляху. Точка може бути в будь-якому місці шляху, не обмежуючись пунктами, які використовуються для визначення шляху.

Тому я думаю про наступний алгоритм:

  1. Розділіть шлях окремими краями, кожен край з'єднує лише дві точки.
  2. Виберіть найближчий край.
  3. Проектуйте моє місце розташування на цей край.

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

Також дуже схоже питання, з якого я не можу отримати правильні чи перевірені розрахунки:

Існує також деяка інформація від доктора Матха з цього приводу. Однак я не можу знайти алгоритм для обчислення місця на кроці 3. Оскільки я не торкався (векторної) алгебри довгий час, я не зовсім розумію логіку в цих відповідях.

Чи може хтось показати алгоритм для цього? Зі мною добре підходить рішення будь-якої розумної мови програмування.


1
Оскільки це здається критичним для вашого "відмови" від інших питань, будь ласка, детальніше розробимо "спроектувати моє місцезнаходження на цей край". Виступ може бути не на краю. Я вважаю , що це питання буде розглянуто в інших питаннях. (Молодці, для дослідження, BTW.)
Мартін


@MartinF це питання обчислює відстань від точки до лінії, але не найближчу точку на самій лінії.
буке

На сайті gis.stackexchange.com/a/23500/3195 є рішення, хоча це , можливо, важко зрозуміти.
Мартін Ф

Ага, дякую, я оновив реф. Ні. 3. «Рішення» у цьому конкретному питанні посилається на загальне пояснення проблемного поля. Хоча це може бути достатньо для обґрунтованих математиків, я не зовсім розумію математику в цій роботі.
букет

Відповіді:


7

Використання сферичної моделі землі може надати адекватну точність і привести до простих швидких розрахунків.

Перетворіть усі координати в орієнтовані на землю (3D) декартові координати. Наприклад, формула

(cos(lon)*cos(lat), sin(lon)*cos(lat), sin(lat))

зроблю. (Він використовує міру відстані, в якій радіус Землі - одна одиниця, що зручно.)

Запис X0 = (x0, y0, z0) для точки початку і X1 = (x1, y1, z1) для точки призначення, які визначають велике коло (за умови, що X0 відрізняється від X1, і два не є діаметрально протилежними), нехай U - нормалізований поперечний добуток X0 і X1. Це обчислюється в два етапи:

V = (xv, yv, zv) = (y0*z1 - z0*y1, z0*x1 - x0*z1, x0*y1 - y0*x1)

Довжина V дорівнює

|V| = sqrt(xv^2 + yv^2 + zv^2)

Нормалізація тягнеться V до одиничної довжини:

U = (xu, yu, zu) = V / |V| = (xv/|V|, yv/|V|, zv/|V|).

Орієнтована 3D-відстань між будь-якою точкою X = (x, y, z) та площиною цього великого кола - лише крапковий добуток X із Z, заданий

d = X * U = x*xu + y*yu + z*zu

Найближча точка з точки зору відстані на земній поверхні - така, яка є найближчою до площини: таким чином, вона має найменше абсолютне значення d .

Малюнок

На цьому малюнку зображено велике коло (чорним кольором), яке визначається двома білими точками та 2000 випадковими точками на кулі, пофарбованою та заштрихованою відповідно до їх абсолютної відстані 3D до площини цього великого кола; тобто | d |.

Знайшовши найближчу точку, спроектуйте її на велике коло, спочатку спроектувавши його на площину великого кола (у 3D), а потім простягнувши його радіально назовні до земної поверхні. Проекція просто віднімає d * U:

X' = (x', y', z') = X - d*U = (x - d*xu, y - d*yu, z - d*zu).

Радіальна проекція просто перенормує X 'так само, як V було перенормовано на U:

X'' = X' / |X'|.

(Це буде проблематично, якщо | X '| = 0, що відбувається, коли найближча точка є одним з полюсів великого кола. Включіть у код тест для цієї умови, якщо це могло статися, і вирішуйте його окремо, використовуючи знак d, щоб визначити, який полюс.)

За бажанням перетворіть координати X '' назад у (lat, lon) за допомогою звичайних формул .


Одне питання. Розглянемо не надто незвичний випадок, коли ми можемо вибрати будь-які X1 та X0 (на великому колі), з точки зору точності, краще вибрати X1 та X0 впритул чи далеко один від одного (знову ж таки за умови, що X0 відрізняється від X1 та двоє не діаметрально протилежні)?
користувач189035

1
@ user189035 Виберіть їх на 90 градусів. Коли вони дуже близькі, їх перехресний добуток є чисельно невизначеним: у відніманнях спостерігається велика кількість скасування, що призводить до втрати значних цифр.
whuber
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.