通过百度地图路线规划获取出行距离与时间
解决步行出行研究中的距离测度问题
最近出于研究的目的,需要获取一系列出行起止点间的步行网络距离,这个环节原本在研究设计的时候是预期采用GIS里的网络分析完成。但经过一番尝试后结果实在不尽如人意,很大一部分原因是没有如此完善的大规模步行网络数据,一方面道路网络的拓扑属性质量比较低,手工调整需要耗费大量时间;另一方面步行网络很多时候不仅仅基于现有的车行道,独立完成大规模步行网络的校正实在困难。
于是我打起了百度地图提供的路径规划服务的主意,百度的步行导航相对于自己做的网络分析还是准确很多,并且通过API调用可以获得更多更丰富的数据。最终通过这一方法完成了出行距离与时间的计算。
一些注意事项
- 这里使用的服务是web端的轻量级路线规划,服务文档见:http://lbsyun.baidu.com/index.php?title=webapi/directionlite-v1 返回参数其实很丰富,包括了路径的详细信息,只是由于我只需要时间和距离所以没有获取其他的数据。有需要的可以自行修改。
- 本服务需要的API key为服务端的key,浏览器端的不能使用。
- 个人开发者认证账号限额为每天3W次,并发50次。很大程度上是够用的。
- 串行处理相对来说有点慢,在数据量小的情况下还能接受。后面尝试更新了并行处理的方法,但是由于不是全自动的这里就不放上来了。
完整代码
# -*- coding: utf-8 -*-
"""
Created on Wed May 5 10:10:31 2021
@author: BoyceToon
"""
import pandas as pd
import numpy as np
import requests
import json
from queue import Queue# 以下部分需要填写
file_path = "" # 数据文件绝对路径,csv格式
rows = 0 #起始行数,默认为0
travel_mode = "walking" #交通方式,可选:driving\riding\walking\transit
slat_label = "samp_lat" #表格中起始点纬度的标签
slng_label = "samp_lng" #表格中起始点经度的标签
dlat_label = "lat_wgs84" #表格中目的地纬度的标签
dlng_label = "lng_wgs84" #表格中目的地经度的标签
coord_type = "wgs84" #输入坐标系,可选:wgs84\bd09ll\gcj02
keylist=["key1","key2","key3"] # API Key池, 以" ", " "的形式加入可用的AKdf = pd.read_csv(file_path) #读取数据
nrows = df.shape[0] #获得行数
qKey=Queue()def stod(slat,slng,dlat,dlng):#输入:起点纬度、起点经度、终点纬度、终点经度url ="http://api.map.baidu.com/directionlite/v1/"+trvel_mode+"?" ak = qKey.get()real_url = url +"origin="+slat+","+slng+"&destination="+dlat+","+dlng+"&coord_type="+coord_type+"&ak="+akreq = requests.get(real_url)t = req.textdata = json.loads(t) #将数据保存在数组data中try:#防止某几条数据报错导致请求终止distance = data['result']['routes'][0]['distance']duration = data['result']["routes"][0]["duration"]/60except:if data['status'] == 240 or data['status'] == 302:print("API key出现错误:"+ak)print("立即重试")req.close()drop_key(ak)return stod(slat,slng,dlat,dlng)else:req.close()qKey.put(ak)print("出现错误,获取失败,错误代码为:"+str(data['status']))print("正在使用的key为:"+ak)return (np.nan, np.nan)else:req.close()qKey.put(ak)print("已获取起点"+slat+","+slng+"到终点"+dlat+","+dlng+"的步行距离:"+str(distance)+"与时间"+str(duration))return (distance, duration)# 设定Key池队列
def set_key(keylist: list) -> None:qKey.queue.clear()for key in keylist:qKey.put(key)# 删除当前Key
def drop_key(key):for _ in range(qKey.qsize()):t = qKey.get()if t != key:qKey.put(t)set_key(keylist)
if rows == 0:df["distance"] = np.nan #若从0行开始则创建对应列df["duration"] = np.nanfor n in range((nrows-rows)//1000):if ((n+1)*1000+rows) < nrows:for i in range(rows+n*1000, rows+(n+1)*1000):print("开始获取数据,第"+ str(i) +"行")s_lat = str(df[slat_label][i])s_lng = str(df[slng_label][i])d_lat = str(df[dlat_label][i])d_lng = str(df[dlng_label][i])(dis, dur) = stod(s_lat,s_lng,d_lat,d_lng)df["distance"][i] = disdf["duration"][i] = durprint("写入成功")print("-------------------------------------------------------")else:for i in range(rows+n*1000, nrows-1):print("开始获取数据,第"+ str(i) +"行")s_lat = str(df[slat_label][i])s_lng = str(df[slng_label][i])d_lat = str(df[dlat_label][i])d_lng = str(df[dlng_label][i])(dis, dur) = stod(s_lat,s_lng,d_lat,d_lng)df["distance"][i] = disdf["duration"][i] = durprint("写入成功")print("-------------------------------------------------------")df.to_csv(file_path) #每1000行保存一次print("保存成功")print("-------------------------------------------------------")print("数据获取完毕")
通过百度地图路线规划获取出行距离与时间相关推荐
- 百度步行导航加poi搜索android,Android Studio百度地图路线规划以及POI搜索功能的实现...
在Eclipse上开发百度地图的教程比较多,最近用的比较多的是Android Studio平台开发,本文主要是学习如何在Android Studio上进行百度地图的开发. 1.准备工作 这第一步网上说 ...
- 百度地图路线规划onchange事件触发两次 冲突解决
var map = new BMap.Map("allmap",{enableMapClick:false}); map.centerAndZoom("福州市&q ...
- android百度地图路线查询,Android百度地图——路线规划搜索
百度地图提供的路线规划搜索有3种:驾车.公交.步行. 3中方式的使用方法类似,步骤如下: 1.初始化地图 /**初始化百度地图 * */ private void initBaiduMap(){ // ...
- java百度地图路线规划_浅谈百度地图WEB开发中的四种路线规划
百度地图在3.0的Javascript api中增加了四种路径规划,分别是:步行.骑行.自驾.公交. 关于路线规划的引用也相当简单,我们以步行为例://实例化地图 var map = new BMap ...
- 百度地图路线规划重新设置起点、终点图标和路线颜色
重新设置起点.终点图标: var driving = new BMap.DrivingRoute(_this.mapModel, {renderOptions: {map: _this.mapMode ...
- 百度地图路线规划(途经点)
效果图 这里为了方便 我直接使用的是坐标 在实际项目中可以将地址转成坐标 代码如下 <template><div style="width: 100%;height: 70 ...
- java百度地图路线规划,公交路线规划
/** * 设置路线数据. * * @param line 路线数据 */ public void setData(TransitRouteLine line) { mRouteLine = line ...
- android 通过scheme唤起百度、高德、腾讯地图路线规划功能,唤起滴滴出行打车功能
import android.content.Context; import android.content.Intent; import android.net.Uri;import java.ut ...
- 高德地图小程序步行路线显示_微信小程序 高德地图路线规划实现过程详解
前言 最近项目中做到相关网约车小程序.需要使用到地图中的路线规划,对3种地图进行了分析.这里稍微做一下总结: 百度地图 百度坐标 (BD-09) 腾讯地图 火星坐标(GCJ-02) 高德地图 火星坐标 ...
最新文章
- Usb-type-C端口实现的挑战与设计方案
- 摊牌了!国内首个基于结构光投影三维重建系列视频课程
- 在koa中想要优雅的发送响应?看这就对了
- HANDLE:句柄的概念
- RxJava 2.x 入门
- 返回顶部小火箭(仿电脑管家)
- 如何学好Spring
- oracle 添加监听地址,oracle批改监听地址为localhost
- 内购订单进行二次处理_更学教育:卖家在投诉异常订单的流程是怎么样的?
- coreldraw中制作蚊香实例_关于CorelDRAW印前排版规范你知道么?
- 安装IIS服务 找不到staxmem.dll文件的解决方法
- Form表单只提交field的值,而不进行页面跳转
- linux iconv 文件名,Linux_Linux系统下转换文件编码的方法小结,一、利用iconv命令进行文件内 - phpStudy...
- 微信小程序文档api
- 苏琴与机器人白正_一段知乎的元白
- 管理理论模型:PEST、5W2H、时间管理、生命周期、逻辑树、金字塔、SMART原则
- GprMax2D ——ABC(吸收边界条件)相关命令
- CIFAR-10数据集目录结构以及数据组织格式
- 有关于反走样的理解(学习笔记仅供参考)
- java chmod 777_java中 执行shell中的chmod 777命令,出现Caused by: java.io.IOException: Permission denied???...