R绘制新冠空间箱型地图时st_geometry赋值报错求助
报错原因
该报错的本质是st_as_sf()转换时,未识别到数据框中存在合法的sfc类型几何列,导致无法生成sf空间数据框,你的问题出在数据合并和统计的逻辑上:
- 第一次
inner_join后做dplyr::summarise时,仅保留了分组列Sub_District、Date和新生成的统计列,原始的几何列直接被丢弃 - 第二次
left_join按Sub_District关联时,DKI_Jakarta是村级粒度数据,一个街道对应多条村级记录,会出现一对多匹配,导致几何列格式错乱 - 注意你的DKI_Jakarta几何列名拼写为
Gemoetry(拼写错误,应为Geometry),也可能导致列识别异常
解决步骤
- 先预处理空间数据,转换为合法sf格式,聚合得到街道级别的几何和总人口,避免后续一对多匹配
# 修正几何列拼写错误 colnames(DKI_Jakarta)[colnames(DKI_Jakarta) == "Gemoetry"] <- "Geometry" # 转换为sf空间数据框 DKI_Jakarta <- st_as_sf(DKI_Jakarta) # 按街道聚合,得到街道级总人口和合并后的几何 Jakarta_subdistrict <- DKI_Jakarta %>% group_by(Sub_District) %>% summarise( Total_Population = sum(Total_Population, na.rm = TRUE), Geometry = st_union(Geometry) ) %>% ungroup()
- 重新合并疫情数据和空间数据,统计时保留几何列
Jakarta_Covid_Cases <- Covid_DF %>% inner_join(Jakarta_subdistrict, by = "Sub_District") %>% # 将总人口、几何列加入分组,避免summarise时被丢弃 group_by(Sub_District, Date, Total_Population, Geometry) %>% dplyr::summarise( `Covid Cases Per 10k Population` = sum(Cases, na.rm = TRUE) / (Total_Population / 10000) ) %>% ungroup() %>% st_as_sf() # 此时转换sf不会报错
- 验证sf对象合法性
# 执行后返回 sfc_*、sfc 前缀的结果即为正常 class(st_geometry(Jakarta_Covid_Cases))
- 重新调用箱型地图函数即可正常出图
内容的提问来源于stack exchange,提问作者Lostguy97
相关产品推荐
相关产品推荐

