想知道自己30分钟能“走”多远嘛?

  • 前言
  • 一、获取数据
    • 1. 交通生活圈数据
    • 2. 城市区域数据
    • 3. 城市数据
    • 4. 完整代码
  • 二、30分钟交通生活圈
    • 1. 数据分析
    • 2. 完整代码
  • 写在最后

前言

昨天在网上瞎逛的时候,看到了一个概念——交通生活圈,经过一番查阅后,约模知道了它的意思:在现有交通状况下,在一定的时间内乘坐现有交通工具你能抵达的范围(ps.通常是指驾车)。
简单来说,就是:“30分钟内你能走多远?
正好某德地图上也有类似的数据,效果如下:

它包含了20分钟、30分钟、45分钟、60分钟、90分钟这5类数据,它范围即对应的交通生活圈。感觉很厉害的鸭子~

于是,我决定自己探索一番…

一、获取数据

1. 交通生活圈数据

打开浏览器的F12调试工具,监听网络请求:

其接口地址为:

https://report.amap.com/ajax/life/circle.do

有3个参数,对应的说明如下:

参数 说明
districtId 表示区域的ID
dir 0表示出发地,1表示目的地
timeIndex 表示数据的时间

那么,可以定义获取数据的函数:

def get_data(disID):'''获得交通生活圈数据'''url = 'https://report.amap.com/ajax/life/circle.do'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0','Accept': 'application/json, text/javascript, */*; q=0.01','Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','X-Requested-With': 'XMLHttpRequest','Connection': 'keep-alive','TE': 'Trailers',}hour = time.strftime('%H',time.localtime(time.time())) # 当前小时params = (('districtId', disID),('dir', '0'),('timeIndex', hour),)res = requests.get(url, headers=headers, params=params)data = res.json()return data

返回的数据为JSON格式,为一个列表,包含5个子列表,每个列表分别表示20分钟、30分钟、45分钟、60分钟、90分钟的数据。
本以为到这里就大功告成了,然而我们发现districtId为类似“B0FFFDS1JU”的字符串编码,不便于直接利用,因此需要找到它的来源。

2. 城市区域数据

同样是通过F12抓包分析,可以找到一个请求,它可以返回每个城市对应的区域及相关信息(包括了我们苦苦寻找的districtId)。那么,便可以定义相应的函数:

def get_id(cityID):'''获得城市区域ID'''url = 'https://report.amap.com/ajax/life/districts.do'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0','Accept': 'application/json, text/javascript, */*; q=0.01','Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','X-Requested-With': 'XMLHttpRequest','Connection': 'keep-alive','Referer': 'https://report.amap.com/life.do?city=420100','TE': 'Trailers',}params = (('cityCode', cityID),)res = requests.get(url, headers=headers, params=params)data =res.json()return data

通过传入城市ID,便可得到其下区域的相关信息:

如出一辙,传入的参数为城市ID,这并不直观,我们无法很快知道每个城市对应的ID是什么。
正所谓:“探索尚未结束,同志仍需努力…”

3. 城市数据

如法炮制,我们找到了获取城市数据的接口,并定义如下函数:

