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
ybz
b⎦
⎤=⎣
⎡△x
0△y
0△z
0⎦
⎤+(
1+m)
⎣⎡1
−ωz
ωy
ωz1
−ωx
−ωy
ωx
1⎦⎤
⎣⎡
xay
aza
⎦⎤
其中,△
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...