Geopy库简介
借助Python包Geopy可以实现经纬度地理位置转换。
转换原理:借助第三方API平台,为了方便,Geopy将市面上提供经纬度转换的第三方平台的接口都分别封装在一个类中,借助Geopy模块来调用。
Geopy作为一个专注于地理位置处理包,能实现地理编码、逆地理编码功能;此外,还可以根据两个经纬度坐标计算在地球上的最短距离。
2. 具体用法
2.1. 地理编码
使用地理编码功能时,需要借助Geopy中的geocoders模块
,Geopy把所有第三方API封装到Geocoders中。
例如:选用 OpenStreetMap 平台上提供的 Nominatim 地理编码器,因为可以免费供我们使用,不需要申请 API ,但缺点是限流,限额,不能大规模频繁访问,否则会返回 403,429错误代码。
代码语言:javascript复制from geopy.geocoders import Nominatim
geolocator=Nominatim()
location= geolocator.geocode("北京市海淀区西二旗北路")
print(location.address)
print(location.latitude,location.longitude)
结果:
代码语言:javascript复制西二旗北路, 东北旺村, 海淀区, 北京市, 102208, 中国
40.056793 116.305811
2.2 逆地理编码
代码语言:javascript复制from geopy.geocoders import Nominatim
geolocator=Nominatim()
location= geolocator.reverse("40.056793 116.305811")#reverse 方法接收经纬度字符串作为输入,纬度在前,经度在后
print(location.address)
结果:
代码语言:javascript复制1#, 西二旗北路, 东北旺村, 海淀区, 北京市, 102208, 中国
2.3 根据两个经纬度坐标计算距离
Geopy的距离计算功能包含在distance
中
计算距离有两种:大圆距离与大地线距离(默认,更精确)。
- 大圆算法将地球简化为一个圆球,其计算的距离是球面上过两点的大圆距离。
- 大地线使用目前国际通用的方法,用旋转椭球面表示地球,其计算的是两点在椭球面上的最短距离。
2.3.1 大地线距离
代码语言:javascript复制from geopy import distance
dist = distance.distance((45.768189, 126.6212835), (39.907359, 116.3912630)) #返回一个distance对象,其中包含单位转换方法
dist.kilometers #单位转换,获取km,m或者英里为单位的距离
结果:
代码语言:javascript复制1058.4645051382365
等效的显式方法:
代码语言:javascript复制dist = distance.geodesic((45.768189, 126.6212835), (39.907359, 116.3912630))
dist.meters
结果:
代码语言:javascript复制1058464.5051382366
大地线的计算速度很慢,如果可以容忍一定的误差(0.5%以内),完全可以采用大圆算法替代。
大圆距离计算时间大约只有前者的1/20.
2.3.2 大圆距离
代码语言:javascript复制gc = distance.great_circle((45.768189, 126.6212835), (39.907359, 116.3912630)) #同样返回distance对象
gc.km
1057.0946827378225
print(f'{(dist.km - gc.km) / dist.km:%}')
0.129416% #哈尔滨到北京的大圆与大地线距离之间有0。13%的差异
内容参考:
(24条消息) Python 库 Geopy 的用法,经纬度坐标转换、经纬度距离计算_小张Python-CSDN博客_geopy
使用 geopy 处理地址和坐标数据 | GNSS Helper