2015-10-13 10 views
1

Я пытаюсь рассчитать расстояние между двумя точками, используя широту долготы и высоту (высота).Расчет расстояния между двумя точками с использованием долготы широты и высоты (высота)

Я использовал euklides формулу для того, чтобы получить мое расстояние:

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

Мои точки географические координаты и высоту конечно моя высота над уровнем моря. У меня только lat и lng, я использую GOOGLE API Elevation, чтобы получить свою высоту.

Я разрабатываю приложение, которое вычисляет пройденное расстояние (на моих лыжах). Каждое приложение, которое я использовал, получает дистанцию ​​с включенной высотой. Подобно #Endomondo или #Garmin, я не могу получить свое расстояние в 2D-пространстве, потому что истинные расстояния будут отличаться от тех, которые я вернул.

Какая формула будет лучше всего рассчитать мое расстояние? Конечно, с включенной высотой.

Я пишу свое приложение на Python с PostGis.

+2

Почему вы не хранить координаты в PostGIS и использовать функцию ST_distance? –

+0

Существует несколько статей, в которых оспаривается утверждение, что Garmin и другие используют высоту в своих расчетах. http://www.trailhunger.com/info/articles/garmin-distance-calculation. В уравнении, которое у вас есть, вы комбинируете градусы и метры. – e4c5

+0

Эй, @sebb вы нашли ответы полезными? –

ответ

1

Вы можете рассчитать расстояние между плоскими координатами в, скажем, метрах, используя формулу geopy или формулу Vincenty's, непосредственно вставляя координаты. Предположим, что результат равен d метров. Затем общее пройденное расстояние составляет sqrt(d**2 + h**2), где h - изменение высоты в метрах.

2

Вы можете получить правильный расчет, переводя свои координаты от Polar (long, lat, alt) к Cartesian (x, y, z):

  • Пусть:
    polar_point_1 = (long_1, lat_1, alt_1)
    и
    polar_point_2 = (long_2, lat_2, alt_2)
  • Перевести каждую точку на это декартово эквивалент, используя эту формулу :

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

    и у вас будет p_1 = (x_1, y_1, z_1) и p_2 = (x_2, y_2, z_2) баллов соответственно.

  • Наконец использовать формулу евклидовой:

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

какая единица измерения должна быть в таком расстоянии и как вы собираетесь конвертировать ее обратно в метры? – AngryDuck

+0

@AngryDuck Поскольку мы используем API Elevation Google, 'alt' находится в метрах, поэтому' dist' будет в метрах. –

+0

ОК круто, пока моя высота в метрах, я могу просто взять значение 'dist', и он будет в метрах? – AngryDuck

1

Я использовал решение, предложенное Джоном Moutafis, но я не получил право answer.The формула нуждается некоторые корректировки. Вы получите преобразование координат от полярного к картезианскому (x, y, z) в http://electron9.phys.utk.edu/vectors/3dcoordinates.htm. Используйте приведенную выше формулу для преобразования сферических координат (Полярный) в декартову и вычисления евклидова расстояния.

Я использовал следующий C# в консольном приложении. Учитывая следующий фиктивный Lat долго

 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)); 

 Смежные вопросы

  • Нет связанных вопросов^_^