![](/img/trans.png)
[英]Huge Difference in result when calculating distance b/w two points using longitude-latitude
[英]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.