便捷小工具| 利用R语言下载OpenStreetMap数据
“ OpenStreetMap是一个开源地图网站,提供了行政边界、道路、POIs、建筑轮廓等矢量信息。本文将介绍一种使用R语言下载指定区域、指定内容OSM数据的方法。”01
—
准备工作
安装并调用所需的package
#install the osmdata, sf, tidyverse and ggmap packageif(!require("osmdata")) install.packages("osmdata")if(!require("tidyverse")) install.packages("tidyverse")if(!require("sf")) install.packages("sf")if(!require("ggmap")) install.packages("ggmap")#load packageslibrary(tidyverse)library(osmdata)library(sf)library(ggmap)
02
—
确定下载地图的范围
在开始下载OSM数据前,我们要先确定希望获取OSM地图的空间范围。可以采用两种方式:第一种直接使用地名,可以是"beijing", "北京",“北京海淀区”等。
第二种可以通过坐标设定边框范围进行下载,格式为c(left = , bottom = , right = , top = ), 上下左右的坐标值从OSM导出页面获取。
可以通过以下语句检验地图是不是理想范围。比较推荐使用坐标设置的方式。
#以地名搜索范围mad_map <- get_map(getbb("天津市南开区"),source='osm')ggmap(mad_map)#以坐标设定范围mad_map <- get_map(c(left = 116.1900, bottom = 39.7946, right = 116.5292, top = 39.9545))ggmap(mad_map)
03
—
下载所需OSM数据
OSM地图由多种要素类组成,比如道路(highway)、便利设施(amenity)、边界(boundary)、商店(shop)、铁路(railway)等等。各类要素的详细解释见https://wiki.openstreetmap.org/wiki/Map_features
在R中可以使用available_features()、available_tags()查看OSM地图的要素类型名称
#查询OSM可提供的所有要素类型available_features()#查询特定要素类型的细分类,比如highway的细分类available_tags('highway')## "bridleway""bus_guideway""bus_stop" "construction""corridor""crossing" "cycleway""elevator" "emergency_access_point"## "emergency_bay" "escape" "footway" "give_way""living_street" "milestone" ## "mini_roundabout" "motorway" "motorway_junction" "motorway_link" "passing_place" "path" ## "pedestrian" "platform""primary" "primary_link" "proposed" "raceway""residential""rest_area" "road"## "secondary""secondary_link" "service" "services" "speed_camera" "steps" "stop" "street_lamp" "tertiary""tertiary_link" "toll_gantry" "track" ## "traffic_mirror" "traffic_signals" "trailhead" "trunk" "trunk_link" "turning_circle" "turning_loop" "unclassified"
通过查询,我们记录希望下载的要素类型名称,然后就可以运行以下代码下载数据了。getbb()语句中写入下载地图的范围,add_osm_feature()语句中写入要素类型名称。osmdata_sf()获取OSM地图的数据为sf格式,此外还有osmdata_sp()和osmdata_xml()语句对应获取数据为sp和xml格式。我们主要介绍获取sf格式数据,并存储为shp文件的方式。
#building the query##地名q1 <- getbb("天津市南开区")%>%opq()%>%add_osm_feature("highway")##坐标q2 <- c(left = 116.1900, bottom = 39.7946, right = 116.5292, top = 39.9545)%>%opq()%>%add_osm_feature("amenity")#download osmdatamap1 <- osmdata_sf(q1)map1map2 <- osmdata_sf(q2)map2#save as shapefile,choose osm_points, osm_lines, osm_polygonsst_write(obj=map1$osm_lines, dsn = "存储路径/highway.shp",driver = "ESRI Shapefile", delete_layer = T)st_write(obj=map2$osm_points, dsn = "存储路径/amenity.shp",driver = "ESRI Shapefile", delete_layer = T)
在存储为shp文件时,需要调整obj内容,如果是点要素(比如获取poi数据),则obj=map$osm_points;如果是线要素,则obj=map$osm_lines;如果是面要素,则obj=map$osm_polygons。
我们使用ggmap快速浏览一下下载获取的osm数据
#绘制map1ggplot(map1$osm_lines)+geom_sf(colour="#08519c", alpha=0.5, size=0.5)+labs(x="",y="")+theme_void()#绘制map2ggmap(get_map(c(left = 116.1900, bottom = 39.7946, right = 116.5292, top = 39.9545)))+geom_sf(data=map2$osm_points, inherit.aes =FALSE, colour="#08519c", fill="#08306b", alpha=.3, size=1, shape=21)+labs(x="",y="")+theme_void()
得到map1和map2如下图所示
这样,就完成了指定区域、指定内容的OSM数据下载。这种方式能够自由挑选下载内容,比从OSM星球或者Geofabrik下载数据包的速度快很多,得到的数据可以用来做区位图、分析图底图或者进行空间数据研究分析等等。
本方法参考r-blogger中一篇博文写作,推荐感兴趣的朋友们去看一看原文,作者还提供了使用ggmap绘图的方法。
地址:https://www.rbloggers.com/2018/11/accessing-openstreetmap-data-with-r/
点击下方把文章收藏起来,想用的时候可以随时翻出来参考哦。
页:
[1]