查看原文
其他

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

Yuan Yuan的数据分析 2021-09-20


Hello! 跟大家好久不见,甚是想念!




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


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




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


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


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

import pandas as pdimport numpy as npimport geopandas as gpdimport matplotlib.pyplot as pltfrom shapely.geometry import Pointfrom fiona.crs import from_epsgplt.rcParams['font.sans-serif']=['Arial Unicode MS']plt.rcParams['axes.unicode_minus']=Falsepd.set_option('display.max_columns', None)


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

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


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

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

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存