(数据科学学习手札80)用Python编写小工具下载OSM路网数据
本文对应脚本已上传至我的
Github
仓库https://github.com/CNFeffery/DataScienceStudyNotes
1 简介
我们平时在数据可视化或空间数据分析的过程中经常会需要某个地区的道路网络及节点数据,而OpenStreetMap
就是一个很好的数据来源(譬如图1柏林路网):
图1
通常我们可以在 https://www.openstreetmap.org/export 中选择矩形区域内的路网矢量数据进行下载,但这种方式对选择区域的大小有一定限制,想获取较大范围区域的路网数据并下载比较费事;而另一种方式是事先下载已经整合好的大区域的文件,譬如在 http://download.geofabrik.de/ 中提供了各大洲、国家等大范围的数据整合包,可以花费一定时间将其下载下来,再在需要哪些小区域时在本地GIS
软件或编程工具中裁剪下所需的范围路网,但这种方式一是对电脑资源要求较高,譬如中国范围路网信息shapefile文件大小达到了800多兆,二是OSM
的路网信息不定期更新之后,要想及时跟上最新数据,就需要人工持续下载数据。
为了更加灵活自由,且即时地获取最新版本的OSM
路网,我们可以利用Python
,来编写脚本工具方便快捷地检索或下载OSM
可以识别出的各个级别行政区对应的矢量格式数据。
2 基于Python的OSM路网下载
2.1 工作流程
编写这个工具灵感来源于 https://anvaka.github.io/city-roads/?q= 这个网站:
图2
用户通过输入指定城市的名称并检索,等待数据资源加载完成之后就可以在网页中看到渲染好的城市路网,以重庆为例:
图3
通过对该网站进行抓包和源码分析,我弄明白了其工作流程大致如下:
Step1:
根据用户输入的城市名称,利用OSM官方的API进行模糊匹配,获取可能的对象列表:
图4
Step2:
用户点击选择正确的区域,后台js对其所对应的id信息进行变换,再通过网站自带的API获取对应的
.pbf
格式数据,或overpass
的API获取JSON
格式的矢量数据。
图5
Step3:
渲染路网:
图6
了解了上述步骤之后,我们利用requests
、geopandas
等库仅用不到100行代码就可以参考上述过程,提取所需的shapefile
或GeoJSON
文件保存到本地,具体的代码部分本文不做详细说明,我将这部分功能封装到文章开头对应Github
仓库下的OsmDownloader.py
(https://github.com/CNFeffery/DataScienceStudyNotes/blob/master/(数据科学学习手札80)用Python编写小工具下载OSM路网数据/OsmDownloader.py )中,可以自行去下载并使用,下面我们来学习如何在Python
中使用它。
2.2 使用方式
按照上文所述的地址下载对应脚本之后(请提前安装完成requests
、geopandas
、pandas
以及tqdm
这几个三方库),记住其所在路径,接着在其他脚本开头导入模块部分添加:
import sys
sys.path.append(r'所在路径')
from OsmDownloader import OsmDownloader
这样才能成功导入没有在Python
中注册过的独立模块,接下来我们来下载数据,只需要两行代码即可完成对单个行政区路网数据的下载,以成都市为例:
# 单个地区路网下载
downloader = OsmDownloader(area='成都市') # area参数控制检索的行政区,请尽量准确填写
downloader.download_shapefile(path='保存路径') # path参数控制文件保存的路径
程序运行后稍等片刻即可完成下载(具体的耗时取决于你的网络状况),譬如这里我花了不到20秒就完成成都市路网数据的下载:
图7
保存下来的数据线图层与点图层分开保存:
图8
图9
如果你想要下载保存JSON
格式的数据,换成downloader.download_geojson(path)
即可,而如果你想要批量下载多个地区的数据,结合for循环即可,如下例:
# 多个地区路网下载
area_list = ['北京市', '重庆市江北区', 'Tokyo', 'Boston', '台湾省']
for area in area_list:
downloader = OsmDownloader(area=area)
downloader.download_shapefile(path='保存路径')
等待一段时间后,我们area_list
里多个不同级别行政区的路网数据便下载完成:
图10
如果担心中途网络连接原因导致中断,可以结合Python
中的错误捕捉机制来进行相对应的处理,比较简单这里就不再赘述。
以上就是本文全部内容,对脚本获取或使用有疑问的可以留言告诉我。
(数据科学学习手札80)用Python编写小工具下载OSM路网数据的更多相关文章
- (数据科学学习手札90)Python+Kepler.gl轻松制作时间轮播图
本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl作为一款强大的开源地理信 ...
- (数据科学学习手札32)Python中re模块的详细介绍
一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...
- (数据科学学习手札109)Python+Dash快速web应用开发——静态部件篇(中)
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...
- (数据科学学习手札112)Python+Dash快速web应用开发——表单控件篇(上)
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...
- (数据科学学习手札85)Python+Kepler.gl轻松制作酷炫路径动画
本文示例代码.数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl相信很多人都听说过,作为 ...
- (数据科学学习手札106)Python+Dash快速web应用开发——回调交互篇(下)
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...
- (数据科学学习手札116)Python+Dash快速web应用开发——交互表格篇(中)
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...
- (数据科学学习手札126)Python中JSON结构数据的高效增删改操作
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一期文章中我们一起学习了在Python ...
- (数据科学学习手札06)Python在数据框操作上的总结(初级篇)
数据框(Dataframe)作为一种十分标准的数据结构,是数据分析中最常用的数据结构,在Python和R中各有对数据框的不同定义和操作. Python 本文涉及Python数据框,为了更好的视觉效果, ...
随机推荐
- 机器学习入门-逻辑(Logistic)回归(1)
原文地址:http://www.bugingcode.com/machine_learning/ex3.html 关于机器学习的教程确实是太多了,处于这种变革的时代,出去不说点机器学习的东西,都觉得自 ...
- (为容器分配独立IP方法二)通过虚拟IP实现docker宿主机增加对外IP接口
虚拟IP.何为虚拟IP,就是一个未分配给真实主机的IP,也就是说对外提供数据库服务器的主机除了有一个真实IP外还有一个虚IP,使用这两个IP中的任意一个都可以连接到这台主机,所有项目中数据库链接一项配 ...
- 码海拾遗:简单Socket(TCP)类实现
最近刚开始啃Unix网络编程(卷1:套接字联网API),为加深TCP连接的建立和终止的理解与记忆,记下本文,方便以后翻看. 同时留下的还有简单的Socket(TCP)类: mySocket.h #pr ...
- Ubunt 16.04 安装 Beyond compare 4
1. 下载安装包: 2. 安装步骤 3. 运行并注册 之前Beyond compare 3 只有32位,在Ubunt 16.04上运行效率非常低,所以只有安装最新的Beyond compare 4,安 ...
- Redis(1)——5种基本数据结构
一.Redis 简介 "Redis is an open source (BSD licensed), in-memory data structure store, used as a d ...
- alibaba开发手册
alibaba开发手册 11.19 强制: 方法参数在定义和传入时,多个参数逗号后边必须加空格. IDE 的 text file encoding 设置为 UTF-8; IDE 中文件的换行符使用 ...
- python数组和字符串互相转换
字符串转数组 str = '1,2,3' arr = str.split(',') 数组转字符串 arr = ['a','b'] str = ','.join(arr) arr = [1,2,3] s ...
- Mysql8以上需要指定时区serverTimezone
JDBC连接Mysql8以下 com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test?useUnicode=true&charac ...
- Fetch API与POST请求那些事
简述 相信不少前端开发童鞋与后端联调接口时,都会碰到前端明明已经传了参数,后端童鞋却说没有收到,尤其是post请求,遇到的非常多.本文以node.js作为服务端语言,借用express框架,简要分析客 ...
- htm5新特性(转)
转自:http://hyuhan.com/2017/07/06/... 今天来谈谈前端面试中基本上每次一面都会被问到的一个问题,那就是html5的新特性了.这个是学习前端必须掌握的基础知识. 新增的元 ...