博主搞了半天haversin公式倒腾距离之后,发现有现成的geopy可用,且网上查到的一些函数用法似乎有改变,遂整理如下
已知两点经纬度求距离
from geopy.distance import geodesic
nodes = [(-22.8981672 -43.2219277),(-22.8835229 -43.2631313)]
#以千米为单位求两点之间距离
distance = geodesic(nodes[0],nodes[1]).kilometers
print('两点之间距离:',distance)
注意以上geodesic是geopy2.0版本的用法,在1.19版本中使用时为VincentyDistance
已知两点经纬度求方向角(方向角:与正北顺时针夹角)
from math import sin, cos, atan2, pi
#计算方向角
def calcu_azimuth(lat1, lon1, lat2, lon2):
lat1_rad = lat1 * pi / 180
lon1_rad = lon1 * pi / 180
lat2_rad = lat2 * pi / 180
lon2_rad = lon2 * pi / 180
y = sin(lon2_rad - lon1_rad) * cos(lat2_rad)
x = cos(lat1_rad) * sin(lat2_rad) - sin(lat1_rad) * cos(lat2_rad) * cos(lon2_rad - lon1_rad)
brng = atan2(y, x) / pi * 180
return float((brng + 360.0) % 360.0)
已知一点经纬度、方向角、目标距离,求下一点经纬度
import geopy
node = (-22.8981672 -43.2219277)
distance = 1
#把int型距离转化为geopy.distance的格式,单位千米
distance = geopy.distance.geodesic(distance)
#计算下一个点坐标
next = distance.destination(node, direction)
next_node = (next.latitude, next.longitude)
print(next_node)
haversin公式已知两点坐标求距离,精度逊于geopy
from math import cos, asin, sqrt, pi
#haversin公式求球面两点间距离
def distance(lat1, lon1, lat2, lon2):
r = 6731 # 地球平均半径
p = pi / 180
a = 0.5 - cos((lat2 - lat1) * p) / 2 + cos(lat1 * p) * cos(lat2 * p) * (1 - cos((lon2 - lon1) * p)) / 2
return 2 * r * asin(sqrt(a))
geopy的根据坐标查地址,或者根据地址查坐标功能,博主没有用到,需要的移步这篇:Python地理位置信息库geopy的使用(一):基本使用
更多geopy应用见:geopy官方文档