2009-07-10 13 views
9

Actualmente estoy tratando con datos GPS combinados con una medición precisa de la altitud. Quiero calcular la distancia entre dos puntos consecutivos. Hay mucho de información sobre calcular la distancia entre dos puntos usando el elipsoide WGS84, y así sucesivamente.Teniendo en cuenta la altitud al calcular la distancia geodésica

Sin embargo, no he encontrado ninguna información que tome Altitude cambios en la cuenta para este cálculo de distancia.

¿Alguien sabe acerca de algunos sitios web, documentos, libros, etc. que describe dicho método? gracias

edit: Las extensiones geográficas de Sql Server 2008 también omiten la información de altitud cuando se calcula la distancia.

+0

No he visto las ecuaciones WGS84, así que no estoy escribiendo esto como una respuesta. Dicho esto, me parece que deberías poder ajustar un radio o dos para hacer que tus puntos de medición sean la "nueva" superficie. Esto probablemente funcione mejor si sus mediciones de altitud están basadas en GPS; si se basa en medios mecánicos (por ejemplo, presión del aire), entonces el "nivel del mar" puede tener muy poca relación con el modelo de geoide. – kdgregory

+0

¿Alguna vez se le ocurrió una buena solución para esto? – lnafziger

Respuesta

0

Sugeriría que a cualquier distancia donde use el WGS84 le daría una precisión significativamente mejor que la diferencia de altitud no importará. Y a lo largo de cualquier distancia donde importa la diferencia en altitudes, probablemente solo debas usar una aproximación en línea recta.

0

Para hacer esto, el primer problema que debe abordar es cómo definir el cambio de altitud. Las ecuaciones normales funcionan porque están en una superficie bidimensional, sin embargo, agregar la tercera dimensión significa que la definición simple de la distancia más corta ya no es aplicable, por ejemplo, ahora la tercera dimensión es 'en juego' la distancia más corta podría atravesar el original elipsoide. Es un poco rápido y sucio, pero su mejor solución podría ser suponer que la tasa de cambio de alltitude es constante a lo largo de la ruta 2D original en el elipsoide. Luego puede calcular la distancia 2D como una longitud, calcular la tasa de cambio de altitud y luego simplemente usar Pitágoras para calcular el aumento de longitud, siendo un lado del triángulo la distancia 2D y la altitud la segunda.

6

Implementé una función de distancia WGS84 usando la media de la altitud de inicio y final como la altitud constante. Si está seguro de que habrá relativamente poca variación de altitud a lo largo de su camino, esto funciona aceptablemente bien (el error es relativo a la diferencia de altitud de sus dos puntos LLA).

