查看: 4207|回复: 20

从Openstreetmap获取路网数据并制作shapefile图层

[复制链接]
发表于 2022-9-26 20:38:26 | 显示全部楼层 |阅读模式
一、从Openstreetmap获取路网数据
Openstreetmap是一种开源地图,简称osm。其包含图层主要有高速公路、铁路、水系、水域、建筑、边界、建筑物等图层。地址为:https://www.openstreetmap.org
Openstreetmap 的具体使用说明及主页,强烈推荐参考
https://wiki.openstreetmap.org/wiki/Main_Page
https://www.openstreetmap.org/help

从Openstreetmap获取路网数据并制作shapefile图层-8117
OSM有四类地图图层:标准地图、自行车地图、交通地图和Humanitarian地图。
这篇文章主要关注的是路网的数据获取,针对不同范围的数据获取,介绍相应的获取方法。

  • 获取指定范围数据时,可以使用【导出】功能,进行数据的获取。这里主要有简单导出、Overpass API、OSM星球、Geofabrik下载。

从Openstreetmap获取路网数据并制作shapefile图层-2409
点击网站上的【导出】,出现下面的界面。可以手动在地图上选择不同的区域,也可以直接在红色框里面输入对应的最大最小经纬度坐标。

从Openstreetmap获取路网数据并制作shapefile图层-2246

  • 简单导出    在范围选择完成后,点击导出即可完成数据获取;这种简单导出方法只能导出非常小范围的地图数据。You requested too many nodes (limit is 50000).

从Openstreetmap获取路网数据并制作shapefile图层-4080

简单导出限制在节点50000个

从Openstreetmap获取路网数据并制作shapefile图层-4004

点击导出

从Openstreetmap获取路网数据并制作shapefile图层-4214

保存数据


  • Overpass API 导出   简单导出方法只能导出非常小范围的地图数据,如果选址的范围较大,在范围选择完成后,点击Overpass API即可完成数据获取。但是该文件不是一个直接以.osm的 OSM XML数据,具体文件内容则是osm数据,因此在使用的时候和.osm没有差别,只需要在文件后面加后缀.osm即可使用。

从Openstreetmap获取路网数据并制作shapefile图层-8105

从Openstreetmap获取路网数据并制作shapefile图层-5513

下载得到的格式为 文件

从Openstreetmap获取路网数据并制作shapefile图层-3036

数据打开后的格式


  • OSM星球    可以用于下载全球数据,数据量非常大,通常情况我们用不到全球数据,不推荐使用。

从Openstreetmap获取路网数据并制作shapefile图层-9382

  • Geofabrik下载     与OSM星球类似,Geofabrik提供的是以洲际scale提供的分类数据,二级分类是以国家进行的分类。在Geofabrik下载到的至少是以国家范围为基本的数据,我们一般也不常使用,因此不作推荐。

从Openstreetmap获取路网数据并制作shapefile图层-3344

从Openstreetmap获取路网数据并制作shapefile图层-5910
2.  在大多数研究中,经常使用到的是一个城市的路网数据。按照前面的方法,我们需要去查询一个城市的经纬度范围,这样比较繁琐。即使用经纬度范围下载到的城市路网,也会包含一些不属于本城市的数据,因为选择范围是一个矩形,而我们想要的是一个城市准确的路网数据,往往是不规则的,因此我们采用Query 法获取城市路网数据
使用的入口是 http://www.overpass-api.de/index.html  

从Openstreetmap获取路网数据并制作shapefile图层-7867
这里主要包括两步:
第一步:根据城市名获取对应ID。进入Query and Convert Forms,界面如下。在Overpass API Query Form 中输入以下代码(要查哪个城市,将代码中的城市名改一下即可)。注:其中name:zh代表中文地址,否则使用name即可 当然,如果你不喜欢输出格式为XML,也可以将<osm-script>修改为<osm-scriptoutput="json">定义输出数据格式为JSON,一般用默认格式。
<osm-script>
  <query type="relation">
    <has-kv k="boundary" v="administrative"/>
        <has-kv k="name:zh" v="郑州市"/>
  </query>
  <print/></osm-script>
