Алгоритм зміщення широти / довготи на деяку кількість метрів


108

Я шукаю алгоритм, який при дачі пари широти і довготи та перекладу векторів у метри в декартових координатах (x, y) дав би мені нову координату. Сорт, як зворотний гаверсин. Я також міг би працювати з дистанцією та перетворенням заголовка, але це, ймовірно, буде повільніше і не настільки точно. В ідеалі алгоритм повинен бути швидким, оскільки я працюю над вбудованою системою. Точність не є критичною, в межах 10 метрів було б добре.


Отже, ви б чудово моделювали землю як сферу?
андарм

1
Так, це було б добре, оскільки я очікував, що <1 км зміщення.
Томас О

Відповіді:


107

Якщо ваші переміщення не надто великі (менше декількох кілометрів), і ви не маєте рації на полюсах, скористайтеся швидкою та брудною оцінкою, що 111,111 метрів (111,111 км) у напрямку y - 1 градус (широта) і 111,111 * cos (широта) метрів у напрямку x дорівнює 1 градусу (довготи).


3
@Thomas: Насправді ти можеш бути дуже близько до полюсів. Я перевірив обчислення UTM за допомогою рівних переміщень x- та y-1400 м (тому загальний зсув становить 2 км). Результати хороші до 8,6 метрів або вище. Найгірша широта (для цього напрямку та величини зміщення) - 81 градус: наближення насправді стає більш точним, коли ви рухаєтесь на північ, і його помилка залишається нижче 10 метрів, поки ви не перейдете за 89,6 градусів!
whuber

60
Між іншим, ці магічні числа 111,111 легко запам'ятати, знаючи деяку історію: французи спочатку визначили метр так, що 10 ^ 7 метрів буде відстань вздовж Паризького меридіана від екватора до північного полюса. Таким чином, 10 ^ 7/90 = 111 11111 метрів дорівнює одній ступені широти, ніж у можливостях французьких геодезистів два століття тому.
whuber

3
Тож із формулою, якби я хотів перемістити + 100 м у напрямку у, наприклад, 10,0 N, 10,0 E, я би просто додавав 100/111111? Якщо рухатись у напрямку x + 100m, чи було би 100 ÷ (111,111 × (cos 10))? Просто переконуюсь, що я маю це право.
Томас О

5
@Thomas Так, це правильно. Зверніть увагу, як друга формула розширює видиме зсув x (завдяки діленню на число менше 1), оскільки слід, оскільки міра довготи стає меншою, коли ви рухаєтесь до полюсів від екватора. Єдина потенційна помилка - переконатися, що ви та ваша програмна платформа домовились про те, що означає "cos": краще інтерпретувати cos (10) як косинус 10 градусів , а не 10 радіанів! (Якщо ні, 10 градусів = 10 * пі / 180 радіанів ілюструє просте перетворення.) На цьому етапі код, запропонований @haakon_d, повинен мати для вас повний сенс.
whuber

7
Хтось спробував відредагувати цю відповідь, щоб замінити "метри" на "км". Вони, ймовірно, читали кому "," в європейському розумінні десяткової крапки. Я дотримуюсь американської конвенції (яка, на мою думку, теж конвенція міжнародних публікацій) про використання комами для розділення довгих цифр рядків на групи з трьох і десяткової точки "." замість коми. (Це використання чітко показано в попередніх коментарях.) Щоб уникнути неоднозначності, я відредагував відповідь, щоб чітко показати, що означають кома та крапка.
whuber

56

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

Але якщо ви готові прийняти помилки, що перевищують 10 м, для зміщення балів понад 200 м, ви можете скористатися спрощеним розрахунком плоскої землі. Я думаю, що помилки все ще будуть менше 50 м для зрушень до 1 км.

 //Position, decimal degrees
 lat = 51.0
 lon = 0.0

 //Earth’s radius, sphere
 R=6378137

 //offsets in meters
 dn = 100
 de = 100

 //Coordinate offsets in radians
 dLat = dn/R
 dLon = de/(R*Cos(Pi*lat/180))

 //OffsetPosition, decimal degrees
 latO = lat + dLat * 180/Pi
 lonO = lon + dLon * 180/Pi 

Це має повернути:

 latO = 51,00089832
 lonO = 0,001427437

7
Я просто хочу зазначити, що це ідентично відповіді, яку я надавав, за винятком того, що ви замінили моє значення 111,111 метра за градус на 111,319,5. Ваше значення дещо краще на високих широтах, але дещо гірше в нижніх широтах (від 0 до приблизно 40 градусів). Будь-яке значення відповідає заявленим вимогам точності.
whuber

1
+1 для надання коду. Зауважте, що це більш точно, ніж ви підозрюєте (помилка, як правило, менше 5 м за 2000 м).
whuber

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

1
Це чудовий момент: ми неявно припустили, що зміщення x є принаймні близьким до справжнього схід-захід, а зміщення y - близько північ-південь. Якщо ні, то їх потрібно перетворити на еквівалентні переміщення EW та NS (а не лише "східні" та "північні"), перш ніж обчислити їх lat-lon-еквіваленти.
whuber

Параметр d відстані формули рівняння авіації знаходиться в радіанах, наприклад (відстань / радіус Землі).
користувач1089933

23

Я вважаю, що Aviation Formulary, тут чудово підходить для таких типів формул і алгоритмів. Для вашої проблеми ознайомтеся з "lat / long заданими радіалами та відстані": тут

Зауважте, що цей алгоритм може бути трохи надто складним для вашого використання, якщо ви хочете знижувати використання тригонометричних функцій тощо.


Спасибі за це - виглядає ідеально. Хоча я не можу зрозуміти, чи відстань у метрах чи якесь інше вимірювання.
Томас О

2

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

falt_coordinate = latlon_to_utm(original_koordinate)
new_flat_coordinate = flat_coordinate + (x,y)
result_coordinate = utm_to_latlon(new_flat_coordinate)

де (x, y) - бажане зміщення.

Вам не потрібно використовувати utm, будь-яку плоску систему координат, яка має сенс у вашій місцевості.

З яким програмним забезпеченням ви працюєте?


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