解决步行出行研究中的距离测度问题

最近出于研究的目的,需要获取一系列出行起止点间的步行网络距离,这个环节原本在研究设计的时候是预期采用GIS里的网络分析完成。但经过一番尝试后结果实在不尽如人意,很大一部分原因是没有如此完善的大规模步行网络数据,一方面道路网络的拓扑属性质量比较低,手工调整需要耗费大量时间;另一方面步行网络很多时候不仅仅基于现有的车行道,独立完成大规模步行网络的校正实在困难。

于是我打起了百度地图提供的路径规划服务的主意,百度的步行导航相对于自己做的网络分析还是准确很多,并且通过API调用可以获得更多更丰富的数据。最终通过这一方法完成了出行距离与时间的计算。

一些注意事项

  1. 这里使用的服务是web端的轻量级路线规划,服务文档见:http://lbsyun.baidu.com/index.php?title=webapi/directionlite-v1 返回参数其实很丰富,包括了路径的详细信息,只是由于我只需要时间和距离所以没有获取其他的数据。有需要的可以自行修改。
  2. 本服务需要的API key为服务端的key,浏览器端的不能使用。
  3. 个人开发者认证账号限额为每天3W次,并发50次。很大程度上是够用的。
  4. 串行处理相对来说有点慢,在数据量小的情况下还能接受。后面尝试更新了并行处理的方法,但是由于不是全自动的这里就不放上来了。

完整代码

# -*- 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("数据获取完毕")

通过百度地图路线规划获取出行距离与时间相关推荐

  1. 百度步行导航加poi搜索android,Android Studio百度地图路线规划以及POI搜索功能的实现...

    在Eclipse上开发百度地图的教程比较多,最近用的比较多的是Android Studio平台开发,本文主要是学习如何在Android Studio上进行百度地图的开发. 1.准备工作 这第一步网上说 ...

  2. 百度地图路线规划onchange事件触发两次 冲突解决

    var map = new BMap.Map("allmap",{enableMapClick:false});     map.centerAndZoom("福州市&q ...

  3. android百度地图路线查询,Android百度地图——路线规划搜索

    百度地图提供的路线规划搜索有3种:驾车.公交.步行. 3中方式的使用方法类似,步骤如下: 1.初始化地图 /**初始化百度地图 * */ private void initBaiduMap(){ // ...

  4. java百度地图路线规划_浅谈百度地图WEB开发中的四种路线规划

    百度地图在3.0的Javascript api中增加了四种路径规划,分别是:步行.骑行.自驾.公交. 关于路线规划的引用也相当简单,我们以步行为例://实例化地图 var map = new BMap ...

  5. 百度地图路线规划重新设置起点、终点图标和路线颜色

    重新设置起点.终点图标: var driving = new BMap.DrivingRoute(_this.mapModel, {renderOptions: {map: _this.mapMode ...

  6. 百度地图路线规划(途经点)

    效果图 这里为了方便 我直接使用的是坐标 在实际项目中可以将地址转成坐标 代码如下 <template><div style="width: 100%;height: 70 ...

  7. java百度地图路线规划,公交路线规划

    /** * 设置路线数据. * * @param line 路线数据 */ public void setData(TransitRouteLine line) { mRouteLine = line ...

  8. android 通过scheme唤起百度、高德、腾讯地图路线规划功能,唤起滴滴出行打车功能

    import android.content.Context; import android.content.Intent; import android.net.Uri;import java.ut ...

  9. 高德地图小程序步行路线显示_微信小程序 高德地图路线规划实现过程详解

    前言 最近项目中做到相关网约车小程序.需要使用到地图中的路线规划,对3种地图进行了分析.这里稍微做一下总结: 百度地图 百度坐标 (BD-09) 腾讯地图 火星坐标(GCJ-02) 高德地图 火星坐标 ...

最新文章

  1. Usb-type-C端口实现的挑战与设计方案
  2. 摊牌了!国内首个基于结构光投影三维重建系列视频课程
  3. 在koa中想要优雅的发送响应?看这就对了
  4. HANDLE:句柄的概念
  5. RxJava 2.x 入门
  6. 返回顶部小火箭(仿电脑管家)
  7. 如何学好Spring
  8. oracle 添加监听地址,oracle批改监听地址为localhost
  9. 内购订单进行二次处理_更学教育:卖家在投诉异常订单的流程是怎么样的?
  10. coreldraw中制作蚊香实例_关于CorelDRAW印前排版规范你知道么?
  11. 安装IIS服务 找不到staxmem.dll文件的解决方法
  12. Form表单只提交field的值,而不进行页面跳转
  13. linux iconv 文件名,Linux_Linux系统下转换文件编码的方法小结,一、利用iconv命令进行文件内 - phpStudy...
  14. 微信小程序文档api
  15. 苏琴与机器人白正_一段知乎的元白
  16. 管理理论模型:PEST、5W2H、时间管理、生命周期、逻辑树、金字塔、SMART原则
  17. GprMax2D ——ABC(吸收边界条件)相关命令
  18. CIFAR-10数据集目录结构以及数据组织格式
  19. 有关于反走样的理解(学习笔记仅供参考)
  20. java chmod 777_java中 执行shell中的chmod 777命令,出现Caused by: java.io.IOException: Permission denied???...

热门文章

  1. 阿里云盾导致 cgroup2 cpu 控制器丢失的坑
  2. 动态切换主题(皮肤skin)
  3. task07 类与对象、魔方方法
  4. python 几何教学_python gdal教程之:几何形状geometry与投影projection
  5. PCB布线走直角或锐角问题研究
  6. sfr和sbit的描述
  7. 宇宙时空 符号世界 对应引理——哥德尔读后之25
  8. 万字详述 Web3 彻底颠覆品牌行业的底层叙事
  9. Mysql查看表结构的三种方法
  10. 联想YOGA Pro 14s Carbon 2022款 锐龙版评测