如何在R中加载本地.osm文件并将其绘制为底图图层
本地.osm文件导入R并绘图的解决方法
方法1:用sf包直接读取(最简便)
sf底层依赖的GDAL原生支持OSM格式解析,可直接读取本地.osm文件的不同要素层:
# 加载sf包 library(sf) # 示例:读取OSM文件中不同类型的要素层,可选层包括points、lines、multilinestrings、multipolygons、other_relations # 读取面要素(建筑、水域等) osm_polygons <- st_read("map.osm", layer = "multipolygons") # 读取线要素(道路、水系等) osm_lines <- st_read("map.osm", layer = "lines") # 读取点要素(POI、公交站等) osm_points <- st_read("map.osm", layer = "points")
读取完成后可直接用ggplot2绘制底图:
library(ggplot2) ggplot() + geom_sf(data = osm_polygons, fill = "#f5f5f5", color = "#999999", linewidth = 0.2) + geom_sf(data = osm_lines, color = "#333333", linewidth = 0.3) + geom_sf(data = osm_points, color = "#e74c3c", size = 1) + theme_minimal()
之前osmdata调用报错的原因
- 不加引号写
map.osm会被R识别为变量名,触发变量未找到报错 - osmdata_sf默认优先将传入的字符串判定为Overpass API查询语句,直接传文件名会触发网络请求,才会出现无法解析API域名的报错
- 直接指定
doc="map.osm"时报way not found,是因为OpenStreetMap官网直接导出的.osm文件格式和osmdata期望的Overpass API返回格式存在差异,未做预处理无法直接解析。
方法2:osmdata包读取本地.osm的正确写法
如果需要用到osmdata的要素分类能力,可按以下方式调用:
library(osmdata) library(xml2) # 先读取本地.osm为xml对象 osm_xml <- read_xml("map.osm") # 再转换为sf格式集合 osm_data <- osmdata_sf(osm_xml)
转换完成后可直接从osm_data$osm_points、osm_data$osm_lines、osm_data$osm_polygons中调取对应类型的要素绘图。
内容的提问来源于stack exchange,提问作者LukasRattle
相关产品推荐
相关产品推荐

