为何Shiny应用中一个地图可加标记另一个无法显示?
核心排查方向及操作
确认sf类是否保留
dplyr::left_join有时会把sf对象转成普通data.frame,直接丢失空间属性。执行class(bc_fed_nova)看输出是否包含sf;再用st_geometry(bc_fed_nova)检查几何列是否存在。如果已转成data.frame,用st_as_sf(bc_fed_nova, coords = c("X", "Y"), crs = st_crs(new_bc_fed_C))强制转回sf类,注意指定正确的坐标系。检查合并键的类型匹配
用于关联的键列(比如选区代码)如果在原sf对象和普查数据中类型不一致(一个是字符、一个是数值),会导致匹配失败,出现大量无效行。执行str(bc_fed_nova_raw$键列)和str(census_data$键列)对比类型,用as.character()或as.numeric()统一后再执行join。排查质心坐标的缺失值
合并后部分行的X/Y列可能变成NA,leaflet无法渲染空坐标的标记。执行sum(is.na(bc_fed_nova$X))和sum(is.na(bc_fed_nova$Y))统计缺失数量。如果有缺失,检查join后匹配失败的行(比如filter(bc_fed_nova, is.na(普查数据列))),或者确认原sf对象计算质心时是否有无效多边形(比如st_is_empty(bc_fed_nova_raw))。验证坐标系一致性
leaflet要求数据使用WGS84(EPSG:4326)坐标系,join操作可能意外修改坐标系。执行st_crs(bc_fed_nova)查看当前坐标系,若不是4326,用st_transform(bc_fed_nova, crs = 4326)转换。
快速修复示例
# 确保join后保留sf属性 bc_fed_nova <- bc_fed_nova_raw %>% left_join(census_data, by = "选区ID") %>% st_as_sf() # 强制维持sf类 # 统一键列类型 bc_fed_nova_raw$选区ID <- as.character(bc_fed_nova_raw$选区ID) census_data$选区ID <- as.character(census_data$选区ID) # 转换到leaflet兼容的坐标系 bc_fed_nova <- st_transform(bc_fed_nova, crs = 4326) # 移除坐标缺失的无效行 bc_fed_nova <- bc_fed_nova %>% filter(!is.na(X) & !is.na(Y))
内容的提问来源于stack exchange,提问作者Abed

