簡體   English   中英

使用緯度經度和高度(海拔)計算兩點之間的距離

[英]Calculating distance between two points using latitude longitude and altitude (elevation)

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

我正在使用 euklides 公式來獲得我的距離:

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

我的點是地理坐標,當然高度是我在海面上的高度。 我只有 lat 和 lng,我正在使用 GOOGLE API Elevation 來獲取我的海拔高度。

我正在開發一個應用程序來計算我的行駛距離(在我的滑雪板上)。 我使用過的每個應用程序都會以包含的海拔高度行駛。 像#Endomondo 或#Garmin 一樣,我無法在 2D 空間中獲得我的距離,因為真實距離將與我返回的距離不同。

哪個公式最適合計算我的距離? 當然包括海拔高度。

我正在用 Python 和 PostGis 編寫我的應用程序。

您可以使用geopy包或Vincenty公式直接粘貼坐標,以米為單位計算平面坐標之間的距離。 假設結果是d米。 然后行駛的總距離是sqrt(d**2 + h**2)其中h是以米為單位的海拔變化。

編輯 2019:自從有了這個答案,我編寫了一個問答風格的例子來回答類似的問題(包括這個例子): 如何計算 GeoDjango 中兩點之間的 3D 距離(包括高度)

排序:

我們需要使用Haversine公式Vicenty公式計算兩點之間的二維大圓距離,然后我們可以將其與兩點之間的高度差(delta)結合起來計算它們之間的歐幾里德距離,如下所示:

dist = sqrt(great_circle((lat_1, lon_1), (lat_2, lon_2)).m**2, (alt_1 - alt_2)**2)

該解決方案假定高度以米為單位,因此也將great_circle的結果轉換為米。


您可以通過將坐標從Polar (long, lat, alt) 轉換笛卡爾 (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)

我使用了 John Moutafis 提供的解決方案,但我沒有得到正確的答案。公式需要一些更正。 您將在http://electron9.phys.utk.edu/vectors/3dcoordinates.htm獲得從極坐標到笛卡爾坐標 (x, y, z) 的轉換。 使用上述公式將球坐標(極坐標)轉換為笛卡爾坐標並計算歐幾里得距離。

我在控制台應用程序中使用了以下 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; // Radius of Earth in metres

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM