查看: 1687|回复: 0

便捷小工具| 利用R语言下载OpenStreetMap数据

[复制链接]
发表于 2022-11-10 17:53:58 | 显示全部楼层 |阅读模式
“ 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)
便捷小工具| 利用R语言下载OpenStreetMap数据-9185

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')## [1] "bridleway"  "bus_guideway"  "bus_stop" "construction"  "corridor"  "crossing"    "cycleway""elevator" "emergency_access_point"##[10] "emergency_bay" "escape" "footway" "give_way"  "living_street" "milestone"            ##[16] "mini_roundabout" "motorway" "motorway_junction" "motorway_link" "passing_place" "path"                  ##[22] "pedestrian" "platform"  "primary" "primary_link" "proposed" "raceway"  "residential"  "rest_area" "road"##[31] "secondary"  "secondary_link" "service" "services" "speed_camera" "steps" "stop" "street_lamp" "tertiary"  "tertiary_link" "toll_gantry" "track"             ##[43] "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如下图所示

便捷小工具| 利用R语言下载OpenStreetMap数据-1988



这样,就完成了指定区域、指定内容的OSM数据下载。这种方式能够自由挑选下载内容,比从OSM星球或者Geofabrik下载数据包的速度快很多,得到的数据可以用来做区位图、分析图底图或者进行空间数据研究分析等等。

本方法参考r-blogger中一篇博文写作,推荐感兴趣的朋友们去看一看原文,作者还提供了使用ggmap绘图的方法。

地址:https://www.rbloggers.com/2018/11/accessing-openstreetmap-data-with-r/

点击下方把文章收藏起来,想用的时候可以随时翻出来参考哦。
您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

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