[Python]利用高德地图api实现经纬度与地址的批量转换

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013250416/article/details/71178156

我们都知道,可以使用高德地图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坐标)转换成高德坐标。

def transform(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()        
    return answer['locations']

2.地理/逆地理编码
我这里是将经纬度转换为地址,所以选用的是逆地理编码的接口。

def geocode(location):        
    parameters = {'location': location, 'key': '7ec25a9c6716bb26f0d25e9fdfa012b8'}        
    base = 'http://restapi.amap.com/v3/geocode/regeo'        
    response = requests.get(base, parameters)        
    answer = response.json()        
    return answer['regeocode']['addressComponent']['district'].encode('gbk','replace'),answer['regeocode']['formatted_address'].encode('gbk','replace')

3.从文件中读取
需要批量获取的话,一般是从文件中读取数据,读取代码如下:

def parse(): 
        datas = [] 
        totalListData = pd.read_csv('locs.csv') 
        totalListDict = totalListData.to_dict('index') 
        for i in range(0, len(totalListDict)):                 
                datas.append(str(totalListDict[i]['centroidx']) + ',' + str(totalListDict[i]['centroidy'])) 
         return datas

4.完整代码
对于批量获取,我一开始也走了很多弯路。一开始选用javascript接口,但是js接口的函数是异步返回,所以可能第10行的结果跑到第15行去了,一直没有很好的解决,后来才选用web接口。最后,将完整代码贴于此,仅供参考。

#-*- coding:utf-8 -*-
'''利用高德地图api实现经纬度与地址的批量转换'''
import requests
import pandas as pd
import time
import sys
reload(sys)
sys.setdefaultencoding("utf-8") 

def parse(): 
        datas = [] 
        totalListData = pd.read_csv('locs.csv') 
        totalListDict = totalListData.to_dict('index') 
        for i in range(0, len(totalListDict)):             
                datas.append(str(totalListDict[i]['centroidx']) + ',' + str(totalListDict[i]['centroidy'])) 
        return datas

def transform(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()        
        return answer['locations']

def geocode(location):        
        parameters = {'location': location, 'key': '7ec25a9c6716bb26f0d25e9fdfa012b8'}        
        base = 'http://restapi.amap.com/v3/geocode/regeo'         
        response = requests.get(base, parameters)        
        answer = response.json()        
        return answer['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() 
               for location in locations:  
                           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。这是我自己的使用情况。所以,测试的时候,不用测试过多,直接开始正式爬数据才是正道。

发布了10 篇原创文章 · 获赞 20 · 访问量 4380

猜你喜欢

转载自blog.csdn.net/Joker00007/article/details/100128261
今日推荐