Aquí está mi código (C#):

/// <summary> 
    /// Gets the geodesic distance between two pathpoints in the current mode's coordinate system 
    /// </summary> 
    /// <param name="point1">First point</param> 
    /// <param name="point2">Second point</param> 
    /// <param name="mode">Coordinate mode that both points are in</param> 
    /// <returns>Distance between the two points in the current coordinate mode</returns> 
    public static double GetGeodesicDistance(PathPoint point1, PathPoint point2, CoordMode mode) { 
     // calculate proper geodesics for LLA paths 
     if (mode == CoordMode.LLA) { 
      // meeus approximation 
      double f = (point1.Y + point2.Y)/2 * LatLonAltTransformer.DEGTORAD; 
      double g = (point1.Y - point2.Y)/2 * LatLonAltTransformer.DEGTORAD; 
      double l = (point1.X - point2.X)/2 * LatLonAltTransformer.DEGTORAD; 

      double sinG = Math.Sin(g); 
      double sinL = Math.Sin(l); 
      double sinF = Math.Sin(f); 

      double s, c, w, r, d, h1, h2; 
      // not perfect but use the average altitude 
      double a = (LatLonAltTransformer.A + point1.Z + LatLonAltTransformer.A + point2.Z)/2.0; 

      sinG *= sinG; 
      sinL *= sinL; 
      sinF *= sinF; 

      s = sinG * (1 - sinL) + (1 - sinF) * sinL; 
      c = (1 - sinG) * (1 - sinL) + sinF * sinL; 

      w = Math.Atan(Math.Sqrt(s/c)); 
      r = Math.Sqrt(s * c)/w; 
      d = 2 * w * a; 
      h1 = (3 * r - 1)/2/c; 
      h2 = (3 * r + 1)/2/s; 

      return d * (1 + (1/LatLonAltTransformer.RF) * (h1 * sinF * (1 - sinG) - h2 * (1 - sinF) * sinG)); 
     } 

     PathPoint diff = new PathPoint(point2.X - point1.X, point2.Y - point1.Y, point2.Z - point1.Z, 0); 
     return Math.Sqrt(diff.X * diff.X + diff.Y * diff.Y + diff.Z * diff.Z); 
    } 

En la práctica hemos encontrado que la diferencia de altitud rara vez se hace una gran diferencia, nuestros caminos son típicamente 1-2 km de largo con la altitud que varía del orden de 100 metros y vemos aproximadamente ~ 5m de cambio en promedio versus el uso del elipsoide WGS84 sin modificar.

Editar:

Para añadir a esto, si lo hace esperar grandes cambios de altitud, puede convertir su coordenadas WGS84 a ECEF (tierra centrada tierra fija) y evaluar trayectorias en línea recta como se muestra en la parte inferior de mi función. Conversión de un punto a ECEF es simple de hacer:

/// <summary> 
    /// Converts a point in the format (Lon, Lat, Alt) to ECEF 
    /// </summary> 
    /// <param name="point">Point as (Lon, Lat, Alt)</param> 
    /// <returns>Point in ECEF</returns> 
    public static PathPoint WGS84ToECEF(PathPoint point) { 
     PathPoint outPoint = new PathPoint(0); 

     double lat = point.Y * DEGTORAD; 
     double lon = point.X * DEGTORAD; 
     double e2 = 1.0/RF * (2.0 - 1.0/RF); 
     double sinLat = Math.Sin(lat), cosLat = Math.Cos(lat); 

     double chi = A/Math.Sqrt(1 - e2 * sinLat * sinLat); 
     outPoint.X = (chi + point.Z) * cosLat * Math.Cos(lon); 
     outPoint.Y = (chi + point.Z) * cosLat * Math.Sin(lon); 
     outPoint.Z = (chi * (1 - e2) + point.Z) * sinLat; 

     return outPoint; 
    } 

Edición 2:

me preguntó acerca de algunas de las otras variables en mi código:

// RF is the eccentricity of the WGS84 ellipsoid 
public const double RF = 298.257223563; 

// A is the radius of the earth in meters 
public const double A = 6378137.0; 

LatLonAltTransformer es una clase Solía para convertir de coordenadas LatLonAlt a coordenadas ECEF y define las constantes anteriores.

+0

No creo que el interlocutor preguntara sobre situaciones en las que la altitud es efectivamente constante. Creo que el objetivo era descubrir la distancia de estilo de gran círculo entre dos puntos donde las altitudes difieren significativamente entre los dos puntos. – jprete

+0

Tal vez no lo aclare, pero mi solución promedia las altitudes de los dos puntos y las llamadas son constantes. La evaluación de la distancia geodésica utilizando dos altitudes diferentes consume mucho tiempo y es difícil, especialmente cuando una aproximación obtiene muy buenos resultados. –

+0

Creo que el interlocutor original quiere capturar el ligero cambio en la distancia resultante de los cambios de altitud; es por eso que usar el promedio, o max alt, o min alt, no es una solución. Las distancias en línea recta tampoco son una solución al problema de diferencia de altitud, porque esas líneas rectas no tienen el perfil de ascenso/descenso adecuado que cabría esperar diciendo: "Viajé 60 millas y cambié la altitud en 20000 pies en esa hora". P.ej. si el punto final de tu a está por debajo del horizonte, entonces lo primero que hace el camino es hacer un túnel debajo del suelo. – jprete

0

Para empezar, necesita un modelo que le indique cómo cambia la altitud en la línea entre los dos puntos. Sin ese modelo, no tienes una definición consistente de la distancia entre dos puntos.

Si tuvieras un modelo lineal (viajar 50% de la distancia entre los puntos también significa que fuiste al 50% de la altitud), entonces probablemente puedas pretender que todo fue un triángulo rectángulo; es decir, actúa como si el mundo fuera plano para determinar cómo el cambio de altitud afecta la distancia. La distancia a lo largo del suelo es la base, el cambio de altitud es la altura del triángulo, y la hipotenusa es la distancia de viaje real estimada de un punto a otro.

Si desea refinarlo aún más, puede observar que el modelo anterior es perfectamente bueno para distancias infinitesimales, lo que significa que puede recorrer los deltas individuales de la distancia, cálculo-estilo, cada vez usando la altitud actual para calcular la distancia al suelo y luego usar la misma relación trigonométrica para calcular la contribución del cambio altitudinal a la distancia recorrida. Probablemente haga esto en un bucle for() con 10 a 100 piezas del segmento, y posiblemente por prueba y error, averigüe la cantidad de piezas necesarias para obtener dentro del épsilon del valor verdadero. También sería posible calcular la integral de línea para calcular la distancia real entre los dos puntos bajo este modelo.

0

Es probable que no le importe la altitud para grandes separaciones de distancia 2D. Entonces, si el dist que obtiene ha terminado, digamos 20 (o quizás 50) km, entonces, ¿a quién le importa la diferencia de altitud (depende de su caso de necesidades)? Bajo decir 20 km, alimentar en la adición de pitagóricos simple a la diferencia de altitud. Aliméntalo suavemente.

Distance between two geo-points?

Cuestiones relacionadas