Cálculo de la distancia entre dos puntos utilizando la latitud, la longitud y la altitud (elevación)

Estoy tratando de calcular la distancia entre dos puntos, usando la longitud de latitud y la altitud (elevación).

Estaba usando la fórmula de euklides para obtener mi distancia:

D=√((Long1-Long2)²+(Lat1-Lat2)²+(Alt1-Alt2)²) 

Mis puntos son coordenadas geográficas y, por supuesto, la altitud es mi altura sobre el mar. Solo tengo lat y lng, estoy usando GOOGLE API Elevation para obtener mi altitud.

Estoy desarrollando una aplicación que calcula mi distancia recorrida (en mis esquís). Cada aplicación que he usado, obtiene la distancia recorrida con la altitud incluida. Como #Endomondo o #Garmin, no puedo obtener mi distancia en el espacio 2D porque las distancias reales van a variar de las que he devuelto.

¿Qué fórmula sería la mejor para calcular mi distancia? Por supuesto con altitud incluida.

    Estoy escribiendo mi aplicación en Python, con PostGis.

    Utilicé la solución provista por John Moutafis pero no obtuve una respuesta correcta. La fórmula necesita algunas correcciones. Obtendrá la conversión de coordenadas de Polar a Cartesiano (x, y, z) en http://electron9.phys.utk.edu/vectors/3dcoordinates.htm . Use la fórmula anterior para convertir coordenadas esféricas (Polar) a cartesianas y calcular la distancia euclidiana.

    Utilicé el siguiente c # en una aplicación de consola. Teniendo en cuenta que sigue dummy lat long

      double lat_1 = 18.457793 * (Math.PI / 180); double lon_1 = 73.3951930277778 *(Math.PI/180); double alt_1 = 270.146; double lat_2 = 18.4581253333333 * (Math.PI / 180); double lon_2 = 73.3963755277778 * (Math.PI / 180); double alt_2 = 317.473; const Double r = 6376.5 *1000;//redius of earth in meaters double x_1 = r * Math.Sin(lon_1) * Math.Cos(lat_1); double y_1 = r * Math.Sin(lon_1) * Math.Sin(lat_1); double z_1 = r * Math.Cos(lon_1); double x_2 = r * Math.Sin(lon_2) * Math.Cos(lat_2); double y_2 = r * Math.Sin(lon_2) * Math.Sin(lat_2); double z_2 = r * Math.Cos(lon_2); double dist = Math.Sqrt((x_2 - x_1) * (x_2 - x_1) + (y_2 - y_1) * (y_2 - y_1) + (z_2 - z_1) * (z_2 - z_1)); 

    Puedes obtener el cálculo correcto al traducir tus coordenadas de Polar (long, lat, alt) a Cartesian (x, y, z) :

    • Dejar:
      polar_point_1 = (long_1, lat_1, alt_1)
      y
      polar_point_2 = (long_2, lat_2, alt_2)
    • Traduzca cada punto a su equivalente cartesiano utilizando esta fórmula:

       x = alt * cos(lat) * sin(long) y = alt * sin(lat) z = alt * cos(lat) * cos(long) 

      y tendrás p_1 = (x_1, y_1, z_1) y p_2 = (x_2, y_2, z_2) puntos respectivamente.

    • Finalmente usa la fórmula euclidiana:

       dist = sqrt((x_2-x_1)**2 + (y_2-y_1)**2 + (z_2-z_1)**2) 

    EDITAR 2018: Desde esta respuesta, compuse un ejemplo de estilo de preguntas y respuestas para responder preguntas similares (incluido este como ejemplo): Cómo calcular la distancia 3D (incluida la altitud) entre dos puntos en GeoDjango

    Puede calcular la distancia entre las coordenadas planas en, por ejemplo, metros utilizando el paquete geopy o la fórmula de Vincenty , pegando las coordenadas directamente. Supongamos que el resultado es d metros. Entonces, la distancia total recorrida es sqrt(d**2 + h**2) donde h es el cambio en la elevación en metros.