計算地球表面兩點之間的距離

2021-09-11 11:03:23 字數 2775 閱讀 6198

def geodistance(lng1, lat1, lng2, lat2):

# lng1,lat1,lng2,lat2 = (120.12802999999997,30.28708,115.86572000000001,28.7427)

lng1, lat1, lng2, lat2 = map(radians, [float(lng1), float(lat1), float(lng2), float(lat2)]) # 經緯度轉換成弧度

dlon = lng2 - lng1

dlat = lat2 - lat1

a = sin(dlat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dlon / 2) ** 2

distance = 2 * asin(sqrt(a)) * 6371 * 1000 # 地球平均半徑,6371km

distance = round(distance / 1000, 3)

return distance

lng1, lat1, lng2, lat2 = (120.12802999999997, 30.28708, 115.86572000000001, 28.7427)

print(geodistance(lng1, lat1, lng2, lat2))

# 返回 446.721 千公尺

在座標轉換中,除了正投影和反投影的轉換之外,還有不同基準面之間的轉換。基準面的轉換有很多種轉換模型,常見的有三引數和七引數轉換。三引數的轉換主要是通過對x,y,z三個座標軸進行平移操作,適用於小範圍的地方座標基準之間的轉換,對精度要求不高。相對於三引數轉換,七引數轉換在基基礎上增加對x/y/z三個座標軸的旋轉分量以及縮放比例。

我們對乙個經緯度座標進行七引數轉換時,一般先將其轉換到地心座標系(以地心為原點的三維座標系),再利用空間直角座標系的轉換公式,使用七引數對其進行轉換,將轉換的結果再轉回經緯度座標,即可完成橢球基準的轉換。

經緯度座標轉地心空間直角座標

轉換公式:

&x = (n+h)\cos b \cos l\\ &y=(n+h)\cos b \sin l\\ &z = (n * (1-c^2)+h)\sin b \end \right.

⎩⎪⎨⎪⎧​

​x=(

n+h)

cosb

cosly=

(n+h

)cos

bsinlz

=(n∗

(1−c

2)+h

)sinb​

其中 &an = \frac\\ &w = \sqrt\\ &e^2 = \frac \end \right.

⎩⎪⎪⎪⎪⎨

⎪⎪⎪⎪

⎧​​a

n=wa

​w=1

−e2sin2b

​e2=

a2a2

−b2​

​ 基準轉換

七引數基準轉換的原理同三維座標系之間的座標轉換原理類似,這裡給出公式如下:

[ xb

ybzb

]=[△

x0△y

0△z0

]+(1

+m)[

1ωz−

ωy−ω

z1ωx

ωy−ω

x1][

xaya

za

]\left[ \begin x_b\\ y_b\\ z_b \end \right]= \left[ \begin \******** x_0\\ \******** y_0\\ \******** z_0 \end \right]+(1+m) \left[ \begin 1 & \omega_z & -\omega_y\\ -\omega_z & 1 & \omega_x\\ \omega_y & -\omega_x & 1 \end \right] \left[ \begin x_a\\ y_a\\ z_a \end \right]

⎣⎡​xb​

yb​z

b​​⎦

⎤​=⎣

⎡​△x

0​△y

0​△z

0​​⎦

⎤​+(

1+m)

⎣⎡​1

−ωz​

ωy​​

ωz​1

−ωx​

​−ωy

​ωx​

1​⎦⎤

​⎣⎡​

xa​y

a​za

​​⎦⎤

​其中,△

x\******** x

△x,△

y\******** y

△y, △

z\******** z

△z為平移分量,m

mm為縮放分量,m

mm為縮放係數,ω

\omega

ω為旋轉矩陣。

地心空間直角座標轉經緯度

將地心空間座標轉換為經緯度座標,公式如下:

&l=arctan(\frac)\\ &b=arctan(\frac})\\ &h=\frac-n(1-e^2) \end \right.

⎩⎪⎪⎪⎪⎪

⎪⎨⎪⎪

⎪⎪⎪⎪

⎧​​l

=arc

tan(

xy​)

b=ar

ctan

((x2

+y2)

[n(1

−e2)

+h]​

z(n+

h)​)

h=sinbz​

−n(1

−e2)

計算兩點之間的距離

檔名稱 test.cpp 完成日期 2013年10月17日 版本號 v1.0 輸入描述 輸入兩個橫縱座標 問題描述 輸入兩個橫縱座標,求兩點之間的距離 程式輸出 兩點之間的距離 問題分析 通過輸入兩個橫縱座標,求兩點之間的距離 演算法設計 略 include includeusing namespa...

如何計算兩點之間距離

如何計算兩點之間距離 路線規劃提供了獲取路線距離的方法,見mkrouteplan 類的 getdistance 方法。如果是計算任意兩點的距離,有兩種方法 一種利用勾股定理計算,適用於兩點距離很近的情況 一種按標準的球面大圓劣弧長度計算,適用於距離較遠的情況。static double def pi...

計算樹中兩點之間的距離

題目 要求倒不麻煩,乙個節點資料不重複的二叉樹,設其元素型別為整型,找出最小元素與最大元素之間的路徑長度,即兩個節點之間的連線距離,不是節點個數。過程 以陣列元素來構建二叉樹,自定義陣列為,以 2 i 1,2 i 2 表示子節點,構建樹結構如圖 public class t 二叉樹基本節點資料 tr...