本文对应脚本已上传至我的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

  了解了上述步骤之后,我们利用requestsgeopandas等库仅用不到100行代码就可以参考上述过程,提取所需的shapefileGeoJSON文件保存到本地,具体的代码部分本文不做详细说明,我将这部分功能封装到文章开头对应Github仓库下的OsmDownloader.pyhttps://github.com/CNFeffery/DataScienceStudyNotes/blob/master/(数据科学学习手札80)用Python编写小工具下载OSM路网数据/OsmDownloader.py )中,可以自行去下载并使用,下面我们来学习如何在Python中使用它。

2.2 使用方式

  按照上文所述的地址下载对应脚本之后(请提前安装完成requestsgeopandaspandas以及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路网数据的更多相关文章

  1. (数据科学学习手札90)Python+Kepler.gl轻松制作时间轮播图

    本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl作为一款强大的开源地理信 ...

  2. (数据科学学习手札32)Python中re模块的详细介绍

    一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...

  3. (数据科学学习手札109)Python+Dash快速web应用开发——静态部件篇(中)

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

  4. (数据科学学习手札112)Python+Dash快速web应用开发——表单控件篇(上)

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

  5. (数据科学学习手札85)Python+Kepler.gl轻松制作酷炫路径动画

    本文示例代码.数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl相信很多人都听说过,作为 ...

  6. (数据科学学习手札106)Python+Dash快速web应用开发——回调交互篇(下)

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

  7. (数据科学学习手札116)Python+Dash快速web应用开发——交互表格篇(中)

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

  8. (数据科学学习手札126)Python中JSON结构数据的高效增删改操作

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一期文章中我们一起学习了在Python ...

  9. (数据科学学习手札06)Python在数据框操作上的总结(初级篇)

    数据框(Dataframe)作为一种十分标准的数据结构,是数据分析中最常用的数据结构,在Python和R中各有对数据框的不同定义和操作. Python 本文涉及Python数据框,为了更好的视觉效果, ...

随机推荐

  1. Network Saboteur (DFS)

    题目: A university network is composed of N computers. System administrators gathered information on t ...

  2. [PyTorch入门]之从示例中学习PyTorch

    Learning PyTorch with examples 来自这里. 本教程通过自包含的示例来介绍PyTorch的基本概念. PyTorch的核心是两个主要功能: 可在GPU上运行的,类似于num ...

  3. 查询优化基础知识 - chendh blog

    概述 处理一个给定的查询,尤其是复杂查询,通常会有许多种策略,查询优化就是从这许多策略中找出最有效的查询执行计划的处理过程. 查询执行计划的步骤 产生逻辑上与给定表达式等价的表达式: 估计每个执行计划 ...

  4. 年薪5w和50w的人,区别到底在哪?

    年薪5w和50w的人,区别到底在哪? 2017-02-22 阿青 360投资圈 文/ 阿青 许多人在职场摸爬滚打很多年并不顺利,薪酬一直上不去.职场鸡汤喝了不少,也掌握了不少职场技能,工作经验也颇为丰 ...

  5. QIs for Spread

    玩了好几天,看了好多剧,所以这几天的进度稍微有点慢,另外,<一起同过窗>真香! 延展特性涉及解集覆盖的区域.一个具有良好分布的解集应该包含来自PF每个部分的解集,而不遗漏任何区域.然而,大 ...

  6. 美团CodeM 资格赛第一题

    美团外卖的品牌代言人袋鼠先生最近正在进行音乐研究.他有两段音频,每段音频是一个表示音高的序列.现在袋鼠先生想要在第二段音频中找出与第一段音频最相近的部分. 具体地说,就是在第二段音频中找到一个长度和第 ...

  7. C++扬帆远航——2

    /* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:test.cpp * 作者:常轩 * 完成日期:2016年3月6 ...

  8. webpack 手动创建项目

    前言: webpack作为当前算是比较流行的打包工具之一,通过设置入口文件开始会把入口文件所依赖的所有文件(js,css,image等)进行对应的打包处理,其实现当时真的是很独特.现在流行的脚手架工具 ...

  9. 全网最详细的一篇Flutter 尺寸限制类容器总结

    Flutter中尺寸限制类容器组件包括ConstrainedBox.UnconstrainedBox.SizedBox.AspectRatio.FractionallySizedBox.Limited ...

  10. Ubuntu pppoe宽带拨号相关问题

    因为可视化界面没有相关设置,因此采用终端命令的方法. 测试环境:Ubuntu 18.0.4 pppoe的配置:$ sudo pppoeconf 然后进入此界面进行一系列宽带拨号的设置. 联网:$ su ...