def get_city():'''获取城市信息(城市名、城市ID等)'''url = 'https://report.amap.com/ajax/getCityInfo.do'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0','Accept': 'application/json, text/javascript, */*; q=0.01','Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','X-Requested-With': 'XMLHttpRequest','Connection': 'keep-alive',}res = requests.get(url, headers=headers)data = res.json()return data

其结果如是:

4. 完整代码

为了更加方便地获取数据,将以上函数整合在一起,完整的代码如下:

# -*- coding: utf-8 -*-
"""
Created on Mon Dec 21 15:14:42 2020@author: kimol_love
"""
import os
import time
import json
import requestsdef get_city():'''获取城市信息(城市名、城市ID等)'''url = 'https://report.amap.com/ajax/getCityInfo.do'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0','Accept': 'application/json, text/javascript, */*; q=0.01','Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','X-Requested-With': 'XMLHttpRequest','Connection': 'keep-alive',}res = requests.get(url, headers=headers)data = res.json()return datadef get_id(cityID):'''获得城市区域ID'''url = 'https://report.amap.com/ajax/life/districts.do'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0','Accept': 'application/json, text/javascript, */*; q=0.01','Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','X-Requested-With': 'XMLHttpRequest','Connection': 'keep-alive','Referer': 'https://report.amap.com/life.do?city=420100','TE': 'Trailers',}params = (('cityCode', cityID),)res = requests.get(url, headers=headers, params=params)data =res.json()return datadef get_data(disID):'''获得交通生活圈数据'''url = 'https://report.amap.com/ajax/life/circle.do'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0','Accept': 'application/json, text/javascript, */*; q=0.01','Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','X-Requested-With': 'XMLHttpRequest','Connection': 'keep-alive','TE': 'Trailers',}hour = time.strftime('%H',time.localtime(time.time())) # 当前小时params = (('districtId', disID),('dir', '0'),('timeIndex', hour),)res = requests.get(url, headers=headers, params=params)data = res.json()return dataif __name__ == '__main__':# 获取城市信息cityInfo = get_city()# 输入城市及片区while True:cityName = input('请输入城市:')flag = 0for city in cityInfo:if cityName == city['name']:cityID = city['code']disIDs = get_id(cityID)if len(disIDs) == 0:flag = 1else:flag = 2breakif flag == 0: # 如果没有该城市print('未找到相关城市!')elif flag == 1: # 如果该城市没有数据print('该城市无数据!:')elif flag == 2: breakprint('-'*20)print(('0==>所有').ljust(10))for i in range(len(disIDs)):print(('%d==>%s'%(i+1, disIDs[i]['name'])).ljust(10))print('-'*20)while True:index = int(input('请选择:'))if index not in range(len(disIDs)+1):print('输入错误!:')else:break# 下载数据if not os.path.exists('./data'):os.mkdir('./data')if index == 0: # 全部下载if not os.path.exists('./data/%s'%cityName):os.mkdir('./data/%s'%cityName)for i in range(len(disIDs)):disID = disIDs[i]['id']data = get_data(disID)data.append(disIDs[i]['center']) # 加入中心点data = json.dumps(data)with open('./data/%s/%s.json'%(cityName,disIDs[i]['name']), 'w') as f:f.write(data)print('"%s"获取成功!'%disIDs[i]['name'])else:disID = disIDs[index-1]['id']data = get_data(disID)data.append(disIDs[index-1]['center']) # 加入中心点data = json.dumps(data)with open('./data/%s.json'%disIDs[i]['name'], 'w') as f:f.write(data)print('"%s"获取成功!'%disIDs[i]['name'])

注:为了便于后续地分析,我们将数据append了一个列表(区域的中心位置),因此data一共包含6个列表:5类数据+中心点位置。

俗话说得好,好用不好用,拉出来run一run:

电闪雷鸣之间,只见所有的数据默默地躺入了我温暖的怀抱~
至此,数据获取的探索便可暂告于段落。

二、30分钟交通生活圈

1. 数据分析

有了数据,通过分析我们便可知道30分钟自己能“走”多远了。这里我们用到了Python中的folium库,它是一个交互式地图库,允许我们调用地图接口进行可视化分析。其安装方法如下:

pip install folium

首先,定义读取数据的函数:

def read_data(path, Type=30):'''读取交通生活圈数据(有20分钟、30分钟、45分钟、60分钟、90分钟)'''typeMap = {20:0,30:1,45:2,60:3,90:4}with open(path, 'r') as f:data = f.read()data = json.loads(data)center = data[-1]data = data[typeMap[Type]]return (center, data)

读取数据(以成都的牛王庙为例):

center, data = read_data('./data/成都/牛王庙.json')
data.append(data[0])
for i in range(len(data)): # 交换经纬度,很重要data[i] = [data[i][1],data[i][0]]

data.append(data[0])是为了使数据形成一个闭环,这样方便在地图上表示出来。
定义地图,并设定相关参数:

Map=folium.Map(location=[center[1],center[0]],zoom_start=11,tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}',attr='default')

在地图上标出起始点:

folium.Marker([center[1],center[0]],popup=folium.Popup('牛王庙',max_width=1000),tooltip='出发点').add_to(Map)

在地图上画出30分钟交通生活的区域:

folium.Polygon(data,color='#7C9F59',fill=True).add_to(Map)

将地图保存到本地:

Map.save('30分钟交通生活圈.html')

打开HTML之后,效果如下:

绿色区域意味着,在当前的交通情况下,我从牛王庙出发,我可以到达的范围,即30分钟我能“走”多远~

2. 完整代码

这一部分的完整代码如下:

# -*- coding: utf-8 -*-
"""
Created on Mon Dec 21 18:58:34 2020@author: kimol_love
"""
import json
import foliumdef read_data(path, Type=30):'''读取交通生活圈数据(有20分钟、30分钟、45分钟、60分钟、90分钟)'''typeMap = {20:0,30:1,45:2,60:3,90:4}with open(path, 'r') as f:data = f.read()data = json.loads(data)center = data[-1]data = data[typeMap[Type]]return (center, data)if __name__ == '__main__':center, data = read_data('./data/成都/牛王庙.json')data.append(data[0])for i in range(len(data)): # 交换经纬度,很重要data[i] = [data[i][1],data[i][0]]Map=folium.Map(location=[center[1],center[0]],zoom_start=11,tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}',attr='default')folium.Marker([center[1],center[0]],popup=folium.Popup('牛王庙',max_width=1000),tooltip='出发点').add_to(Map)folium.Polygon(data,color='#7C9F59',fill=True).add_to(Map)Map.save('30分钟交通生活圈.html')

写在最后

至此,我们大致知道了30分钟自己能“走”多远了~

这里主要是从交通通行情况的角度出发,如果非得说坐飞机、坐火箭、坐大炮啥的。别问我,问了我也不知道(手动捂脸)~

其实,这个数据还可以尝试从更多地角度分析,比如可以计算出30分钟最大抵达半径,并进一步比较不同城市的大小等等。如果有感兴趣的小伙伴,可以试试哦。

我是kimol君,咋们下次再会~

创作不易,大侠请留步… 动起可爱的双手,来个赞再走呗 (๑◕ܫ←๑)

想知道自己30分钟能“走”多远嘛?相关推荐

  1. php k线15分钟 30分钟,15分钟30分钟K线战法

    A.一种利用均线,你在15分钟K线图上设置一根21天均线及一根5天均线,当你看到5天上穿21天均线时那就是买入信号:卖出方法有两种:一般情况下,看到5天均下穿21天均线就要坚决离场:特殊情况下,如该股 ...

  2. 同花顺如何切换k线_30分钟线可分析出庄家的意图:教你如何用30分钟K线选股做超短线...

    30分钟做超短线的好处 1.兼具超短线和短线的优点,是联系超短周期和短周期的有利武器. 2.30分钟线把一天分成8个部分,正好是一个神奇数字,自然界中很多神奇的规律不可不信! 3.对于庄家控盘的股票, ...

  3. 5分钟k线数据 存储_成功率极高的“分时K线战法”:15分钟K线战法+30分钟K线战法...

    实战看盘最常用的就是日.周.月等K线图.这些图形对于我们分析个股走势的确帮助很大,然而遇到调整时,就显示了其宏观有余.微观不足的缺点.但假如我们用分时K线图进行微观的观察与分析,就可以找到一些个股在调 ...

  4. php k线15分钟 30分钟,成功率极高的“分时K线战法”:15分钟K线战法+30分钟K线战法...

    原标题:成功率极高的"分时K线战法":15分钟K线战法+30分钟K线战法 实战看盘最常用的就是日.周.月等K线图.这些图形对于我们分析个股走势的确帮助很大,然而遇到调整时,就显示了 ...

  5. 单词发音软件测试自学,一定要告诉孩子:每天30分钟,用这三个方法学英语,想不考好都难!...

    还记得天才小唱将谭芷涵吗?她在<美国达人秀>娱乐节目仅以一首<我心永恒>就惊艳全场,令评审观众纷纷起立欢呼!在惊讶和激动之余,大家都注意到,除了优秀的唱功以及天籁的嗓音之外,她 ...

  6. 神啊,6小时30分钟,完成想要的所有Lync测试

    神啊 ! 记住这个日子 ! 从未想到,6小时30分钟,能做出这么多东西: 从: 2013-06-28---20:00 到 2013-06-29-----2:30 (辛苦,也是值得,客户是上帝,公司也好 ...

  7. 30分钟搞定ES6常用基础知识

    ES6基础智商划重点 在实际开发中,ES6已经非常普及了.掌握ES6的知识变成了一种必须.尽管我们在使用时仍然需要经过babel编译. ES6彻底改变了前端的编码风格,可以说对于前端的影响非常巨大.值 ...

  8. python在财务上的应用-财会人必看:这个工具,30分钟可以把人家一天的工作都给干完!...

    原标题:财会人必看:这个工具,30分钟可以把人家一天的工作都给干完! 每年3月到6月,工商年报.汇算清缴交织在一起,财务总是被安排得明明白白的.尤其今年还有首次个人所得税汇算清缴! 作为一个财务,除了 ...

  9. python程序员一天写多少行代码-这个工具,30分钟居然把我一天的工作给干完了!...

    前段时间一个话题刷上热搜:如果一直不上班,你的钱能撑多久? 朋友小菲说,这话题她压根就参与不了! 因为在她看来,自己一直是个「又穷又忙」的典型代表: "每天朝九晚九.周末节假日加班也是常态, ...

最新文章

  1. POJ1190 生日蛋糕
  2. C语言第五讲,语句 顺序循环选择.
  3. C语言-数据结构与其他数据形式
  4. 如何用C语言编写PHP扩展的详解
  5. 制作bat脚本,抓取Android设备logcat
  6. activemq和mysql_activeMQ 填坑记
  7. NanShan即时通讯 ie6 ie7 ie8 不支持json 终极解放方案
  8. Nexus修改admin密码及其添加用户
  9. postgresql 备份 java_用JAVA执行CMD命令备份PG数据库,解决需要输入口令的问题
  10. python水印倾斜_python中图像特定位置的水印算法
  11. bytes和string 与 “w“/“r“ “wb“/“rb“的对应关系
  12. 数字图像处理(冈萨雷斯)_数字图像处理笔记总结
  13. 想法随笔——知乎段子
  14. Thinkpad E450c 系统起不来解决方案
  15. 调用本地主干的预训练的.pth文件
  16. mysql 快速造数据sql
  17. 判断某整数是否既是5又是7的整数倍
  18. python 爬虫及数据可视化展示
  19. 如何禁用/启用笔记本内置键盘?
  20. FairyGUI(FGUI)常用方法笔记

热门文章

  1. 4脚无源晶振与有源晶振
  2. 微阵列芯片服务器,微阵列
  3. PLL 锁相环原理介绍
  4. SpringMVC整合Redis实战
  5. 穿越之我是码农 1024 篇
  6. MagicBook荣耀锐龙版笔记本BLOS开启VT
  7. CGMH: Constrained Sentence Generation by Metropolis-Hastings Sampling
  8. 年终总结——思考,沉淀
  9. 在Ubuntu中编译运行C语言
  10. LUOGU P1373 小a和uim之大逃离 题解