经度
纬度
赤道的纬度为0°,将行星平分为南半球和北半球。
纬度是指某点与地球球心的连线和地球赤道面所成的线面角,其数值在0至90度之间。位于赤道以北的点的纬度叫北纬,记为N,位于赤道以南的点的纬度称南纬,记为S。
纬度数值在0至30度之间的地区称为低纬地区,纬度数值在30至60度之间的地区称为中纬地区,纬度数值在60至90度之间的地区称为高纬地区。
赤道、南回归线、北回归线、南极圈和北极圈是特殊的纬线。
纬度线投射在图上看似水平的平行线,但实际上是不同半径的圆。有相同特定纬度的所有位置都在同一个纬线上。
经纬度变化规律
1、本初子午线(0°经线)以东是东经,越往东,经线度数越大,一直到东经180°,东经为正数,用“E”作代号;
2、本初子午线(0°经线)以西是西经,越往西,经线度数越大,一直到西经180°,西经为负数,用“W”作代号;
3、赤道以南是南纬,越往南,纬度度数越大,一直到南极90°,南纬为负数,用“S”作代号;
4、赤道以北是北纬,越往北,纬度度数越大,一直到北极90°,北纬为正数,用“N”作代号;
纬度有南到北[-90,90]
经度有西到东[-180,180]
经纬度单位换算
度(DDD):E 108.90593度 N 34.21630度
如何将度(DDD): 108.90593度换算成度分秒(DMS)东经E 108度54分22.2秒?转换方法是将108.90593整数位不变取108(度),用0.9059360=54.3558,取整数位54(分),0.355860=21.348再取整数位21(秒),故转化为108度54分21秒.
同样将度分秒(DMS):东经E 108度54分22.2秒 换算成度(DDD)的方法如下:108度54分22.2秒=108+(54/60)+(22.2/3600)=108.90616度
因为计算时小数位保留的原因,导致正反计算存在一定误差,但误差影响不是很大。1秒的误差就是几米的样子。GPS车友可以用上述方法换算成自己需要的单位坐标。
根据经纬度计算球面曲线距离
地球是一个近乎标准的椭球体,它的赤道半径为6378.140千米,极半径为 6356.755千米,平均半径6371.004千米。如果我们假设地球是一个完美的球体,那么它的半径就是地球的平均半径,记为R。
reat-circle distance
Haversine formula
值得一提的是,维基百科推荐使用Haversine公式,理由是Great-circle distance公式用到了大量余弦函数, 而两点间距离很短时(比如地球表面上相距几百米的两点),余弦函数会得出0.999...的结果, 会导致较大的舍入误差。而Haversine公式采用了正弦函数,即使距离很小,也能保持足够的有效数字。 以前采用三角函数表计算时的确会有这个问题,但经过实际验证,采用计算机来计算时,两个公式的区别不大。 稳妥起见,这里还是采用Haversine公式。
https://www.cnblogs.com/softfair/p/distance_of_two_latitude_and_longitude_points.html
from math import radians, cos, sin, asin, sqrt
#比如A点经纬度(110.0123, 23.32435),B点经纬度(129.1344,25.5465),求AB两点之间的距离
def haversine(lon1, lat1, lon2, lat2): # 经度1,纬度1,经度2,纬度2 (十进制度数)
"""
Calculate the great circle distance between two points
on the earth (specified in decimal degrees)
"""
# 将十进制度数转化为弧度
lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
# haversine公式
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * asin(sqrt(a))
r = 6371 # 地球平均半径,单位为公里
return c * r * 1000
利用上面的代码可以做如下测试:
纬度不变,只变化经度:
lon1, lat1, lon2, lat2 = -100.00001,-10.00000,-100.00000,-10.00000
print(haversine(lon1, lat1, lon2, lat2)) # 1.095057m
lon1, lat1, lon2, lat2 = -100.00010,-10.00000,-100.00000,-10.00000
print(haversine(lon1, lat1, lon2, lat2)) # 10.95057
lon1, lat1, lon2, lat2 = -100.00100,-10.00000,-100.00000,-10.00000
print(haversine(lon1, lat1, lon2, lat2)) # 109.5057
lon1, lat1, lon2, lat2 = -100.01000,-10.00000,-100.00000,-10.00000
print(haversine(lon1, lat1, lon2, lat2)) # 1095.057
lon1, lat1, lon2, lat2 = -101.00000,-10.00000,-100.00000,-10.00000
print(haversine(lon1, lat1, lon2, lat2)) # 109505.7
1纬度分为60纬分,每一纬分再分为60纬秒以及秒的小数。
平均:
- 1纬度 = 109505.7m=大约111km
- 1纬分 =109505.7/60m=1825.095m=大约1.83km
- 1纬秒 = 109505.7/3600m=大约30.4m
lon1, lat1, lon2, lat2 = -100.00000,-10.00001,-100.00000,-10.00000
print(haversine(lon1, lat1, lon2, lat2)) # 1.11195m
lon1, lat1, lon2, lat2 = -100.00000,-10.00010,-100.00000,-10.00000
print(haversine(lon1, lat1, lon2, lat2)) # 11.1195m
lon1, lat1, lon2, lat2 = -100.00000,-10.00100,-100.00000,-10.00000
print(haversine(lon1, lat1, lon2, lat2)) # 111.195m
lon1, lat1, lon2, lat2 = -100.00000,-10.01000,-100.00000,-10.00000
print(haversine(lon1, lat1, lon2, lat2)) # 1111.95m
lon1, lat1, lon2, lat2 = -100.00000,-11.00000,-100.00000,-10.00000
print(haversine(lon1, lat1, lon2, lat2)) # 111195m
1经度分为60经分,每一经分再分为60经秒以及秒的小数。
平均:
- 1经度 = 111195m=大约111km
- 1经分 = 111195/60m=1853.25m=大约1.85km
- 1经秒 = 111195/3600m=大约30.9m
注意上面经纬度中,1纬分和1经分的变化大约是1.85km,而1.852公里/1节=1海里/小时=1.852公里/小时=1.852km/小时。
地球的子午线总长度大约40008km。
中分纬度算法(Mid-Latitude Sailing)