利用高德地图API批量获取地点经纬度和行车线路与OD距离(excel和python)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、excel调取API方法
    • 1.申请一个key
    • 2.excel调用API
  • 二、python方法
    • 计算地址列表中两两之间的OD距离和行车路线
  • 总结


前言

爬取高德或百度的数据有数量限制,以高德为例,单日调取经纬度的免费额度为5000条,多个key同时调取也不能改变单日可调用总数。
当数量少的时候可以直接用excel进行操作,方便快捷,但excel在大量处理时会出现错误,数据量上千就推荐使用python,更加方便。
在开始爬取之前,将地址处理成标准格式,即“xx省xx市xx县/区xx小区/村x门x户”,不同的地区会有同名地址存在,所以省市一定要写清楚。
ps:其他地图都类似,本文只以高德为例。

一、excel调取API方法

1.申请一个key

当然申请很多个也可以,看你心情。
在高德开放平台首页登录,然后点击右上方【控制台】,左侧【应用管理】-【我的应用】,然后右上角【创建新应用】,随便创建一个,会出现【添加】字样,点击添加一个key,名字随便,服务平台选【web服务】。

2.excel调用API

获取经纬度:

=FILTERXML(WEBSERVICE("https://restapi.amap.com/v3/geocode/geo?address="&[@出发地址]&"&output=XML&key=Key值"),"//location")

注意替换key值,【@出发地址】替换为地址在excel中的位置,如A1,对于终点位置的经纬度也是同样的获取方法。
获取行车距离:

=FILTERXML(WEBSERVICE("https://restapi.amap.com/v3/distance?origins="&[@出发经纬度]&"&destination="&[@目的经纬度]&"&output=xml&key=Key值"),"//distance")

二、python方法

计算地址列表中两两之间的OD距离和行车路线

代码如下(示例):

import urllib.request #发送请求
from urllib import parse #URL编码
import json #解析json数据
import jsonpath #提取json数据
import pandas as pd #导入pandas库
from openpyxl import load_workbook #从Excel中读取地址
addList = [] #创建一个列表存放地址数据
exbook = load_workbook('C:/Users/……/places.xlsx') #打开存放地址的工作表
addSheet = exbook["sheet1"] #读取工作簿,如果改了工作簿名字那么这里也要改
#按行读取第一列,并存入addList列表:
for row in range(1,addSheet.max_row+1):
    addList.append(str(addSheet["A%d"%(row)].value))
dict = {} #创建一个字典用于存放地址经纬度数据
for i in addList:
    url1='https://restapi.amap.com/v3/geocode/geo?address='+i+'&output=json&key=key值'
    #将一些符号进行URL编码,将这里的“key值”替换成你自己申请的
    newUrl1 = parse.quote(url1, safe="/:=&?#+!$,;'@()*[]")
    #发送请求
    response1 = urllib.request.urlopen(newUrl1)
    #读取数据
    data1 = response1.read()
    #解析json数据
    jsonData1 = json.loads(data1)
    #geocodes0→location得到经纬度,写入字典
    dict[i] = jsonData1['geocodes'][0]['location']
dict_route={"出发地":[],"目的地":[],"距离":[],"线路":[]}
k = len(addList) #nameList列表中元素个数
#遍历addList列表
for m in range(k):    
    for n in range(k):
        #从addList中得到地址的名称,获得dict中的经纬度
        origin = dict[addList[m]]
        destination = dict[addList[n]]
        url2='https://restapi.amap.com/v3/direction/driving?origin='+origin+'&destination='+destination+'&extensions=all&output=json&strategy=6&&key=key值'
       #编码,这里也要替换key
        newUrl2 = parse.quote(url2, safe="/:=&?#+!$,;'@()*[]")
        #发送请求
        response2 = urllib.request.urlopen(newUrl2)
        #接收数据
        data2 = response2.read()
        #解析json文件
        jsonData2 = json.loads(data2)
        #输出该json中所有road的值
        road=jsonpath.jsonpath(jsonData2,'$..road')
        #从json文件中提取距离
        distance = jsonData2['route']['paths'][0]['distance']
        #字典dict_route中追加数据
        dict_route.setdefault("出发地",[]).append(addList[m])
        dict_route.setdefault("目的地",[]).append(addList[n])
        dict_route.setdefault("距离",[]).append(distance)
        dict_route.setdefault("线路",[]).append(road)
route=pd.DataFrame(dict_route)#将字典数据创建DataFrame
route.to_excel("C:/Users/……/route_list.xlsx",sheet_name="route") #导出

想要经纬度的话,就在输出表中把origin和destination两个变量一起输出。


总结

官方文档里提供了很多参考代码,可以进行适当替换。百度地图的操作也是类似的,只不过我习惯于用高德了。
每天爬取到单日数据量上限的时候会收到超额提示短信和邮件,不用理会。
更多内容可见高德开发平台官方指南。
高德API示例,可以直观看到API中提供了哪些接口。
高德自定义地图,可在线对空间数据进行可视化,务必注意经纬度数据的格式和样例保持一致。

你可能感兴趣的:(高德地图API调用,python)