Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
根据经纬度计算两地之间的距离的公式_两个经纬度算距离软件,希望能够帮助你!!!。
地球赤道周长:40075.02千米 ,地球平均半径:6371.393千米,圆周率:3.9793(以上是百度的结果)
直接套公式,简洁高效。
球面余弦定理:
d = R × arccos ( cos ( 纬度 A ) cos ( 纬度 B ) cos ( 经度 A − 经度 B ) + sin ( 纬度 A ) sin ( 纬度 B ) ) d= R \times \arccos\bigg(\cos(纬度A) \cos(纬度B) \cos(经度A-经度B) + \sin(纬度A) \sin(纬度B)\bigg) d=R×arccos(cos(纬度A)cos(纬度B)cos(经度A−经度B)+sin(纬度A)sin(纬度B))
Haversine公式推导过程:
https://zhuanlan.zhihu.com/p/?utm_source=wechat_session
https://www.douban.com/note//
import math R = 6371.393 Pi = math.pi jingduA, weiduA= 116., 39. jingduB, weiduB = 121., 31. a = (math.sin(math.radians(weiduA/2-weiduB/2)))**2 b = math.cos(weiduA*Pi/180) * math.cos(weiduB*Pi/180) * (math.sin((jingduA/2-jingduB/2)*Pi/180))**2 L = 2 * R * math.asin((a+b)**0.5) # 因为地球平均半径用的是千米,所以最后结果的单位也是千米 print(L)
最近涉及到用sql计算距离,来填补一下。以下代码Oracle和MySQL都能执行
-- 最后结果的单位是米 with tmp as( select 103.20887 lng1, 30. lat1, 104. lng2, 31. lat2, acos(-1) pi from dual ) select d.lng1, d.lat1, d.lng2, d.lat2 ,2**asin(sqrt(sin(d.deltaLat/2)*sin(d.deltaLat/2)+cos(d.lat1*pi/180)*cos(d.lat2*pi/180)*sin(d.deltaLng/2)*sin(d.deltaLng/2))) as dist_asin ,*acos(sin(d.lat1*pi/180)*sin(d.lat2*pi/180)+cos(d.lat1*pi/180)*cos(d.lat2*pi/180)*cos(d.deltaLng)) as dist_acos from ( select c.lng1,c.lat1, c.lng2, c.lat2, c.pi, (c.lat1*pi/180-c.lat2*pi/180) as deltaLat,(c.lng1*pi/180-c.lng2*pi/180) as deltaLng from tmp c ) d;
思路:以地心为原点,建立空间直角坐标系。将地球上任意两点的经纬度坐标转为直角坐标。然后用向量求出夹角余弦值,最后用角度求弧长。
误差:地球不是完美的球体。
经纬度与空间直角坐标系的对应关系 | 地球两地间距离的示意图 |
---|---|
由此可以得到由经纬度到空间直角坐标系的对应关系:
x = cos ( 纬度 ) cos ( 经度 ) , y = cos ( 纬度 ) sin ( 经度 ) , z = sin ( 纬度 ) x = \cos(纬度)\cos(经度) \ ,y = \cos(纬度) \sin(经度) \ ,z = \sin(纬度) x=cos(纬度)cos(经度) ,y=cos(纬度)sin(经度) ,z=sin(纬度)
由两个点对应的向量求出向量夹角:
cos θ = V A ⋅ V B ∣ V A ∣ × ∣ V B ∣ θ = arccos ( V A ⋅ V B ∣ V A ∣ ⋅ ∣ V B ∣ ) \cos\theta = \frac{V_A \cdot V_B }{|V_A| \times |V_B|} \uad \uad \theta=\arccos(\frac{V_A \cdot V_B }{|V_A| \cdot |V_B|}) cosθ=∣VA∣×∣VB∣VA⋅VBθ=arccos(∣VA∣⋅∣VB∣VA⋅VB)
假设地球为理想球体:半径大约3959英里(6371.393千米) 。这个数字是地心到地球表面所有各点距离的平均值,平均半径=(赤道半径×2+极半径)/3。
则由半径和夹角可求弧长:
弧长 l = π R θ 180 = α R 弧长l=\pi R \frac{\theta}{180} = \alpha R 弧长l=πR180θ=αR
其中 θ \theta θ是圆心角度数(角度制),R是半径,L是圆心角弧长, α \alpha α是圆心角度数(弧度制)。 α = π θ / 180 \alpha = \pi \theta/180 α=πθ/180
import math R = 6371.393 Pi = math.pi # A地 jingduA, weiduA= 116., 39. xA = math.cos(math.radians(weiduA))*math.cos(math.radians(jingduA)) yA = math.cos(math.radians(weiduA))*math.sin(math.radians(jingduA)) zA = math.sin(math.radians(weiduA)) # B地 jingduB, weiduB = 121., 31. xB = math.cos(weiduB*Pi/180) * math.cos(jingduB*Pi/180) yB = math.cos(weiduB*Pi/180) * math.sin(jingduB*Pi/180) zB = math.sin(weiduB*Pi/180) # 开始计算 cosalpha = (xA*xB+yA*yB+zA*zB)/((xA*xA+yA*yA+zA*zA)*(xB*xB+yB*yB+zB*zB))**0.5 alpha = math.acos(cosalpha) L = alpha * R # 单位是千米 print(L)
从理论上讲,全部的经线长度都相等,无论沿哪条经线南北极之间的距离都相等。
所以从理论上算,一条经线的长度=平均半径乘以圆周率= π \pi πR=20016.3千米。所以,在同一条经线上,纬度差1度对应的实际距离是 π \pi πR/180=111.908千米。
赤道周长: m。
因为赤道被分为了360度,所以在赤道上经度差1度对应的实际距离是/360=.5m=111.3195km;对于纬度不为0的情况,在同一条纬线上,经度差1度对应的实际距离是111.3195 × \times ×cos纬度。
(另一种理论计算结果应该是111.2018 × \times ×cos纬度,因为平均半径R × \times ×cos纬度等于该纬度对应的小圆半径(一条纬线就是一个圈,小圆说的就是这个圈),1度所对应的弧长就是2 π \pi πR × \times ×cos纬度/360=111.2018 × \times ×cos纬度)
总结,对于日常的学习生活来说,相差一度取111km、圆周率用3.14就够了,不必太过较真。
x = r sin θ cos ϕ y = r sin θ sin ϕ z = r cos θ ⟺ r = x 2 + y 2 + z 2 θ = arccos ( z r ) = arcsin ( x 2 + y 2 r ) = arctan ( x 2 + y 2 z ) ϕ = arccos ( x r sin θ ) = arcsin ( y r sin θ ) = arctan ( y x ) \begin{aligned} \begin{aligned} x & =r\sin\theta \cos\phi \\ y & =r\sin\theta \sin\phi \\ z & =r\cos\theta \end{aligned} \uad \Longleftrightarrow \uad \begin{aligned} r & =\sqrt{x^2+y^2+z^2} \\ \theta & =\arccos(\frac{z}{r})=\arcsin(\frac{\sqrt{x^2+y^2}}{r})=\arctan(\frac{\sqrt{x^2+y^2}}{z}) \\ \phi & =\arccos(\frac{x}{r\sin\theta})=\arcsin(\frac{y}{r\sin\theta})=\arctan(\frac{y}{x}) \end{aligned} \end{aligned} xyz=rsinθcosϕ=rsinθsinϕ=rcosθ⟺rθϕ=x2+y2+z2=arccos(rz)=arcsin(rx2+y2)=arctan(zx2+y2)=arccos(rsinθx)=arcsin(rsinθy)=arctan(xy)
径向距离 r ∈ [ 0 , + ∞ ] , 倾角 ( 天顶角 ) θ ∈ [ 0 , π ] , 方位角 ϕ ∈ [ 0 , 2 π ] 径向距离r \in [0,+\infty ],\ 倾角(天顶角)\theta \in [0,\pi ],\ 方位角\phi \in [0,2\pi] 径向距离r∈[0,+∞], 倾角(天顶角)θ∈[0,π], 方位角ϕ∈[0,2π]
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章