数据嵌套时如何通过 FIPS 或状态过滤 GeoJSON 数据

How to Filter GeoJSON Data by FIPS or State when Data is Nested

我正在尝试过滤美国由 FIPS 或州设置的县级形状数据。可以找到原始数据集here。但是,我使用的是经过 plotly 清理的版本。

我可以使用以下代码将数据读入 R。

url <- 'https://raw.githubusercontent.com/plotly/datasets/master/geojson-counties-fips.json'

county_data <- geojsonio::geojson_read(url)

我有一个 FIPS 列表 fips <- c(20129, 19139, 17167, 19057, 17141),我还可以生成一个 FIPS 起源于 states <- c('IL', 'IA', 'IN') 的州的列表。

通过执行以下操作,我已经能够识别必要边界的索引。

necessary_values = c()
for (i in 1:3221) {
  if(county_data$features[[i]]$id %in% fips) {
    necessary_values <- c(necessary_values, i)
  }
}

但是,我在设置 county_data 时遇到问题,因为 geojson 的结构使得它生成长度为 2 的列表,其中包含属性 typefeaturestype 只是 chrfeatures 是一个长度为 3,221 的列表,其中每个元素都有几何数据以及一个 id 属性,即 FIPS 值。

我已经考虑过提出的解决方案 ,但由于 geojson 的结构,它们无济于事。

我应该使用不同的方法吗?还是我在正确的道路上?

如果您愿意使用包 sftidyverse 风格的代码,这里有一个建议。

此代码将 geojson 读入一个简单的要素集合,然后展示如何过滤州编号“04”(看起来像亚利桑那州)中的所有县并绘制它们。

如果你不想绘制它们,当然,只需删除这些行:)

library(magrittr)
library(dplyr)
library(sf)
library(ggplot2)

url <- 'https://raw.githubusercontent.com/plotly/datasets/master/geojson-counties-fips.json'

county_data <- sf::read_sf(url)

county_data %>%
  filter(STATE == "04") %>%
  ggplot() +
  geom_sf()

如果您想针对特定的县 ID 进行过滤,那么您就走对了。此代码设置 fips 向量,然后过滤原始数据以创建仅包含这些 fips 的新 sf 对象。 (然后再次绘制它们,以备不时之需。)

fips <- c(20129, 19139, 17167, 19057, 17141)

county_data_subset <- county_data %>%
  filter(id %in% fips)

county_data_subset %>%
  ggplot() +
  geom_sf()

如果您正在寻找其他东西,请告诉我。