从Openstreetmap获取路网数据并制作shapefile图层
一、从Openstreetmap获取路网数据Openstreetmap是一种开源地图,简称osm。其包含图层主要有高速公路、铁路、水系、水域、建筑、边界、建筑物等图层。地址为:https://www.openstreetmap.org
Openstreetmap 的具体使用说明及主页,强烈推荐参考
https://wiki.openstreetmap.org/wiki/Main_Page
https://www.openstreetmap.org/help
OSM有四类地图图层:标准地图、自行车地图、交通地图和Humanitarian地图。
这篇文章主要关注的是路网的数据获取,针对不同范围的数据获取,介绍相应的获取方法。
[*] 在获取指定范围数据时,可以使用【导出】功能,进行数据的获取。这里主要有简单导出、Overpass API、OSM星球、Geofabrik下载。
点击网站上的【导出】,出现下面的界面。可以手动在地图上选择不同的区域,也可以直接在红色框里面输入对应的最大最小经纬度坐标。
[*]简单导出 在范围选择完成后,点击导出即可完成数据获取;这种简单导出方法只能导出非常小范围的地图数据。You requested too many nodes (limit is 50000).
简单导出限制在节点50000个
点击导出
保存数据
[*]Overpass API 导出 简单导出方法只能导出非常小范围的地图数据,如果选址的范围较大,在范围选择完成后,点击Overpass API即可完成数据获取。但是该文件不是一个直接以.osm的 OSM XML数据,具体文件内容则是osm数据,因此在使用的时候和.osm没有差别,只需要在文件后面加后缀.osm即可使用。
下载得到的格式为 文件
数据打开后的格式
[*]OSM星球 可以用于下载全球数据,数据量非常大,通常情况我们用不到全球数据,不推荐使用。
[*]Geofabrik下载 与OSM星球类似,Geofabrik提供的是以洲际scale提供的分类数据,二级分类是以国家进行的分类。在Geofabrik下载到的至少是以国家范围为基本的数据,我们一般也不常使用,因此不作推荐。
2.在大多数研究中,经常使用到的是一个城市的路网数据。按照前面的方法,我们需要去查询一个城市的经纬度范围,这样比较繁琐。即使用经纬度范围下载到的城市路网,也会包含一些不属于本城市的数据,因为选择范围是一个矩形,而我们想要的是一个城市准确的路网数据,往往是不规则的,因此我们采用Query 法获取城市路网数据。
使用的入口是 http://www.overpass-api.de/index.html
这里主要包括两步:
第一步:根据城市名获取对应ID。进入Query and Convert Forms,界面如下。在Overpass API Query Form 中输入以下代码(要查哪个城市,将代码中的城市名改一下即可)。注:其中name:zh代表中文地址,否则使用name即可 当然,如果你不喜欢输出格式为XML,也可以将<osm-script>修改为<osm-scriptoutput=&#34;json&#34;>定义输出数据格式为JSON,一般用默认格式。
<osm-script>
<query type=&#34;relation&#34;>
<has-kv k=&#34;boundary&#34; v=&#34;administrative&#34;/>
<has-kv k=&#34;name:zh&#34; v=&#34;郑州市&#34;/>
</query>
<print/></osm-script>
输入相应代码,点击Query
保存Interpreter文件,打开该文件,可以查得relation id 为 3283765,这就代表着郑州市的ID为3283765。后面第二步我们将利用这个ID获取该城市的路网数据。
第二步:根据城市ID获取路网数据。再次在主界面的Overpass API Query Form(即第一个查询框中)输入代码如下,其中代码的<area-query ref=&#34; &#34;>中的数字代码需要修改为ID对应的数字代码,ref的代码值为3600000000+城市ID(例如:郑州的ID为3283765,则郑州对应的ref值为3600000000+3283765=3603283765)。点击右侧的Query按钮,即可将结果从浏览器下载到本地,文件名为可以自己命名保存,打开后即可得到路网数据。此时数据格式仍为OSM标准的格式,需要转换为常用的shp格式。
<osm-script timeout=&#34;1800&#34; element-limit=&#34;100000000&#34;>
<union>
<area-query ref=&#34;3603283765&#34;/>
<recurse type=&#34;node-relation&#34; into=&#34;rels&#34;/>
<recurse type=&#34;node-way&#34;/>
<recurse type=&#34;way-relation&#34;/>
</union>
<union>
<item/>
<recurse type=&#34;way-node&#34;/>
</union>
<print mode=&#34;body&#34;/>
</osm-script>
二、将获取到的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。
第二步:将OSM数据转为shp数据
[*]本地新建一个文件地理数据库。
[*]使用OpenStreetMap Toolbox.tbx工具中的Load OSM File功能,将生成结果输出到新建的文件地理数据库。转换完成后,会生成点线面shp文件,对应着不同的数据信息,可以查看官方文档对不同字段的定义。这时文件地理数据库中存储着转换后的数据,我们只需要将路网图层导出为shapefile文件就可以了。
补充:前面有一篇爬取公交线路数据的内容,爬取到的是线路的经纬度数据,以点的形式存在,需要将其生成线路shapefile文件,可以利用python进行生成,我们也可以利用arcgis中的工具箱直接生成。具体步骤如下:
第一步:生成点图层,将数据点直接显示,同时将生成的点图层加载到ArcMap中。
显示点坐标
将点数据转变为shp文件
将生成的数据点图层导入
第二步:将点图层转为线图层。选择ArcToolbox->Data Management Tools->要素->点集转线,然后将生成的线图层进行导出为shp文件。
点转线
参考:
https://www.e-learn.cn/topic/3193717
https://zhuanlan.zhihu.com/p/93239773
https://jingyan.baidu.com/article/9225544652542e851648f4fa.html 请问一下osm现在是不能用了么,为什么我点进去我的标准模式是一片灰色的,没有任何东西 可以用的啊 请问一下,我按步骤了操作了,为什么在转化为shp文件时老是报错,提示我未将对象引用设置到对象的实例。[大哭] 请问一下你找到解决办法了吗?我搞了两天还是一直失败心态要崩了 没有,,我直接用天地图矢量化了,自己去画。 有没有实时的道路速度值呢? 可以下载历史交通数据吗 可以高德API吧 感谢,准备照着试下 得吗?最后得到数据没 为什么总是,提示我未将对象引用设置到对象的实例啊? 我也是,我按这个方法也没成功 您好,我按照上面的方法转为了shp格式,可是有部分路段有俩根线,路口处也有点混乱,请问这该怎么解决呀? 得到了哦 interpreter怎么打开呀 同问
同学你现在会了吗 有很多文本编辑软件都可以打开比如notepad++、sublime text 请问,如果我只想要高速公路数据,应如何处理? 前辈,您下载找到了历史交通数据了吗
页:
[1]
2