Я не знаю, есть ли готовая функция, но прямоугольный «пространственный фильтр»
легко построить. Просто определите «углы», создайте bbox из них, конвертируйте
полигон и найти, какие из ваших исходных полигонов содержатся / перекрываются
«область фильтра».
Вот быстрый пример:
library(sf)
polys_sf<-st_read(system.file("shape/nc.shp", package="sf") ) %>%
st_transform(crs="+init=epsg:4326")
plot(st_geometry(polys_sf))
Определить «пространственный фильтр»
xmin <- -80
xmax <- -76
ymin <- 34
ymax <- 36
создать полигон на основе фильтра. (Вы можете использовать «NA» для некоторых значений, поэтому, если вы хотите, например, фильтровать только «слева», вы можете установить xmax в NA)
filt_bbox <- sf::st_bbox(c(xmin = ifelse(is.na(xmin), -180, xmin),
ymin = ifelse(is.na(ymin), -90, ymin),
xmax = ifelse(is.na(xmax), +180, xmax),
ymax = ifelse(is.na(ymax), +90, ymax)),
crs = st_crs(4326)) %>%
sf::st_as_sfc(.)
Теперь «отфильтруйте» исходный набор данных на основе многоугольника bbox: используйте st_within
, если вы хотите сохранить только полисы, полностью содержащиеся в определенной области
find_data <- sf::st_within(polys_sf, filt_bbox)
#> although coordinates are longitude/latitude, st_within assumes that they are planar
filt_data <- polys_sf[which(lengths(find_data) != 0), ]
plot(filt_bbox)
plot(st_geometry(filt_data), add = TRUE, reset = FALSE)
Используйте st_intersects
, если вы хотите сохранить все полисы, которые пересекают определенную область
find_data <- sf::st_intersects(polys_sf, filt_bbox)
#> although coordinates are longitude/latitude, st_intersects assumes that they are planar
filt_data <- polys_sf[which(lengths(find_data) != 0), ]
plot(st_geometry(filt_data))
plot(filt_bbox, add = TRUE)
(Очевидно, это работает, если оба значения polys и «степень фильтрации» имеют значения lat / long, в противном случае
Вы должны позаботиться о перепроектировании, и так далее.)
Создано в 2018-11-15 пакетом Представ (v0.2.1)