利用python分析多种交通方式可达圈
Hello! 跟大家好久不见,甚是想念!
前几天雷总给我发了这张照片,不禁回想起在学校的生活的点点滴滴,十分想回到成都,相信大家也都是像我一样吧!
这次为大家带来的是用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三篇也就告一段落了,感谢各位的鼓励与支持。写这个公众号的目的便是跟大家分享并且共同进步,我想互联网时代的学习最重要的就是分享精神,实际上我们调的包也都是各路大神无私分享与维护的,每每想到这点我就无比感动。因此,如果我的文章帮到了各位的话,还请大家多多点赞多多转发,让更多的人看到,这也是对我的鼓励,谢谢