如何从人口普查ZIP Code级Shapefile中移除所有小岛?
解决ZIP Code Shapefile过滤后残留小岛的问题
先修复你的代码小问题
你当前的过滤逻辑里,map(remove_list, as.integer)会返回一个列表对象,而STATE是整数类型,用%in%匹配列表会导致匹配失效——这很可能是你没过滤干净的核心原因之一。
直接把remove_list转换成整数向量就能解决这个问题:
remove_list <- c("02", "15", "72", "66", "78", "60", "69", "64", "68", "70", "74", "81", "84", "86", "87", "89", "71", "76", "95", "79") # 转换为整数向量,而非用map生成列表 remove_vec <- as.integer(remove_list) # 重新过滤并绘图 big_df_filtered <- big_df %>% filter(!STATE %in% remove_vec) tm_shape(big_df_filtered) + tm_polygons('pt_count', palette = "Reds", style = "quantile", n = 10, title = "counts")
检查是否遗漏了领地代码
如果修改后还是有小岛残留,大概率是你的remove_list没覆盖所有需要移除的小众领地代码。你可以先查看过滤后剩余的STATE值,找出漏网的代码:
# 列出所有剩余的STATE代码 unique(big_df_filtered$STATE)
比如,可能遗漏的代码包括90(中途岛)、96(美属萨摩亚)这类极小领地,把它们补充到remove_list里即可。
额外补充:用面积过滤收尾
如果还是有非常零散的小岛(比如跨州的极小ZCTA),可以搭配面积过滤来彻底清理:
# 先转成等面积投影(比如北美阿尔伯斯EPSG:5070),避免WGS84投影的面积计算误差 big_df_proj <- big_df %>% st_transform(5070) %>% mutate(zcta_area = st_area(.)) %>% # 过滤掉目标STATE,且面积小于1平方公里的区域 filter(!STATE %in% remove_vec, zcta_area > units::set_units(1, km^2)) %>% # 转回原投影用于绘图 st_transform(4269) # 绘图 tm_shape(big_df_proj) + tm_polygons('pt_count', palette = "Reds", style = "quantile", n = 10, title = "counts")
内容的提问来源于stack exchange,提问作者ℕʘʘḆḽḘ
相关产品推荐
相关产品推荐

