python - 多种交通方式可达圈分析

DataCharm 2021-02-22 13:02:36
Python 方式 多种 交通 可达


前几天雷总给我发了这张照片,不禁回想起在学校的生活的点点滴滴,十分想回到成都,相信大家也都是像我一样吧!

这次为大家带来的是用python调取百度api实现不同交通方式可达圈的构建,高中同学村长前几天让我帮他用百度api爬一下poi数据,我研究了一下下,发现这个api还挺好用,除了爬poi还可以实现路径规划,就写了一小段代码玩一玩,现在分享给大家。


首先简单介绍一下百度api路径规划的功能,我们可以输入交通方式、起点、终点的经纬度坐标,百度会返回给我们一个json文件,里面包含了自动规划出来的路径、路径的总长度和预计的行程时间。因此,我们可以分析一个点的各种交通方式的可达圈,简单来说就是以该点为起点、以某种出行方式、在某一时间内所能到达的范围。此外,如果还能知道各个小区的就业数量的话,就可以计算小区的accessibility了,当然,这不在本文的讨论范围之内。

这次我们要做的是分析一下天府广场的骑行出行圈,下面上代码。

首先调包,还是那几样,具体可以看我的第一篇文章:

import pandas as pd
import numpy as np
import geopandas as gpd
import matplotlib.pyplot as plt
from shapely.geometry import Point
from fiona.crs import from_epsg
plt.rcParams['font.sans-serif']=['Arial Unicode MS']
plt.rcParams['axes.unicode_minus']=False
pd.set_option('display.max_columns', None)

然后画一下网格,这里代码我就不写了,在网约车那篇文章里写过了,大家可以去上一篇文章里看,直接上结果。

具体要分析的区域如上图,大概就是成都三环以内,画成了40*40的网格,我们要计算的就是天府广场到每个网格中心点所需要的的骑行时间。如何创建中心点在网约车那篇文章也能找到,这里省略。

接下来我们就要调用api开始计算了。首先导入爬虫和解析json文件需要的包:

import requests
import json

然后开始调用api计算:

area['ride_time'] = 0 ### area是创造的网格
for i in range(len(area)):
ak = #### 你的ak
url = 'http://api.map.baidu.com/directionlite/v1/riding?origin=30.66012,104.06352&coord_type=wgs84&destination={},{}&ak={}'.format(area_point.iloc[i,0].y,area_point.iloc[i,0].x,ak)
data = requests.get(url).json()
if data['status'] == 0:
area.loc[i,'ride_time'] = data['result']['routes'][0]['duration']
else:
area.loc[i,'ride_time'] = 0

这里解释一下,首先要注册成为百度地图的开发者,这样就会获得一个api key,简称ak,有了这个ak就可以调用百度的api了。不过百度路径规划的api如果白嫖的话一天最多调用2000次,土豪可以充个会员,不是土豪的话可以多注册几个号

这是api需要输入的参数,可以发现,选项还挺多的,除了ak,起终点经纬度必须输入以外,还可以选择普通自行车还是小电驴,十分贴心。

在输入参数之后调用api,会返回一个json文件,具体内容百度的开发文档里也有解释:

可以看到,首先是状态码,然后是各种信息,我们需要的实际是result下面的duration,也就是线路耗时,对返回的json进行解析然后根据key进行提取即可。具体代码都在上面了。

不过有个问题需要注意,有的路线返回的状态码会不是0,有错误。关于这点我的处理方法是如果出现错误,就把这条线路的耗时先设置成0,然后进行一下简单的插值:

for i in range(len(area1)):
if area1.iloc[i,1] == 0:
area1.iloc[i,1] = (area1.iloc[i-1,1]+area1.iloc[i+1,1])/2

当然这只是一种十分粗略的方法,大家如果写论文的话还是乖乖到arcgis里进行空间插值。

以上我们就得到了天府广场到各个格子的骑行时间了,下面我们来可视化一下;

area1['ride_time'] = -area1['ride_time']

这里我首先把耗时取一下相反数,因为python里我没找到数值越大颜色越浅的色带

,取相反数以后出行时间越短数值也就越大,可视化的颜色也就越深,方便我们观察。

import contextily as ctx
chengdu = chengdu.to_crs(from_epsg(3857))
area1 = area1.to_crs(from_epsg(3857)) ## 投影成web墨卡托坐标系
base = area1.plot(column='ride_time',figsize=(10,10),cmap='Blues',scheme='fisher_jenks',k=7,alpha=0.55)
ctx.add_basemap(base)
plt.xlim(11579000,11590000)
plt.ylim(3583500,3595000)
plt.gca().xaxis.set_major_locator(plt.NullLocator()) #去掉x轴刻度
plt.gca().yaxis.set_major_locator(plt.NullLocator()) #去年y轴刻度
plt.title('天府广场骑行可达圈',fontsize=20)
plt.savefig('天府广场骑行可达圈.jpg',dpi=300)

最后得到的结果就是这样子,颜色的深度分别代表从天府广场出发骑车的耗时,呈圈层式分布,总体来说还是比较符合实际的(当然,格子粒度太大导致看着有点丑,可以多划点格子或者用六边形分割,看着比较高级)。

