“没有私人飞机也能任性畅玩?”
故事的起因是这样的:上个周末我进行了快乐郊游,回程时不出意外又双叒叕被堵在路上。
大塞车时我跟朋友聊天:
哼!我们技术宅可是有尊严的!没有私人飞机,照样可以快乐游玩!在五一假期来临之际,本着造福人类的心,我跟大家分享一下我的旅行计划:
我的目标:以上海为出发地,找到限定通行时间单程3小时以内的一日游目的地。
计划过程:
从哪儿出发,到哪儿去?
首先,OD问题——从哪出发,到哪里去?一份全国各城市经纬度坐标数据闪亮登场。
然后,对数据进行简单的排列组合,以上海为起点,其他城市为终点,制作一张OD表。使用python,写几行代码,主要逻辑是遍历,再重新排列组合,so easy!
import pandas as pdcity = pd.read_excel('中国城市经纬度.xlsx')l = []for ocity, olng, olat in zip(city['name'],city['lng'],city['lat']): for dcity, dlng, dlat in zip(city['name'],city['lng'],city['lat']): l.append([ocity,olng,olat,dcity,dlng,dlat])data = pd.DataFrame(l,columns=['ocity','olng','olat','dcity','dlng','dlat'])data = data[data['ocity']=='上海']data = data[data['dcity']!='上海']data.to_csv('上海城市联系表.csv',encoding='gbk',index=0)
(完整代码和数据见文末)
整理后,结果是这样的。
两者的通行时间?
有了OD联系表后,问题又来了,我如何知道两者的通行时间?有一个简单的办法:高德地图一个个查呗!
当然,如果你参加过数据分析师微专业课程,掌握python,就会知道这其实有更高效的批量解决方案。高德提供API接口,地图查询显示的数据都能通过API得到。我们打开路径规划API文档。
可以发现它支持各种交通方式,步行,骑车,公交(不包括飞机,包括高铁),驾车。接口说明清晰明了,字段丰富多样,以供选择。
所以,让我们一起coding吧。
import requestsimport pandas as pdfrom tqdm import tqdmAK = '引号中输入您的高德地图开放平台秘钥'def createUrl(gd_ak): transitUrl = 'https://restapi.amap.com/v3/direction/transit/integrated?key={}&'.format(gd_ak) driveUrl = 'https://restapi.amap.com/v3/direction/driving?key={}&'.format(gd_ak) return transitUrl,driveUrldef transit(url,origin,destination,city,cityd): api = url + 'origin=' + origin + '&destination=' + destination + '&city=' + city + '&cityd=' + cityd callback = requests.get(api).json()['route']['transits'] minutes = [] for tra in callback: dur = float(tra['duration']) minutes.append(dur) minimum_time = min(minutes) return minimum_timedef drive(url,origin,destination,city,cityd): api = url + 'origin=' + origin + '&destination=' + destination + '&city=' + city + '&cityd=' + cityd + '&strategy=0' callback = requests.get(api).json()['route']['paths'][0] duration = callback['duration'] return durationdef run(data_path,ak): transitUrl, driveUrl = createUrl(ak) data = pd.read_csv(data_path,engine='python') l = [] for olng,olat,dlng,dlat,ocity,dcity in tqdm(zip(data['olng'],data['olat'],data['dlng'], data['dlat'],data['ocity'],data['dcity'])): origin = str(olng) + ',' + str(olat) destination = str(dlng) + ',' + str(dlat) try: minimum_time = transit(transitUrl,origin,destination,ocity,dcity) except: minimum_time = None try: duration = drive(driveUrl,origin,destination,ocity,dcity) except: duration = None l.append([ocity,dcity,olng,olat,dlng,dlat,minimum_time,duration]) result = pd.DataFrame(l,columns=['出发城市','到达城市', '出发城市经度','出发城市纬度', '到达城市经度','到达城市纬度', '公交最小花费时间','驾车最小花费时间']) result.to_csv('./通行时间表.csv',index=0,encoding='gbk')def main(): run('./上海城市联系表.csv',AK)if __name__ == '__main__': main()
非常简单的流程,我们只抓取公交和驾车两种出行方式通行时间。
下载数据结果如下:
既然有数据了,我们先来做一下简单的分析。
我们比较同一段OD,驾车和公交两种出行方式所需时间,发现绝大多数城市,使用公交出行,耗时较短。公交在城际间主要方式是火车。可见高铁对减少出行时间有着显著作用。
再来看看驾车和公交两种交通方式出行,所花时间的分布。
可见,公交出行,绝大多地方都能在15小时内可达,而驾车就未必了。
三小时可达的城市有哪些?
回到正题,我们先提取从上海出发,三小时内可达的城市列表。
import pandas as pddata = pd.read_csv('通行时间表.csv',engine='python')data_tra = data[data['公交最小花费时间']<=10800]data_drive = data[data['驾车最小花费时间']<=10800]data_tra.to_csv('公交3小时可达城市.csv',index=0,encoding='gbk')data_drive.to_csv('驾车3小时可达城市.csv',index=0,encoding='gbk')
在噼里啪啦30秒coding之后,结果出现了。
可以发现公交可达城市达到9座,而驾车可达城市为7座。去重后,总共12座城市。而驾车和公交均三小时可达的城市是苏州,无锡,常州,杭州,4座城市。公交按时间最远可达城市是马鞍山,需要3小时。驾车最远可达城市是常州,约2.7小时。
好了,该去哪,有方向了吧?最近有部电视剧叫《都挺好》的挺火的,是不是得去苏州见识下大裤衩呢?
最后,我们再来玩点炫酷的。比如画一张OD图直观感受下上海三小时降临范围。
先去百度个性地图订制页面,选取或绘制一份个性地图。
把json代码复制下来,然后随意打开一份Echarts OD图实例。
首先更改stylejson样式,就用刚才复制的代码,转换底图风格。
然后通过echarts官网数据格式转换工具转换,城市坐标和OD路线。
把转换好的数据格式复制进图例代码的固定位置。当然,如果有兴趣,也可以更改一下其他参数,比如线条颜色等等。然后,浏览器打开文件。
公交三小时可达:
驾车三小时可达:
所谓有图有真相,假期郊游,哪些地方距离远,且离家近?有了这份“保姆教程“,想去哪里去哪里!
关注“大鹏教你玩数据”后台回复【42】,可以获取本文源代码和数据
本文作者:聚聚
编辑:蒙妹
扫码关注我们
关注送狗子表情包一张&精选python资料一份
用数据改变未来