查看: 1468|回复: 12

利用OpenStreetMap获取大洲、国家、省市、行政区路网数据

[复制链接]
发表于 2022-9-26 08:50:01 | 显示全部楼层 |阅读模式
最近需要获取国内个别城市的路网数据,通过知乎、B站现学了如何从Openstreetmap上下载并导入城市路网数据到Arcgis了。这里想把自己不多的经验分享给大家,希望能帮助需要的朋友~
获取某一较小区域的路网数据方法

在Openstreetmap里选择所需位置的矩形区域,生成对应的osm文件,按要求导入arcgis中即可。这个是最简单的,但往往能获取的区域范围有限,似乎是节点不能超过5000个。
获取大洲/国家/省份/直辖市/特别行政区的数据方法


  • 获取省市、直辖市、特别行政区路网可参看这个网址:
尤其注意!!!台湾省没有被OSM纳入!!!如果要画全国路网!!!一定要记得!!!

  • 获取其他大洲/外国路网参考:
获取指定城市路网的方法

这里比较推荐的是用Overpass API,知乎和B站都有相关教程。主要分为两个步骤:(1)获取城市ID(2)通过ID获取路网数据。
可以参考师兄的这篇帖子,步骤很详细,代码可直接复制:
不过在实际操作中,我有了一些小发现,或许可以让OVERPASS API使用更快捷。之前我下载国内城市路网的时候都是在OVERPASS上先获取城市ID(通常为7位数)。比如长沙市,interpreter文件打开后显示长沙的ID是:3202711

利用OpenStreetMap获取大洲、国家、省市、行政区路网数据-54

图1. 在OVERPASS API上获取长沙ID,见生成的interpreter文件

但这个数字我其实在OSM官网页面上就见到过,左上角这不就是我心心念念的长沙ID。早知道这么方便我就不用一次次在OVERPASS API里 输入-下载-打开-复制 了。如果需要大批量获取城市路网id,建议写个小程序直接爬取。

利用OpenStreetMap获取大洲、国家、省市、行政区路网数据-6528

图2.OSM输入长沙市后出现的界面,注意左上角!

获取某一行政区路网的方法

之前的笨办法:【城市整体路网osm】>>【城市行政区划shp】>>【某一行政区shp】,这种方法是可以,但是很慢...
高效一点的办法:
今天下午师姐问我——

利用OpenStreetMap获取大洲、国家、省市、行政区路网数据-2291

图3

师姐的想法和我不谋而合,但是问题来了,我连纽约路网都还没有GET到,而且要是一点一点裁处曼哈顿区也未免太繁琐了,我还要追番呢!
我在网上一通搜索:曼哈顿路网、Manhattan road network、Manhattan  traffic network shp,均以失败告终。于是我我想到之前下载城市路网时的城市ID,或许每个城市的行政区也有一个ID呢?抱着试试的心态,我又去OSM官网上搜索了Manhattan,真的有诶!

利用OpenStreetMap获取大洲、国家、省市、行政区路网数据-65

图4. OSM上Manhattan搜索结果,注意左上角

于是我把8398124复制下来,顺利地获取了曼哈顿区的路网数据interpreter文件啦!稍作处理,得到了节点和边的文件,也可以在arcgis上作出路网图哦,大功告成!好耶!
【关于这个interpreter文件有朋友说处理不了,我的做法是手动添加后缀.osm,这样可以直接在arcgis里读取,也可以用python库处理(下面这个python库↓)】

利用OpenStreetMap获取大洲、国家、省市、行政区路网数据-4552
获取历史年份路网的方法

分享一些自己知道的渠道,如果有其他方法或者数据源,请cue我谢谢!
(1)https://download.geofabrik.de/asia/china.html# 仍然是在osm可以获取2014年以后的路网数据。

利用OpenStreetMap获取大洲、国家、省市、行政区路网数据-1185
(2)北京大学城市与环境学院 [v1.0.0] 北京大学地理数据平台

利用OpenStreetMap获取大洲、国家、省市、行政区路网数据-7444
OSMnx:用python获取某一区域的路网