接下来我们看一下从天府广场出发15分钟的自行车可达圈:

area2 = area1[area1['ride_time']>-900] ## 筛选一下出行时间小于900s的格子
base = area2.plot(color='Red',alpha=0.4,figsize=(10,10))
ctx.add_basemap(base)
plt.title('天府广场骑行15分钟可达圈',fontsize=20)
plt.gca().xaxis.set_major_locator(plt.NullLocator()) #去掉x轴刻度
plt.gca().yaxis.set_major_locator(plt.NullLocator()) #去年y轴刻度
plt.savefig('天府广场骑行15分钟可达圈.jpg',dpi=300)

嘎嘎,可以看出,如果使劲骑的话,从天府广场15分钟还是可以蹬出一环的

此外,百度还提供了驾车、公交、步行等多种交通方式的路径规划api,大家可以自行尝试,由于我的ak达到了每日上限,就不给大家演示了,大家可以参考百度地图api的官网文档自行尝试,用上面的代码把url换一下就行。

至此本篇小文章就结束啦!Yuan三篇也就告一段落了,感谢各位的鼓励与支持。写这个公众号的目的便是跟大家分享并且共同进步,我想互联网时代的学习最重要的就是分享精神,实际上我们调的包也都是各路大神无私分享与维护的,每每想到这点我就无比感动。因此,如果我的文章帮到了各位的话,还请大家多多点赞多多转发,让更多的人看到,这也是对我的鼓励,谢谢

本文分享自微信公众号 - DataCharm(shujumeili)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间: 2020-11-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

版权声明
本文为[DataCharm]所创,转载请带上原文链接,感谢
https://cloud.tencent.com/developer/article/1790262

  1. Python 3 entry, see this is enough
  2. 华为大佬打造的400集Python视频学起来,学完万物皆可爬
  3. 400 episodes of Python video created by Huawei boss
  4. django之csrf_exempt解决跨域请求的问题
  5. CSRF of Django_ Exempt solves the problem of cross domain requests
  6. 1.7 万 Star!一个简单实用的 Python 进度条库
  7. 17000 stars! A simple and practical Python progress bar library
  8. Python爬虫:设置Cookie解决网站拦截并爬取蚂蚁短租
  9. Python crawler: setting cookie to solve website interception and crawling ant short rent
  10. Python-Net编程
  11. Python net programming
  12. 学习Python数学英语基础重要吗?Python教程!
  13. Is it important to learn the basics of math and English in Python!
  14. Python数据分析常用库有哪些?Python学习!
  15. What are the common libraries for Python data analysis? Learn Python!
  16. win 创建python虚拟环境
  17. Creating Python virtual environment with win
  18. In order to automatically collect B station barrage, I developed a tool in Python
  19. 用Python编程语言来实现阿姆斯特朗数的检查
  20. Using python programming language to check Armstrong number
  21. Python中的解决中文字符编码的问题
  22. Solving the problem of Chinese character coding in Python
  23. Translation: practical Python Programming 02_ 01_ Datatypes
  24. Installation and use of Python and tensorflow in win10 environment (Python version 3.6, tensorflow version 1.6)
  25. Python series 46
  26. Linux安装Python3
  27. 【python接口自动化】- 正则用例参数化
  28. Python RestFul Api 设计
  29. filecmp --- 文件及目录的比较│Python标准库
  30. Installing python3 on Linux
  31. [Python] Matplotlib 圖表的繪製和美化技巧
  32. (資料科學學習手札108)Python+Dash快速web應用開發——靜態部件篇(上)
  33. 翻譯:《實用的Python程式設計》02_01_Datatypes
  34. 【python接口自动化】- 正则用例参数化
  35. 翻译:《实用的Python编程》02_02_Containers
  36. 两年Java,去字节跳动写Python和Go
  37. [Python interface automation] - regular use case parameterization
  38. Python restful API design
  39. 翻译:《实用的Python编程》02_02_Containers
  40. 两年Java,去字节跳动写Python和Go
  41. 翻译:《实用的Python编程》02_02_Containers
  42. Python基于粒子群优化的投资组合优化研究
  43. ubuntu部署django项目
  44. 兩年Java,去位元組跳動寫Python和Go
  45. 翻譯:《實用的Python程式設計》02_02_Containers
  46. 这样学习Python,爷爷都学会了!超简单Python入门
  47. [Python] 基于 jieba 的中文分词总结
  48. 【python】递归听了N次也没印象,读完这篇你就懂了
  49. [Python] 基于 jieba 的中文分词总结
  50. 人理解迭代,神则体会递归,从电影艺术到Python代码实现神的逆向思维模式
  51. [Python] 基於 jieba 的中文分詞總結
  52. Python属于后端开发还是前端开发?Python入门!
  53. 【python】递归听了N次也没印象,读完这篇你就懂了
  54. 一天快速入门python
  55. 学习Python对年龄有没有要求?30岁可以吗?
  56. 清华教授!12小时整理的最全Python教程(文末无偿分享)
  57. Filecmp -- comparison of files and directories
  58. Drawing and beautifying skills of [Python] Matplotlib chart
  59. Python + dash rapid web application development static components
  60. Translation: practical Python Programming 02_ 01_ Datatypes