Ubicación del proyecto en un camino (gran círculo)

9

He estado buscando en este sitio SE durante varias horas y todavía estoy luchando por encontrar una solución a mi pregunta. Mi objetivo es que, dada una forma en OSM y mi ubicación (coordenadas lat / lon), quiero encontrar la ubicación más cercana (coordenadas lat / lon) en ese camino. El punto puede estar en cualquier lugar del camino, no limitado a los puntos utilizados para definir el camino.

Entonces estoy pensando en el siguiente algoritmo:

  1. Trayectoria separada en bordes separados, cada borde conecta solo dos puntos.
  2. Seleccione el borde más cercano.
  3. Proyectar mi ubicación en ese borde.

Ahora hay muchas preguntas sobre el cálculo de la distancia entre una ubicación y una ruta:

También una pregunta muy similar de la que no puedo hacer los cálculos correctos o verificados:

También hay información del Dr. Math sobre ese tema. Sin embargo, parece que no puedo encontrar un algoritmo para calcular la ubicación en el paso 3. Como no he tocado el álgebra (vector) en bastante tiempo, no entiendo la lógica de esas respuestas.

¿Alguien puede mostrar un algoritmo para hacer esto? Una solución en cualquier lenguaje de programación razonable está bien para mí.

bouke
fuente
1
Dado que parece crítico para su "rechazo" de las otras preguntas, explique "proyectar mi ubicación en ese borde". La proyección puede no estar en el borde. Creo que ese problema se aborda en las otras preguntas. (Bien hecho, por la investigación, por cierto.)
Martin F
@MartinF esa pregunta calcula la distancia desde un punto a una línea, pero no el punto más cercano en la línea misma.
bouke
No es una solución al gis.stackexchange.com/a/23500/3195 pesar de que es tal vez difícil de comprender.
Martin F
Ah sí, gracias, he actualizado la referencia no. 3. La 'solución' en esa pregunta particular se vincula con una explicación general del campo del problema. Si bien esto podría ser suficiente para matemáticos bien fundamentados, no entiendo muy bien las matemáticas en ese documento.
bouke

Respuestas:

7

El uso de un modelo esférico de la tierra puede dar una precisión adecuada y lleva a cálculos simples y rápidos.

Convierta todas las coordenadas en coordenadas cartesianas centradas en la tierra (3D). Por ejemplo, la fórmula

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

lo haré (Utiliza una medida de distancia en la cual el radio de la Tierra es una unidad, lo cual es conveniente).

Escribir X0 = (x0, y0, z0) para el punto de inicio y X1 = (x1, y1, z1) para el punto de destino, que definen el gran círculo (siempre que X0 sea distinto de X1 y los dos no sean diametralmente opuestos), sea ​​U el producto cruzado normalizado de X0 y X1. Esto se calcula en dos pasos:

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

La longitud de V es

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

La normalización estira V a la longitud de la unidad:

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

La distancia 3D orientada entre cualquier punto X = (x, y, z) y el plano de este gran círculo es solo el producto de punto de X con Z, dado por

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

El punto más cercano en términos de la distancia en la superficie de la tierra es el que está más cerca del plano: por lo tanto, tiene el valor absoluto más pequeño de d .

Figura

Esta figura muestra un gran círculo (en negro) determinado por los dos puntos blancos y 2000 puntos aleatorios en la esfera coloreados y sombreados de acuerdo con su distancia 3D absoluta al plano de ese gran círculo; es decir, | d |.

Habiendo encontrado un punto más cercano, proyecte hacia el gran círculo proyectándolo primero al plano del gran círculo (en 3D) y luego extendiéndolo radialmente hacia la superficie de la tierra. La proyección simplemente resta d * U:

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

La proyección radial simplemente renormaliza X 'de la misma manera que V se renormalizó a U:

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

(Esto será problemático si | X '| = 0, que ocurre cuando el punto más cercano es uno de los polos del gran círculo. Incluya una prueba en el código para esta condición, si pudiera suceder, y trátela por separado, usando el signo de d para identificar qué polo).

Si lo desea, convierta las coordenadas de X '' de nuevo a (lat, lon) usando las fórmulas habituales .

whuber
fuente
Una pregunta. Considere el caso no demasiado inusual en el que podemos elegir cualquier X1 y X0 (en el gran círculo), desde un punto de vista de precisión, es mejor elegir X1 y X0 cerca o muy lejos (una vez más, siempre que X0 sea distinto de X1 y los dos no son diametralmente opuestos)?
user189035
1
@ user189035 Selecciónelos a 90 grados de separación. Cuando están muy cerca, su producto cruzado es numéricamente incierto: hay mucha cancelación en las restas, lo que lleva a la pérdida de cifras significativas.
whuber