上面介绍的基本都是手动调整或是需要鼠标点点点操作才能获取路网,其实也有python库可以帮助我们得到路网——OSMnx。这个库不仅能够实现路网的下载,还可进行可视化、网络基本统计、存储为shp格式、计算最短路等等,个人认为配合networkx库使用效果更好!以下是OSMnx的相关链接:
介绍网站:https://geoffboeing.com/2016/11/osmnx-python-street-networks/
python包函数/功能:https://osmnx.readthedocs.io/en/stable/
在此我就不过多介绍该python库的使用了,大家可以去搜搜其他的博客或者看官网介绍。在我的学习过程中认为有以下需要注意(个人看法):

  • OSMnx的下载:记得我第一次下载很不顺利,大家务必要有耐心,重要的是要把geopandas以及它的各种依赖包按顺序、按版本下载好!
  • 下载路网:在网上找案例代码的时候,需要关注一下博客发表时间,在2020-2021年这个库的下载函数进行了修正,如果直接博主们的copy代码会报错。比如说:以前的下载是“gdf_from_place”,现在是“graph_from_address”。所以说大家可以配合网页来看,不要一味地按照博主现成的文章来~
  • 关于下载时间:目前我尝试过(1)给定很小的经维度范围下载路网;(2)给定城市某一区域下载路网(例如长沙市,雨花区);(3)给定城市或行政区面状shp下载路网(例如深圳福田区↓)。我尝试直接用代码“ox.graph_from_address”直接下载深圳市路网,但真的非常非常非常非常非常慢!!!更不要说北京、上海的路网了!!!所以目前我下载城市路网的方法,推荐用第(3)中,虽然真的有一丢丢麻烦,需要提前给定shp!!!如果有更好的方法提高下载效率请cue我,谢谢!

利用OpenStreetMap获取大洲、国家、省市、行政区路网数据-4619
OSM2GMNS:简化OSM文件,简单易上手!

我参考的是周学松老师团队开发的python库,可以参考这篇文章,简单易上手!
小结

以上是最近学到的一些内容,并且是我在实际操作过程中认为比较高效的路网获取思路。如果有更好的方法或者技巧希望大家积极分享,如果有用就点个赞叭~

利用OpenStreetMap获取大洲、国家、省市、行政区路网数据-4202
发表于 2022-9-26 09:04:15 | 显示全部楼层
感恩[爱],总算有点头绪了
回复 支持 反对

使用道具 举报

发表于 2022-9-26 09:19:10 | 显示全部楼层
[大笑]很开心能帮到你
回复 支持 反对

使用道具 举报

发表于 2022-9-26 09:32:23 | 显示全部楼层
大神,下载了那个省的,它是pbf格式,可以那可以直接在gis打开吗,如果不行那要怎么转[思考],还有省份那个除了pbf格式的另外一个是有什么用呀,不懂[好奇]
回复 支持 反对

使用道具 举报

发表于 2022-9-26 09:39:54 | 显示全部楼层
听我说,谢谢你,因为有你,温暖了四季
回复 支持 反对

使用道具 举报

发表于 2022-9-26 09:46:09 | 显示全部楼层
你好,才看见消息。关于pbf我自己也没有找到很方便的打开方式,我自己的做法是采用python 的osm2gmns库,调取里面的读取pbf的命令。你可以去了解一下这个库,或许有帮助!
回复 支持 反对

使用道具 举报

发表于 2022-9-26 09:58:44 | 显示全部楼层
好的好的,听到了~
回复 支持 反对

使用道具 举报

发表于 2022-9-26 10:13:24 | 显示全部楼层
请问如何加代码下载某地区历史数据呢,万分感谢[拜托]
回复 支持 反对

使用道具 举报

发表于 2022-9-26 10:18:50 | 显示全部楼层
不好意思,这个我也没有成功过[大哭]
回复 支持 反对

使用道具 举报

发表于 2022-9-26 10:29:02 | 显示全部楼层
请问一下如何获取特定省份的高速公路路网图呢
回复 支持 反对

使用道具 举报

发表于 2022-9-26 10:43:01 | 显示全部楼层
您好,请问如何获取某个市区的主干道路网呢?直接用OSM的话会有很多小路也算进去了
回复 支持 反对

使用道具 举报

发表于 2022-9-26 10:56:50 | 显示全部楼层
我能想到的有两个办法:(1)把整个osm下载下来,存储节点信息和边信息(用我上面提到的osm2gmns库可以实现)后筛选你要的道路等级(2)上面提到的osmnx库可以在下载时可以在函数里增设highway参数用来表示指定等级,具体的可以翻看一下用户手册!
回复 支持 反对

使用道具 举报

发表于 2022-9-26 11:11:23 | 显示全部楼层
请问可不可以利用overpass API获得省级路网数据?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

快速回复 返回顶部 返回列表