原文:基于百度地图API计算任意两点间的出行距离_爱吃面条的陈同学的博客-CSDN博客_百度地图api距离计算
前言
为了方便自己以后查找代码,也不想让自己的桌面变得凌乱不堪,所以将把自己之前的代码保存到这里面。
之前做项目时候,遇到了以下问题:对于任意两点间的地理坐标(火星坐标系),怎样计算其距离? 数据示例如下:
最终基于百度API搞定了这个问题,下面是相关思路和代码。
使用步骤
首先我们需要自己去百度地图api官网上申请注册自己的key,网址:https://lbsyun.baidu.com/
1.导入相关包
import requests
import json
import pandas as pd
from tqdm import tqdm #可以显示进度条
tqdm.pandas(desc='pandas bar')
2.计算小汽车距离
def driving_distance(origins,destinations):
url = 'https://api.map.baidu.com/routematrix/v2/driving?output=json&coord_type=gcj02&origins='
ak = 'xxxxxxxxxxxxxxxxx' #输入自己申请的key
real_url = url + origins+'&destinations='+destinations+'&ak='+ak
req = requests.get(real_url)
t = req.text
data =json.loads(t)
try:
distance=data["result"][0]['distance']['value'] # 输出街道名称
except:
distance='error'
return distance
3.计算骑行距离
def riding_distance(origins,destinations):
url = 'https://api.map.baidu.com/routematrix/v2/riding?output=json&coord_type=gcj02&origins='
ak = 'xxxxxxxxxxxxxxxxx' #输入自己申请的key
real_url = url + origins+'&destinations='+destinations+'&ak='+ak
req = requests.get(real_url)
t = req.text
data =json.loads(t)
try:
distance = data["result"][0]['distance']['value'] # 输出街道名称
except:
distance = 'error'
return distance
4.创建主函数
if __name__=='__main__':
filepath=r'C:\Users\input.xlsx'
data=pd.read_excel(filepath)
data=data.iloc[:20000,1:] #个人账号有限额,建议不要超过两万行
data['origins']=data.apply(lambda x:str(x.出发Y)+','+str(x.出发X),axis=1)
data['destinations'] = data.apply(lambda x: str(x.到达Y) + ',' + str(x.到达X), axis=1)
data['driving_distance']=data.progress_apply(lambda x:driving_distance(x.origins,x.destinations),axis=1)
data['riding_distance'] = data.progress_apply(lambda x: riding_distance(x.origins, x.destinations), axis=1)
data.to_excel('output.xlsx',index=False)
总结
本文主要基于百度API实现任意给定两点坐标的距离计算,但有以下需要注意的点:
①正确的数据格式。经纬度的数值要一一对应的输入。
②较小的数据容量。个人账号有查询数量限制,建议一次性不要调用次数太多了。
③准确的坐标系。注意自己的数据是wgs84、gcj02或者其他坐标系。
④公共交通一体化。百度地图查询公共交通路径时一般将公交和地铁放在一块儿组合查询,所以这种方法可以得到公共交通的总出行距离,但是得不到公交和地铁各自的出行距离。