6

我有一个从这里获得的州边界 geojson 文件。特别是我正在使用20m 美国州数据

我正在尝试对数据进行子集化,以便我可以使用传单仅映射某些状态。我可以使用以下方法对单个状态进行子集化:

states <- geojsonio::geojson_read("gz_2010_us_040_00_20m.json", what = "sp")
az <- subset(states, NAME == "Arizona")

但是,此方法似乎不适用于选择多个状态:

swStates <- subset(states, NAME == c("Arizona", "Nevada", "New Mexico"))

选择多个状态通常会导致只选择一个或两个状态,或者根本不选择。我可以使用其他方法对这些数据进行子集化吗?

4

3 回答 3

6

你需要使用%in%而不是==

cities <- geojsonio::us_cities
TwoCities <- subset(cities, name %in% c("Seattle WA", "San Francisco CA"))
于 2017-11-06T20:45:12.777 回答
3

也没有脱离公认的答案,但这是另一种方法。

library(geojsonsf)用来将 GeoJSON 直接读入sf对象。从那里您可以按照任何方式对其进行子集化data.frame(并使用对其进行其他空间操作library(sf)

url <- "http://eric.clst.org/assets/wiki/uploads/Stuff/gz_2010_us_040_00_20m.json"

## use library(geojsonsf) to convert into an sf object
sf <- geojsonsf::geojson_sf(url)

library(dplyr)
library(sf)

sf %>%
    filter(NAME %in% c("Arizona", "Nevada", "New Mexico"))


# Simple feature collection with 3 features and 5 fields
# geometry type:  POLYGON
# dimension:      XY
# bbox:           xmin: -120.0057 ymin: 31.3323 xmax: -103.002 ymax: 42.00025
# epsg (SRID):    4326
# proj4string:    +proj=longlat +datum=WGS84 +no_defs
# CENSUSAREA      GEO_ID LSAD       NAME STATE                       geometry
# 1   113594.1 0400000US04         Arizona    04 POLYGON ((-112.5386 37.0006...
# 2   121298.1 0400000US35      New Mexico    35 POLYGON ((-105.998 32.00233...
# 3   109781.2 0400000US32          Nevada    32 POLYGON ((-114.0466 40.1169...
于 2018-04-17T23:01:59.577 回答
2

不要放弃已接受的答案,如果您想对 JSON 感到厌烦,就放弃一个选项。

我在 dev 中有一个 pkg,它试图帮助使用jqr包过滤原始 GeoJSON 本身(因此无需转换为sp对象并使用subset

devtools::install_github("ropenscilabs/geofilter")
library(geofilter)
library(leaflet)

url <- "http://eric.clst.org/wupl/Stuff/gz_2010_us_040_00_20m.json"
curl::curl_download(url, destfile = (f <- tempfile(fileext = ".json")))
ariz <- sifter(readLines(f), NAME == Arizona)

leaflet() %>%
  addTiles() %>%
  addGeoJSON(ariz) %>%
  setView(-112, 34, zoom = 7) 

目前不能同时进行很多匹配(例如,NAME %in% c(Arizona, Nevada, New Mexico)

于 2017-11-06T22:26:58.990 回答