You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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调用报错的原因

  1. 不加引号写map.osm会被R识别为变量名,触发变量未找到报错
  2. osmdata_sf默认优先将传入的字符串判定为Overpass API查询语句,直接传文件名会触发网络请求,才会出现无法解析API域名的报错
  3. 直接指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 05:06:04