2015-10-13 329 views
1

我正在嘗試使用緯度經度和海拔(海拔)來計算兩點之間的距離。使用緯度經度和海拔(海拔)計算兩點之間的距離

我使用euklides公式爲了得到我的距離:

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

我點地理座標和海拔ofcourse我高度海拔。 我只有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由於我們使用Google Elevation API,因此'alt'的單位是米,因此'dist'的單位是米。 –

+0

確定很酷,只要我的高度是以米爲單位,我可以取'dist'的值,它將以米爲單位? – AngryDuck

1

我用約翰Moutafis提供的解決方案,但我沒有得到的權利answer.The公式需要一些修正。您將獲得座標從極座標到笛卡爾(x,y,z)的轉換,格式爲http://electron9.phys.utk.edu/vectors/3dcoordinates.htm。 使用上述公式將球座標(極座標)轉換爲笛卡爾座標並計算歐幾里德距離。

我在控制檯應用程序中使用了以下c#。 考慮以下虛擬緯度長

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