如何在R中按FIPS或州筛选嵌套结构的GeoJSON数据
当前路径完全可行,不需要更换思路,按以下步骤操作即可:
方法1:基于你已生成的索引直接提取
你已经拿到了匹配的要素索引,直接对features列表做子集提取后保留原GeoJSON结构即可:
# 复制原GeoJSON结构 county_data_filtered <- county_data # 仅保留匹配的要素 county_data_filtered$features <- county_data$features[necessary_values]
注意:原GeoJSON中的id字段为字符串类型,建议你在匹配时把自己的fips向量转成字符,避免前导零丢失导致的匹配失败,修改你的循环逻辑如下即可:
fips_char <- as.character(fips) necessary_values = c() for (i in seq_along(county_data$features)) { if(county_data$features[[i]]$id %in% fips_char) { necessary_values <- c(necessary_values, i) } }
方法2:更简洁的向量化筛选(无需手写循环)
用purrr包的keep函数可以一步完成要素筛选,代码更简洁高效:
library(purrr) fips_char <- as.character(fips) county_data_filtered <- county_data # 直接保留id命中的要素 county_data_filtered$features <- keep(county_data$features, ~.x$id %in% fips_char)
如果要按州缩写筛选,对应修改筛选条件即可:
county_data_filtered$features <- keep(county_data$features, ~.x$properties$STUSAB %in% states)
更推荐的处理思路:转sf对象操作
如果后续还要做空间分析、可视化等操作,更建议把GeoJSON转成sf空间对象,筛选逻辑和普通数据框完全一致,学习成本更低:
library(sf) library(dplyr) # 直接读取url为sf对象 county_sf <- st_read("https://raw.githubusercontent.com/plotly/datasets/master/geojson-counties-fips.json") # 按FIPS筛选 county_sf_filtered <- county_sf %>% filter(id %in% as.character(fips)) # 按州缩写筛选 county_sf_filtered <- county_sf %>% filter(STUSAB %in% states)
内容的提问来源于stack exchange,提问作者Max Feinberg
相关产品推荐
相关产品推荐

