经纬度

经度

纬度

赤道的纬度为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)

你可能感兴趣的:(经纬度)