前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python - 多种交通方式可达圈分析

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

作者头像
DataCharm
发布2021-02-22 12:04:39
8420
发布2021-02-22 12:04:39
举报
文章被收录于专栏:数据 学术 商业 新闻

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

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


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

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

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

代码语言:javascript
复制
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文件需要的包:

代码语言:javascript
复制
import requests
import json

然后开始调用api计算:

代码语言:javascript
复制
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,然后进行一下简单的插值:

代码语言:javascript
复制
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里进行空间插值。

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

代码语言:javascript
复制
area1['ride_time'] = -area1['ride_time']

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

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

代码语言:javascript
复制
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分钟的自行车可达圈:

代码语言:javascript
复制
area2 = area1[area1['ride_time']>-900] ## 筛选一下出行时间小于900s的格子
代码语言:javascript
复制
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三篇也就告一段落了,感谢各位的鼓励与支持。写这个公众号的目的便是跟大家分享并且共同进步,我想互联网时代的学习最重要的就是分享精神,实际上我们调的包也都是各路大神无私分享与维护的,每每想到这点我就无比感动。因此,如果我的文章帮到了各位的话,还请大家多多点赞多多转发,让更多的人看到,这也是对我的鼓励,谢谢

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DataCharm 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档