R语言usmap包解压问题:如何保留州名及版本变更疑问
usmap包地图数据处理问题解答
解压时保留州名的正确写法
你现在的代码里st_coordinates()会丢掉州名,因为它只输出纯坐标矩阵,不带原数据的属性信息。可以这么改,把州名和坐标绑定在一起:
library(sf) library(dplyr) library(tidyr) # 获取压缩格式的地图数据 us_states <- usmap::us_map() # 转换为sf对象并拆分坐标,同时保留州名 us_map_long <- st_as_sf(us_states) %>% # 给每个州的几何对象加唯一ID mutate(poly_id = row_number()) %>% # 将复合多边形拆分为单个多边形 st_cast("POLYGON") %>% # 提取每个多边形的坐标并转为数据框 mutate(coords = purrr::map(geometry, ~as.data.frame(st_coordinates(.x)))) %>% # 展开坐标数据 unnest(coords) %>% # 保留需要的列 select(state, X, Y, poly_id)
这样得到的结果里就有完整的州名和对应的坐标点了。
为什么us_map()输出变成压缩格式?
usmap包在后续版本更新中(大概v0.7.0之后)切换了数据存储方式,从原来的长格式坐标行改成用sf的sfc类型列存储每个州的几何边界。这么做的核心原因是:
- 缩小数据体积:原来每个坐标点占一行,现在每个州只占一行,几何数据压缩存储,省内存
- 提升处理速度:
sf格式支持更高效的空间运算,比如裁剪、合并等操作 - 适配主流工具:和
sf、ggplot2等现代空间可视化包的兼容性更好
不用手动解压的更优方案
其实完全没必要自己写解压代码,usmap包本身提供了更简便的操作方式:
- 直接绘制地图:用
plot_usmap()一键生成,还支持加标签、自定义颜色:library(usmap) # 绘制带州名标签的美国地图 plot_usmap(regions = "states", labels = TRUE, label_color = "darkblue") - 配合ggplot2使用:用
get_usmap()获取标准sf对象,直接传入ggplot即可:library(ggplot2) us_sf <- get_usmap(regions = "states") ggplot(us_sf) + geom_sf(aes(fill = state)) + theme_void() + labs(title = "美国各州地图") - 如果确实需要长格式坐标数据,上面的tidyverse方法就是最稳妥的,比你原来的临时方案更可靠。
内容的提问来源于stack exchange,提问作者coronusx
相关产品推荐
相关产品推荐

