借助Python包Geopy可以实现经纬度地理位置转换。
转换原理:借助第三方API平台,为了方便,Geopy将市面上提供经纬度转换的第三方平台的接口都分别封装在一个类中,借助Geopy模块来调用。
Geopy作为一个专注于地理位置处理包,能实现地理编码、逆地理编码功能;此外,还可以根据两个经纬度坐标计算在地球上的最短距离。
使用地理编码功能时,需要借助Geopy中的geocoders模块
,Geopy把所有第三方API封装到Geocoders中。
例如:选用 OpenStreetMap 平台上提供的 Nominatim 地理编码器,因为可以免费供我们使用,不需要申请 API ,但缺点是限流,限额,不能大规模频繁访问,否则会返回 403,429错误代码。
from geopy.geocoders import Nominatim
geolocator=Nominatim()
location= geolocator.geocode("北京市海淀区西二旗北路")
print(location.address)
print(location.latitude,location.longitude)
结果:
西二旗北路, 东北旺村, 海淀区, 北京市, 102208, 中国
40.056793 116.305811
from geopy.geocoders import Nominatim
geolocator=Nominatim()
location= geolocator.reverse("40.056793 116.305811")#reverse 方法接收经纬度字符串作为输入,纬度在前,经度在后
print(location.address)
结果:
1#, 西二旗北路, 东北旺村, 海淀区, 北京市, 102208, 中国
Geopy的距离计算功能包含在distance
中
计算距离有两种:大圆距离与大地线距离(默认,更精确)。
from geopy import distance
dist = distance.distance((45.768189, 126.6212835), (39.907359, 116.3912630)) #返回一个distance对象,其中包含单位转换方法
dist.kilometers #单位转换,获取km,m或者英里为单位的距离
结果:
1058.4645051382365
等效的显式方法:
dist = distance.geodesic((45.768189, 126.6212835), (39.907359, 116.3912630))
dist.meters
结果:
1058464.5051382366
大地线的计算速度很慢,如果可以容忍一定的误差(0.5%以内),完全可以采用大圆算法替代。
大圆距离计算时间大约只有前者的1/20.
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
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。