2010-05-11 12 views
22

Existe una ubicación de destino desconocida (coordenadas de latitud y longitud). Tengo 3 pares de coordenadas de latitud y longitud y para cada par una distancia en kilómetros hasta la ubicación objetivo. ¿Cómo puedo calcular las coordenadas de la ubicación objetivo?Trilateración utilizando 3 puntos de latitud y longitud, y 3 distancias

Por ejemplo, decir que tengo los siguientes puntos de datos

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

Lo que me gustaría es lo que las tripas de la función que detiene como entrada y devuelve 37.417959,-121.961954 como buscar una salida como?

Entiendo cómo calcular la distancia entre dos puntos, desde http://www.movable-type.co.uk/scripts/latlong.html Entiendo el principio general de que con tres círculos se obtiene exactamente un punto de superposición. Lo que estoy confundido es la matemática necesaria para calcular ese punto con esta entrada.

+2

El término es "triangulación" – skaffman

+10

Parece realmente ser "triangulación" http: // en .wikipedia.org/wiki/Trilateration como "triangulación" implica ángulos – nohat

+0

Solución: http://gis.stackexchange.com/questions/66/trilateration-using-3-latitude-and-longitude-points-and-3-dstances – zengr

Respuesta

38

Wikipedia da una discusión muy profunda de la álgebra aquí: http://en.wikipedia.org/wiki/Trilateration

El primer paso, en realidad no cubierto en la entrada de Wikipedia, es convertir su coordenadas lat/long para coordenadas cartesianas:

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) 

(Para mantener las cosas simples cálculos, he eludido por lo que estamos trabajando en unidades de "radios de la Tierra" en lugar de kilómetros)

para sus datos, consigo

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

El siguiente paso, que está cubierto en el artículo de Wikipedia, es para simplificar las coordenadas, traduciendo los puntos para que p0 esté en el origen y luego gire para que p1 esté en el eje X y p2 esté en el plano XY.

Para la traducción, simplemente restar P0 de p1 y 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 

La rotación no es mucho más difícil. p1b obtiene (x, y) = (d, 0), donde d es solo la distancia desde el origen a p1a (teorema de Pitágoras)

Para p2b, necesitamos resolver p2a en dos componentes: uno paralelo a p1a (que va en nuestro eje x), y uno perpendicular a p1a, (que va en nuestro eje y en el sistema de coordenadas "b").

Para hacer esto, necesitamos un vector unitario en la dirección de p1a, que es solo p1a * (1/d). Tome el producto punto de este vector unitario (llámelo p1a_hat, si lo desea) con p2a, y esa es la coordenada X para p2b. El artículo de Wikipedia llama a este valor "I"

Ahora la coordenada Y es fácil. La longitud desde el origen hasta p2 no puede cambiar bajo la transformación de coordenadas. Así que calcule la longitud de p2a usando el teorema de Pitágoras, luego use el teorema de Pitágoras "hacia atrás" para obtener lo que la coordenada Y de p2b tiene que ser para mantener la longitud igual. Esa es la variable que Wikipedia llama "J". (Tenga en cuenta que hay una ambigüedad que dejaré para que descubra si J es positivo o negativo).

Ahora tiene las tres variables d, I y J, que el artículo de Wikipedia usa para el cálculo. Ahora puedes convertirlos a kilómetros multiplicando por el radio de la tierra. Debería poder hacer el resto del cálculo desde aquí

(Incidentalmente, Wikipedia ofrece un cálculo diferente para la transformación de coordenadas. Me gusta evitar los triggers cuando sea posible).

+0

Mientras hacía un poco más de hurgar esta mañana, me di cuenta de que la forma convencional de convertir lat/lon a coordenadas cartesianas (llamadas ECEF), es hacer de X una función de cos (lon) y Y una función del pecado (lon). Tenía estos revertidos. No hace ninguna diferencia en el cálculo final, solo significa que estaba usando un sistema de coordenadas no convencional para el paso intermedio. Pero ahora he corregido las ecuaciones a la forma más convencional. –

+1

Por cierto, para obtener la mayor precisión, deberá tener en cuenta la altitud y el hecho de que las coordenadas lat/lon se basan en una superficie de referencia elipsoidal en lugar de esférica. Vea aquí: http://en.wikipedia.org/wiki/ECEF y aquí: http://www.satsleuth.com/GPS_ECEF_Datum_transformation.htm –

+0

Parece que invertí el cos (lat) y el sin (lat) también. Era tarde. Lo siento. Ahora arreglado. (De hecho hice el cálculo correctamente, pero me equivoqué al transcribir las ecuaciones) –

0

considerar las siguientes 9 círculos Los puntos A, B, C y distancias D1, D2, D3

  • centro de A, radio D1
  • centro de A, el radio d2
  • centro de una , radio d3
  • Centro de B, el radio d1
  • Centro de B, radio d2
  • Centro de B, radio d3
  • Centro de C, radio D1
  • Centro de C, radio d2
  • Centro de C, radio d3

Estos son sus posibles círculos. Ahora podemos sacrificar a estos, porque sabemos si d1 se utiliza en una, no va a ser utilizado en B.

Esto hace que sus posibles entradas, en donde A1 significa círculo con centro en A y radio D1:

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

Debería poder convertir lat/long a X, Y, Z conociendo el radio de la tierra, y las distancias desde la distancia curva a lo largo de la corteza terrestre hasta la distancia recta, y desde allí puede ver cuáles de ellos se cruzan en un punto común. Recuerde permitir pequeños márgenes de error debido a la imperfección del flotador.

+0

Ya sé qué radio va con qué centro; lo que necesito son las fórmulas para calcular el punto de intersección dados los datos lat/lon como entradas – nohat

+0

Editaré la publicación en breve con algunos punteros. – corsiKa

Cuestiones relacionadas