使用 R 对 geojson 数据进行子集化
Subsetting geojson data with R
我有一个州边界的 geojson 文件that I obtained from here. In particular I'm using the 20m US States Data
我正在尝试对数据进行子集化,以便我可以使用 leaflet 仅映射某些州。我可以使用以下方法对单个状态进行子集化:
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"))
选择多个州通常会导致只选择一个或两个州,或者根本 none。我可以使用其他方法对这些数据进行子集化吗?
您需要使用 %in%
而不是 ==
cities <- geojsonio::us_cities
TwoCities <- subset(cities, name %in% c("Seattle WA", "San Francisco CA"))
不要放弃已接受的答案,如果您想对 JSON 感到厌烦,只需抛出一个选项。
我在开发中有一个 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)
)
也没有放弃已接受的答案,但这是另一种方法。
我正在使用 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...
我有一个州边界的 geojson 文件that I obtained from here. In particular I'm using the 20m US States Data
我正在尝试对数据进行子集化,以便我可以使用 leaflet 仅映射某些州。我可以使用以下方法对单个状态进行子集化:
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"))
选择多个州通常会导致只选择一个或两个州,或者根本 none。我可以使用其他方法对这些数据进行子集化吗?
您需要使用 %in%
而不是 ==
cities <- geojsonio::us_cities
TwoCities <- subset(cities, name %in% c("Seattle WA", "San Francisco CA"))
不要放弃已接受的答案,如果您想对 JSON 感到厌烦,只需抛出一个选项。
我在开发中有一个 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)
)
也没有放弃已接受的答案,但这是另一种方法。
我正在使用 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...