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

существует неизвестное местоположение цели (координаты широты и долготы). У меня есть 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 ответов


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

первый шаг, на самом деле не охваченный записью Википедии, заключается в преобразовании ваших координат lat/long в Декартовые координаты:

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-в плоскости X-Y.

для перевода просто вычесть 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 в 2 компоненты: один параллельный p1a (который идет по нашей оси x) и один перпендикулярный p1a (который идет по нашей оси y в системе координат "b").

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

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

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

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


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

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



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

  • центр A, радиус d1
  • центр A, радиус d2
  • центр A, радиус d3
  • центр B, радиус d1
  • центр B, радиус d2
  • центр B, радиус d3
  • центр C, радиус d1
  • центр C, радиус d2
  • центр C, радиус 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}

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