Proyectando un punto en un camino

Supongamos que tengo una matriz ordenada que contiene puntos (lat, lon) describen una ruta, y también tengo un punto (lat, lon) describe mi ubicación actual.

¿Cómo puedo proyectar el punto en la ruta (y colocar el punto en el lugar apropiado de la matriz)?

Lo que intenté es simplemente buscar los dos puntos más cercanos y asumir que están en medio de ellos. Es una buena suposición, pero a veces falla.

¿Cuál sería una buena manera de hacer esto?

Yo lo veo así:

resumen de segmento de línea

  • p0,p1 son puntos finales de segmento de línea de ruta
  • p es tu posicion
  • Punto más cercano q' en línea en cartessian 3D
  • q es q' corregido por proyección esférica

Asi que:

  1. Convertir puntos a coordenadas cartessianas 3D.
  2. calcular la distancia perpendicular del punto y la línea

    • q'=p0+(dot(p-p0,p1-p0)*(p1-p0)/(|p-p0|*|p1-p0|))
    • perpendicular_distance = |p-q'|
  3. Encontrar segmento con menor distancia perpendicular

    Y utilízalo solo para el rest de balas.

  4. calcular q

    Si usa la esfera en lugar del elipsoide, entonces ya conoce el radio, si no, entonces calcule algebraicamente el radio o use el promedio:

     r=0.5*(|p0-(0,0,0)|+|p1-(0,0,0)|) 

    Suponiendo (0,0,0) es el centro de la Tierra. También puedes ser más preciso si pesas por posición:

     w=|q'-p0|/|p1-p0| r=(1-w)*|p0-(0,0,0)|+w*|p1-(0,0,0)| 

    Ahora solo corrige la posición de q'

     q=q'*r/|q'| 

    establezca el vector q' como q con tamaño r si no es lo suficientemente obvio. También |p0-(0,0,0)|=|p0| Obviamente, pero quería asegurarme de que entiendes cómo lo conseguí …

  5. convertir q de cartesiano a coordenadas esféricas

[Notas]

  • |a| es el tamaño del vector a hecho como: |a|=sqrt(ax*ax+ay*ay+az*az)
  • dot(a,b) es un producto puntual de los vectores a,b hecho como: dot(a,b)=(ab)=ax*bx+ay*by+az*bz

    Si su ruta no tiene una forma demasiado compleja, puede utilizar la búsqueda binaria para encontrar el segmento más cercano. Para la comparación de distancias no necesita el sqrt

Encuentra el segmento de la ruta que está más cerca de la posición actual.

Distancia del punto a una línea