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

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


前言

爬取高德或百度的数据有数量限制,以高德为例,单日调取经纬度的免费额度为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中提供了哪些接口。
高德自定义地图,可在线对空间数据进行可视化,务必注意经纬度数据的格式和样例保持一致。

  • 6
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
利用Python高德地图API实现经纬度与地址的批量转换是可行的。首先,我们需要准备高德地图API密钥,该密钥可以通过高德地图开发者平台申请获得。 接下来,我们可以使用Python中的requests库发送HTTP请求,通过调用高德地图的逆地理编码接口,将经纬度转换为地址。我们需要将API密钥和待转换的经纬度构建为合适的URL,并发送GET请求。高德地图API将返回JSON格式的数据,其中包含有关地址信息的详细内容。 在代码中,我们可以使用for循环来遍历经纬度的列表,对每个经纬度调用逆地理编码接口并解析返回的JSON数据。我们可以从返回的数据中提取出地址信息,并将其保存到一个新的CSV文件中。 以下是一个简单的示例代码: ```python import requests import csv api_key = "your_api_key" def get_address(lat, lng): url = f"https://restapi.amap.com/v3/geocode/regeo?key={api_key}&location={lng},{lat}&radius=1000&extensions=all&batch=true&roadlevel=1" response = requests.get(url) data = response.json() address = data['regeocodes'][0]['formatted_address'] return address def main(): with open('input.csv', 'r') as input_file, open('output.csv', 'w', newline='') as output_file: reader = csv.reader(input_file) writer = csv.writer(output_file) writer.writerow(['经度', '纬度', '地址']) for row in reader: lat, lng = row[0], row[1] address = get_address(lat, lng) writer.writerow([lat, lng, address]) print("地址转换完成!") if __name__ == '__main__': main() ``` 在这个示例中,我们假设输入文件是一个CSV文件,其中包含经纬度数据。我们将转换后的地址保存到新的CSV文件中,其中包含经度、纬度和地址信息。 通过运行这个Python脚本,我们可以批量转换经纬度为地址,并将结果保存到输出文件中。这样,我们就可以在后续的工作中方便地使用地址信息了。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值