从Openstreetmap获取路网数据并制作shapefile图层-8391

输入相应代码,点击Query

保存Interpreter文件,打开该文件,可以查得relation id 为 3283765,这就代表着郑州市的ID为3283765。后面第二步我们将利用这个ID获取该城市的路网数据。

从Openstreetmap获取路网数据并制作shapefile图层-8739
第二步:根据城市ID获取路网数据。再次在主界面的Overpass API Query Form(即第一个查询框中)输入代码如下,其中代码的<area-query ref=" ">中的数字代码需要修改为ID对应的数字代码,ref的代码值为3600000000+城市ID(例如:郑州的ID为3283765,则郑州对应的ref值为3600000000+3283765=3603283765)。点击右侧的Query按钮,即可将结果从浏览器下载到本地,文件名为可以自己命名保存,打开后即可得到路网数据。此时数据格式仍为OSM标准的格式,需要转换为常用的shp格式。
<osm-script timeout="1800" element-limit="100000000">
  <union>
    <area-query ref="3603283765"/>
    <recurse type="node-relation" into="rels"/>
    <recurse type="node-way"/>
    <recurse type="way-relation"/>
  </union>
  <union>
    <item/>
    <recurse type="way-node"/>
  </union>
  <print mode="body"/>
</osm-script>
从Openstreetmap获取路网数据并制作shapefile图层-3661

从Openstreetmap获取路网数据并制作shapefile图层-2248
二、将获取到的osm文件转换为shapefile文件
第一部分的内容已经可以从Openstreetmap上获取到各种范围下的路网osm数据文件,但是我们常用的路网数据是shapefile文件,因此需要将其转为shp文件。这里采用ArcGis软件来完成数据转换,需要安装ArcGIS Editor for OpenStreetMap插件。
第一步:安装ArcGIS Editor for OpenStreetMap插件。该插件各版本的下载地址查询:
https://www.esri.com/en-us/arcgis/products/arcgis-editor-for-openstreetmap
https://github.com/Esri/arcgis-osm-editor
下载后直接解压,双击对应版本.exe安装即可,安装完成后。打开ArcMap,发现ArcToolbox还没有该插件,点击自定义,勾选上Openstreetmap,将插件添加到工具箱中,工具箱会出现OpenStreetMap Toolbox.tbx。

从Openstreetmap获取路网数据并制作shapefile图层-231

从Openstreetmap获取路网数据并制作shapefile图层-9449
第二步:将OSM数据转为shp数据

  • 本地新建一个文件地理数据库。

从Openstreetmap获取路网数据并制作shapefile图层-8742

  • 使用OpenStreetMap Toolbox.tbx工具中的Load OSM File功能,将生成结果输出到新建的文件地理数据库。转换完成后,会生成点线面shp文件,对应着不同的数据信息,可以查看官方文档对不同字段的定义。这时文件地理数据库中存储着转换后的数据,我们只需要将路网图层导出为shapefile文件就可以了。

从Openstreetmap获取路网数据并制作shapefile图层-1881

从Openstreetmap获取路网数据并制作shapefile图层-8609

从Openstreetmap获取路网数据并制作shapefile图层-6399

补充:前面有一篇爬取公交线路数据的内容,爬取到的是线路的经纬度数据,以点的形式存在,需要将其生成线路shapefile文件,可以利用python进行生成,我们也可以利用arcgis中的工具箱直接生成。具体步骤如下:
第一步:生成点图层,将数据点直接显示,同时将生成的点图层加载到ArcMap中。

从Openstreetmap获取路网数据并制作shapefile图层-9856

显示点坐标

从Openstreetmap获取路网数据并制作shapefile图层-7060

