如何在R中绘制native-land.ca原住民领地GeoJSON数据并生成静态地图
解决方案
第一步:正确读取GeoJSON文件
你之前遇到的各类读取报错、普通数据框无法绘图的问题,核心原因是没有使用R空间数据生态的标准工具包sf,老版本的geojson处理包维护性差、对特殊格式GeoJSON兼容性不足,按以下步骤操作即可解决:
- 安装依赖包
install.packages(c("sf", "ggplot2", "ggspatial"))
- 读取文件
不要直接读取线上URL避免404报错,先把native-land的GeoJSON文件下载到本地,再执行读取代码,drop_zm = TRUE参数可直接删除多余的z维度,解决z值维度错误:
native_land <- sf::st_read( "你的本地文件存储路径.json", drop_zm = TRUE, # 去掉多余z坐标 check_ring_dir = TRUE, # 修正面要素环方向避免绘图错误 quiet = TRUE ) # 校验读取结果,可看到包含领地名称列和geometry空间几何列 head(native_land)
第二步:绘制带自定义配色和领地名称的静态地图
直接用ggplot2的geom_sf层即可完成绘图,支持完全自定义配色和标注:
# 自定义配色,替换为你需要的领地名称和对应色值即可 custom_palette <- c( "领地A名称" = "#2E8B57", "领地B名称" = "#8B4513", "领地C名称" = "#4682B4" # 按需补充更多配色,数量和领地数量匹配即可 ) library(ggplot2) library(ggspatial) ggplot() + # 可选:添加底图,zoom值越大底图细节越丰富 annotation_map_tile(type = "osm", zoom = 5, alpha = 0.7) + # 绘制领地面要素,设置边界线样式 geom_sf(data = native_land, aes(fill = Name), color = "white", linewidth = 0.2) + # 应用自定义配色,设置图例标题 scale_fill_manual(values = custom_palette, name = "原住民领地名称") + # 添加领地名称标注,标注位置自动取几何中心 geom_sf_text(data = native_land, aes(label = Name), size = 3, color = "black") + # 优化主题样式 theme_minimal() + theme( axis.text = element_blank(), axis.title = element_blank(), panel.grid = element_blank(), legend.position = "bottom" )
绘图完成后用ggsave("输出文件路径.png", width = 10, height = 8, dpi = 300)即可导出高清静态图。
历史报错原因说明
jsonlite::fromJSON读取后生成的是普通嵌套列表/数据框,未绑定空间坐标系属性,因此无法直接用于空间绘图- geojsonR、geojsonio均为停止维护的老旧工具包,对带z值、坐标嵌套层级复杂的GeoJSON兼容性差,
sf是目前R空间数据的官方标准工具,兼容绝大多数空间数据格式
内容的提问来源于stack exchange,提问作者AleC
相关产品推荐
相关产品推荐

