Трилатерация с использованием 3 точек широты и долготы и 3 расстояний - PullRequest
24 голосов
/ 11 мая 2010

Существует неизвестное местоположение цели (координаты широты и долготы). У меня есть 3 пары координат широты и долготы, и для каждой пары расстояние в километрах до местоположения цели. Как я могу рассчитать координаты целевого местоположения?

Например, скажем, у меня есть следующие точки данных

37.418436,-121.963477   0.265710701754km
37.417243,-121.961889   0.234592423446km
37.418692,-121.960194   0.0548954278262km

Что мне хотелось бы, так это то, как бы выглядела кишка функции, которая принимает это в качестве входных данных и возвращает 37.417959,-121.961954 в качестве выходных данных?

Я понимаю, как рассчитать расстояние между двумя точками, из http://www.movable -type.co.uk / scripts / latlong.html Я понимаю общий принцип, что с тремя кругами вы получаете ровно одну точку перекрытия Что мне не нравится, так это математика, необходимая для вычисления этой точки с помощью этого ввода.

Ответы [ 4 ]

40 голосов
/ 19 мая 2010

Википедия дает довольно подробное обсуждение алгебры здесь: http://en.wikipedia.org/wiki/Trilateration

Первый шаг, который на самом деле не описан в записи в Википедии, - преобразовать ваши координаты широты / долготы в декартовы:

x0 = cos( lon0 ) * cos( lat0 ) , y0 = sin( lon0 ) * cos( lat0 ) , z0 = sin( lat0 )
x1 = cos( lon1 ) * cos( lat0 ) , y1 = sin( lon1 ) * cos( lat1 ) , z1 = sin( lat1 )
x2 = cos( lon2 ) * cos( lat0 ) , y2 = sin( lon2 ) * cos( lat2 ) , z2 = sin( lat2 )

(Для простоты расчетов я выдумал, поэтому мы работаем в единицах "радиусов Земли", а не в километрах)

За ваши данные я получаю

         p0            p1           p2
X   -0.420442596  -0.420430618  -0.42040255
Y   -0.67380418   -0.673826567  -0.673825967
Z    0.607631426   0.607614889   0.607634975

Следующим шагом, который описан в статье в Википедии, является упрощение координат путем перевода точек так, чтобы p0 находилось в начале координат, а затем вращение так, чтобы p1 находился на оси X, а p2 находился в XY. самолет.

Для перевода просто вычтите p0 из p1 и p2:

    p0a      p1a          p2a
X   0    1.19779E-05   4.00462E-05
Y   0   -2.23864E-05  -2.17865E-05
Z   0   -1.65372E-05   3.5486E-06

Вращение не намного сложнее. p1b получает (x, y) = (d, 0), где d - просто расстояние от начала координат до p1a (теорема Пифагора)

Для p2b нам нужно разделить p2a на две составляющие: одну, параллельную p1a (которая идет по нашей оси x), и одну, перпендикулярную к p1a (которая идет по нашей оси y в системе координат "b").

Для этого нам понадобится единичный вектор в направлении p1a, который равен просто p1a * (1 / d). Возьмите скалярное произведение этого единичного вектора (назовите его p1a_hat, если хотите) с p2a, и это координата X для p2b. Статья в Википедии называет это значение «я»

Теперь координата Y проста. Длина от начала координат до p2 не может измениться при преобразовании координат. Поэтому вычислите длину p2a, используя теорему Пифагора, а затем используйте теорему Пифагора «назад», чтобы получить координату Y для p2b, чтобы длина была одинаковой. Это переменная, которую Википедия называет «J». (Обратите внимание, что я оставлю вам двусмысленность, чтобы выяснить, является ли J положительным или отрицательным).

Теперь у вас есть три переменные d, I и J, которые статья Wikipedia использует для расчета. Теперь вы можете перевести их обратно в километры, умножив на радиус Земли. Вы должны быть в состоянии сделать остальную часть расчета отсюда

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

2 голосов
/ 05 августа 2010

Я задал этот вопрос на недавно созданной ГИС-бирже стеков, и там также получил несколько хороших ответов.

https://gis.stackexchange.com/questions/66/trilateration-using-3-latitude-and-longitude-points-and-3-distances

В принятом ответе есть (предположительно) рабочее решение на Python:

https://gis.stackexchange.com/questions/66/trilateration-using-3-latitude-and-longitude-points-and-3-distances/415#415

1 голос
/ 12 мая 2010
0 голосов
/ 11 мая 2010

Рассмотрим следующие 9 кругов Точки A, B, C и расстояния d1, d2, d3

  • Центр А, радиус d1
  • Центр А, радиус d2
  • Центр А, радиус d3
  • Центр B, радиус d1
  • Центр B, радиус d2
  • Центр B, радиус d3
  • Центр С, радиус d1
  • Центр С, радиус d2
  • Центр С, радиус d3

Это ваши возможные круги. Теперь мы можем отбросить их, потому что мы знаем, что если d1 используется на A, он не будет использоваться на B.

Это делает ваши возможные записи, где A1 означает круг с центром A и радиусом D1:

  • {A1, B2, C3}
  • {A1, B3, C2}
  • {A2, B1, C3}
  • {A2, B3, C1}
  • {A3, B1, C2}
  • {A3, B2, C1}

Вы должны быть в состоянии преобразовать широту / долготу в X, Y, Z, зная радиус Земли, и расстояния от искривленного расстояния вдоль земной коры до прямого расстояния, и оттуда вы можете увидеть, какой из они пересекаются в общей точке. Не забудьте учесть небольшие погрешности из-за несовершенства поплавка.

...