将点数据转变为shp文件

从Openstreetmap获取路网数据并制作shapefile图层-3893

将生成的数据点图层导入

第二步:将点图层转为线图层。选择ArcToolbox->Data Management Tools->要素->点集转线,然后将生成的线图层进行导出为shp文件。

从Openstreetmap获取路网数据并制作shapefile图层-9837

从Openstreetmap获取路网数据并制作shapefile图层-5280

点转线

从Openstreetmap获取路网数据并制作shapefile图层-7734

参考:
https://www.e-learn.cn/topic/3193717
https://zhuanlan.zhihu.com/p/93239773
https://jingyan.baidu.com/article/9225544652542e851648f4fa.html
发表于 2022-9-26 20:48:35 | 显示全部楼层
请问一下osm现在是不能用了么,为什么我点进去我的标准模式是一片灰色的,没有任何东西
回复 支持 反对

使用道具 举报

发表于 2022-9-26 20:58:23 | 显示全部楼层
可以用的啊
回复 支持 反对

使用道具 举报

发表于 2022-9-26 21:08:08 | 显示全部楼层
请问一下,我按步骤了操作了,为什么在转化为shp文件时老是报错,提示我未将对象引用设置到对象的实例。[大哭]
回复 支持 反对

使用道具 举报

发表于 2022-9-26 21:19:43 | 显示全部楼层
请问一下你找到解决办法了吗?我搞了两天还是一直失败心态要崩了
回复 支持 反对

使用道具 举报

发表于 2022-9-26 21:27:24 | 显示全部楼层
没有,,我直接用天地图矢量化了,自己去画。
回复 支持 反对

使用道具 举报

发表于 2022-9-26 21:42:03 | 显示全部楼层
有没有实时的道路速度值呢?
回复 支持 反对

使用道具 举报

发表于 2022-9-26 21:56:53 | 显示全部楼层
可以下载历史交通数据吗
回复 支持 反对

使用道具 举报

发表于 2022-9-26 22:07:12 | 显示全部楼层
可以高德API吧
回复 支持 反对

使用道具 举报

发表于 2022-9-26 22:21:23 | 显示全部楼层
感谢,准备照着试下
回复 支持 反对

使用道具 举报

发表于 2022-9-26 22:32:40 | 显示全部楼层
得吗?最后得到数据没
回复 支持 反对

使用道具 举报

发表于 2022-9-26 22:41:00 | 显示全部楼层
为什么总是,提示我未将对象引用设置到对象的实例啊?
回复 支持 反对

使用道具 举报

发表于 2022-9-26 22:47:30 | 显示全部楼层
我也是,我按这个方法也没成功
回复 支持 反对

使用道具 举报

发表于 2022-9-26 22:54:33 | 显示全部楼层
您好,我按照上面的方法转为了shp格式,可是有部分路段有俩根线,路口处也有点混乱,请问这该怎么解决呀?
回复 支持 反对

使用道具 举报

发表于 2022-9-26 23:08:20 | 显示全部楼层
得到了哦
回复 支持 反对

使用道具 举报

发表于 2022-9-26 23:14:13 | 显示全部楼层
interpreter怎么打开呀
回复 支持 反对

使用道具 举报

已绑定手机
发表于 2022-9-26 23:28:15 | 显示全部楼层
同问
同学你现在会了吗
回复 支持 反对

使用道具 举报

发表于 2022-9-26 23:40:29 | 显示全部楼层
有很多文本编辑软件都可以打开比如notepad++、sublime text
回复 支持 反对

使用道具 举报

发表于 2022-9-26 23:54:18 | 显示全部楼层
请问,如果我只想要高速公路数据,应如何处理?
回复 支持 反对

使用道具 举报

已绑定手机
发表于 2022-9-27 00:04:10 | 显示全部楼层
前辈,您下载找到了历史交通数据了吗
回复 支持 反对

使用道具 举报

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

本版积分规则

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