设置CRS后sf对象绘图报错:CRS缺失但st_crs显示已存在
问题解决:设置CRS后ggplot2绘图报错的原因与修复
问题根源
你的问题出在数据准备阶段丢失了sfc对象的CRS信息:
- 最初用
st_as_sf(coords = c('lon','lat'))创建sf对象时,未指定CRS,生成的geometry列(后来改名为geo_col)本身是无CRS的sfc对象。 - 后续将
geo_col赋值给geometry并转成sf对象,再用st_set_crs给sf对象标记CRS,这只是在对象层面添加了CRS元数据,但底层的sfc对象本身仍然没有CRS信息,导致geom_sf尝试转换坐标时触发报错。
修复方案
方案1:数据准备阶段直接指定CRS(推荐)
在最初创建sf对象时就设置CRS,从根源避免CRS信息丢失:
# 修正后的数据准备代码 library(sf) library(ggplot2) library(dplyr) test_df <- data.frame(id = LETTERS[1:6], lon = c(-71.2280234, -112.0863874, -80.2432839, -83.9638426, -76.9199742, -77.097455), lat = c(42.4286907, 33.5080943, 26.6374761, 43.4304646, 40.2398118, 39.0023604)) %>% sf::st_as_sf(coords = c('lon','lat'), crs = 4326) %>% # 直接指定CRS rename(geo_col = geometry) %>% as_tibble() # 绘图代码无需额外设置CRS,直接使用 new_df <- test_df %>% mutate(geometry = geo_col) %>% sf::st_as_sf() ggplot(new_df) + geom_sf() + theme_void()
方案2:对现有test_df中的geo_col先设置CRS
如果无法修改数据准备流程,需要先给geo_col这个sfc对象单独设置CRS,再转成sf对象:
new_df <- test_df %>% mutate(geometry = sf::st_set_crs(geo_col, 4326)) %>% # 先给sfc对象设置CRS sf::st_as_sf() ggplot(new_df) + geom_sf() + theme_void()
验证方法
执行st_crs(new_df$geometry),如果返回完整的EPSG:4326信息,说明sfc对象本身的CRS已正确设置,此时绘图不会报错。
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

