Python 利用高德地图api实现经纬度与地址的批量转换
我们都知道,可以使用高德地图api实现经纬度与地址的转换。那么,当我们有很多个地址与经纬度,需要批量转换的时候,应该怎么办呢?
在这里,选用高德Web服务的API,其中的地址/逆地址编码,可以实现经纬度与地址的转换。
高德API地址:
地理/逆地理编码:http://lbs.amap.com/api/webservice/guide/api/georegeo
坐标转换:http://lbs.amap.com/api/webservice/guide/api/convert
1.申请key
2.坐标转换
坐标转换是一类简单的HTTP接口,能够将用户输入的非高德坐标(GPS坐标、mapbar坐标、baidu坐标)转换成高德坐标。
deftransform(location):
parameters={'coordsys':'gps','locations':location,'key':'7ec25a9c6716bb26f0d25e9fdfa012b8'}
base='http://restapi.amap.com/v3/assistant/coordinate/convert'
response=requests.get(base,parameters)
answer=response.json()
returnanswer['locations']
2.地理/逆地理编码
我这里是将经纬度转换为地址,所以选用的是逆地理编码的接口。
defgeocode(location):
parameters={'location':location,'key':'7ec25a9c6716bb26f0d25e9fdfa012b8'}
base='http://restapi.amap.com/v3/geocode/regeo'
response=requests.get(base,parameters)
answer=response.json()
returnanswer['regeocode']['addressComponent']['district'].encode('gbk','replace'),answer['regeocode']['formatted_address'].encode('gbk','replace')
3.从文件中读取
需要批量获取的话,一般是从文件中读取数据,读取代码如下:
defparse():
datas=[]
totalListData=pd.read_csv('locs.csv')
totalListDict=totalListData.to_dict('index')
foriinrange(0,len(totalListDict)):
datas.append(str(totalListDict[i]['centroidx'])+','+str(totalListDict[i]['centroidy']))
returndatas
4.完整代码
对于批量获取,我一开始也走了很多弯路。一开始选用javascript接口,但是js接口的函数是异步返回,所以可能第10行的结果跑到第15行去了,一直没有很好的解决,后来才选用web接口。最后,将完整代码贴于此,仅供参考。
#!/usr/bin/env
#-*-coding:utf-8-*-
'''
利用高德地图api实现经纬度与地址的批量转换
'''
importrequests
importpandasaspd
importtime
importsys
reload(sys)
sys.setdefaultencoding("utf-8")
defparse():
datas=[]
totalListData=pd.read_csv('locs.csv')
totalListDict=totalListData.to_dict('index')
foriinrange(0,len(totalListDict)):
datas.append(str(totalListDict[i]['centroidx'])+','+str(totalListDict[i]['centroidy']))
returndatas
deftransform(location):
parameters={'coordsys':'gps','locations':location,'key':'7ec25a9c6716bb26f0d25e9fdfa012b8'}
base='http://restapi.amap.com/v3/assistant/coordinate/convert'
response=requests.get(base,parameters)
answer=response.json()
returnanswer['locations']
defgeocode(location):
parameters={'location':location,'key':'7ec25a9c6716bb26f0d25e9fdfa012b8'}
base='http://restapi.amap.com/v3/geocode/regeo'
response=requests.get(base,parameters)
answer=response.json()
returnanswer['regeocode']['addressComponent']['district'].encode('gbk','replace'),answer['regeocode']['formatted_address'].encode('gbk','replace')
if__name__=='__main__':
i=0
count=0
df=pd.DataFrame(columns=['location','detail'])
#locations=parse(item)
locations=parse()
forlocationinlocations:
dist,detail=geocode(transform(location))
df.loc[i]=[dist,detail]
i=i+1
df.to_csv('locdetail.csv',index=False)
注意事项:
在测试的时候,一个key差不多可以下载2000-3000条数据,一个账号可以申请4个key。这是我自己的使用情况。所以,测试的时候,不用测试过多,直接开始正式爬数据才是正道。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。