转载本文请联系小张Python公众号.在做地图可视化的时候,我们需要提供经纬度坐标,但是一般来说,我们通常只会得到地理位置。比如北京东大街302号的狗不理包子店。在可视化之前,需要转换经纬度坐标。有几个还可以,直接用谷歌地图手动转换经纬度查询就可以了,但是在实际场景中,需要转换的数据量可能有几百甚至上千,如果手动的话,会很头疼。坐标?本文将解决这个问题,并介绍两种用Python实现的方法。1、调用第三方API最常见的方式是调用第三方API,如百度、高德地图等服务平台,提供相应的功能接口。这种技术非常成熟、准确、稳定,而且密钥是免费的。本教程以百度为例(高德的用法类似),介绍其用法1.1。使用百度账号登录百度地图控制台百度地图Openplatform1.2,创建应用,获取AK参数并登录控制台,选择左侧应用管理->我的应用->创建应用信息有三项需要在应用创建页面填写应用名称,可不限填写;应用类型,选择服务器;IP白名单,只是简单的个人测试,0.0.0.0/0就够了。如果考虑安全问题,可以填写自己的IP。如果AK参数泄露,非本地IP无法访问,不用担心配额被其他用户盗用1.3Geocoding和反向geocoding按转换方向分为两种。接下来,我们将演示它们的用法:Geocoding:将地理地址转换为坐标点(经度和纬度);reversegeocoding将经纬度转换为地理地址的编码;1.3.1Geocoding,下面是Python测试代码块,将AK参数(前面应用过)和你需要转换的地理位置拼接成官方url,用requests访问即可,importrequestsimportjsonimportreAK='YourAK'address='不。北京市海淀区上地十街10号'url='http://api.map.baidu.com/geocoding/v3/?address={}&output=json&ak={}&callback=showLocation'.format(address,AK)res=requests.get(url)print(res.text)results=json.loads(re.findall(r'\((.*?)\)',res.text)[0])print('\n')print('locationis',results['result']['location'])输出如下showLocation&&showLocation({"status":0,"result":{"location":{"lng":116.3084202915042,"lat":40.05703033345938},"precise":1,"confidence":80,"comprehension":100,"level":"门地址"}})locationis{'lng':116.3084202915042,'lat':40.05703033345938}1.3.2逆向地理编码逆向地理编码类似于geocodinglat='40.05703033345938'lng='116.3084202915042'AK='你的AK'url='http://api.map.baidu.com/reverse_geocoding/v3/?ak={}&output=json&coordtype=wgs84ll&location={},{}'.format(AK,lat,lng)res=requests.get(url)print(res.text)address=json.loads(res.text)['result']['formatted_address']print('\n')print('addressis',地址)免(bai)费piao)像我们这样的用户,借助百度API,一天最多可以调用6000次,这个水平基本可以满足我们的日常需求,但是如果这个数量不能满足你的需求,你可以在线使用购买更高的使用额度2、Geopy2.1Geopy库介绍这里是一个Python包Geopy,同样可以实现经纬度地理位置转换。这个包的经纬度转换原理其实就是借助第三方API平台,由于市面上有很多经纬度转换的第三方平台,为了方便起见,Geopy将这些接口封装在一个类中,借助Geopy模块进行调用。支持的第三方平台如下。Geopy是一个专用的geoprocessing包,除了上面的geocoding和inversegeocoding功能外,还有一个我体验的功能。它提供两个经纬度坐标并计算它们在地球上的最短距离。下面将介绍Geopy的具体用法,2.2Geocoding使用地理编码功能时,需要使用Geopy的geocoders模块。Geopy将所有第三方API封装到地理编码器中。这里我们选择OpenStreetMap平台上提供的Nominatimgeocoder,因为它是免费供我们使用的,不需要申请API,但是缺点是流量有限,无法大规模频繁访问配额,否则返回403、429错误码Road")print(location.address)print(location.latitude,location.longitude)结果如下西二旗北路,海淀区东北望村,Beijing,102208,China40.056793116.3058112.3反地理编码fromgeopy.geocodersimportNominatimgeolocator=Nominatim()location=geolocator.reverse("40.056793116.305811")print(location.address)结果如下北京市海淀区东北望村西二旗北路1#102208,China结果看起来不错,简单方便;但是提醒一下,由于Nominatim模块有限,不要经常访问,否则会出现如下错误。2.4根据纬度和计算距离经度。之间的距离,因为地球具体是一个椭圆,所以不能按照常规的方法计算。目前比较流行的有以下几种模型:modelmajor(km)minor(km)fl注意'WGS-84':(6378.137,6356.7523142,1/298.257223563),'GRS-80':(6378.137,6356.7523141,1/298.257222101),'Airy(1830)':(6377.563396,626392,64969.'Intl1924':(6378.388,6356.911946,1/297.0),'Clarke(1880)':(6378.249145,6356.51486955,1/293.465),'GRS-67':(6378.1600,6356.774719.25),根据官方介绍,官网选择的是WGS-84模型,根据统计最终计算出的距离误差高达0.5%左右;使用方法如下fromgeopyimportdistancenewport_ri=(41.49008,-71.312796)cleveland_oh=(41.499498,-81.695391)print(distance.distance(newport_ri,cleveland_oh).miles)#最终输出英里数#output538.39044536wellington=(-41.32,174.81)salamanca=(40.96,-5.50)print(distance.distance(wellington,salamanca).km)#Km为单位输出19959.67926743批量地址坐标转换上面讲了这么多知识点,下面介绍一个案例简单回顾一下;本例采用百度API实现地理位置坐标转换,将一个csv表中的所有地址位置数据批量转换为经纬度3.1数据读取importpandasaspdimportstringdata_path='H:/Data/Latlon/map-location.csv'df=pd.read_csv(data_path,encoding='GB18030')df一共有98条数据,每条数据代表一个地理位置;数据中明显有一些干扰项,比如数据中左端的数字字符和分隔符\t;因此需要对转换前的数据进行预处理操作3.2数据预处理defprocess_str(x):#数据预处理,去掉前面的数字,\tx=str(x).replace('\t','')x=str(x).strip(string.digits)returnxdf['location']=df['location'].apply(process_str)df预处理结果如下3.3Geocoding(经纬度转换)importtimestart=time.time()AK='yourAK'defget_location(str1):#获取纬度和经度坐标url='http://api.map.baidu.com/geocoding/v3/?address={}&output=json&ak={}&callback=showLocation'.format(str1,AK)res=requests.get(url)results=json.loads(re.findall(r'\((.*?)\)',res.text)[0])return(results['result']['location']['lat'],results['result']['location']['lng'])df['(lat,lng)']=df['location'].apply(get_location)print('耗时{}s'.format(time.time()-start))print(df)为了测试转换效率,我这里加了一个定时器;98条数据转换成功后,总共耗时约4.65s。效率还不错,比Geopy好多了,3.5案例源码数据我把本案例代码中用到的数据都打包好了,重新放在一起。感兴趣的可以在公众号后台回复关键词:210418,即可领取!4.总结上面介绍了这么多,最后做一个总结;谈谈这两种方法在地理坐标转换方面各自的优缺点第三方API优点:地理编码和反编码更准确,精度高;并支持高并发;缺点:不支持国外,环境配置复杂;Geopy(使用Nominatim模块)优点:简单方便,上手速度快;支持国外geocoding缺点:不支持并发访问,效率低,精度低;这里给大家一个建议,如果地址数据在中国,那么经纬度转换建议使用第三方API,稳定准确;如果如果涉及低纬度距离计算、单位换算或国外地址数据,推荐使用Geopy。以上就是本文的全部内容。如果对你有帮助,点个赞就是最大的鼓励
