[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。這是我自己的使用情況。所以,測試的時候,不用測試過多,直接開始正式爬數據纔是正道。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章