假设t
是:
t <- structure(list(structure(list(structure(c(-89.990791, -89.990772,
-89.990901, -89.99092, -89.990791, 30.727025, 30.727083, 30.727114,
30.727057, 30.727025), .Dim = c(5L, 2L))), class = c("XY", "POLYGON",
"sfg")), structure(list(structure(c(-89.991691, -89.991755, -89.991755,
-89.991691, -89.991691, 30.716004, 30.716004, 30.715916, 30.715916,
30.716004), .Dim = c(5L, 2L))), class = c("XY", "POLYGON", "sfg"
))), class = c("sfc_POLYGON", "sfc"), precision = 0, bbox = structure(c(xmin = -89.991755,
ymin = 30.715916, xmax = -89.990772, ymax = 30.727114), class = "bbox"), crs = structure(list(
epsg = 4326L, proj4string = "+proj=longlat +datum=WGS84 +no_defs"), class = "crs"), n_empty = 0L)
> t
Geometry set for 2 features
geometry type: POLYGON
dimension: XY
bbox: xmin: -89.99176 ymin: 30.71592 xmax: -89.99077 ymax: 30.72711
epsg (SRID): 4326
proj4string: +proj=longlat +datum=WGS84 +no_defs
POLYGON ((-89.99079 30.72703, -89.99077 30.7270...
POLYGON ((-89.99169 30.716, -89.99175 30.716, -...
如何按长/纬线边界过滤多边形?假设我要过滤掉lat> 30.72的所有多边形(因此仅保留第二个多边形)。我可以使用任何特定的功能来过滤多边形吗?
答案 0 :(得分:1)
我不知道是否有现成的功能,而是一个矩形的“空间过滤器” 易于构建。只需定义“角”,从中创建一个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)
(很明显,如果您的多边形和“过滤范围”均为经/纬度,则此方法有效,否则 您必须注意重新投影等)。 由reprex package(v0.2.1)于2018-11-15创建
答案 1 :(得分:0)
您可以使用简单的功能轻松完成此操作:
filter_sf <- function(.data, xmin = NULL, xmax = NULL, ymin = NULL, ymax = NULL) {
bb <- sf::st_bbox(.data)
if (!is.null(xmin)) bb["xmin"] <- xmin
if (!is.null(xmax)) bb["xmax"] <- xmax
if (!is.null(ymin)) bb["ymin"] <- ymin
if (!is.null(ymax)) bb["ymax"] <- ymax
sf::st_filter(.data, sf::st_as_sfc(bb), .predicate = sf::st_within)
}
所以现在您可以这样做:
t %>%
filter_sf(ymin > 30.72)
此方法适用于POLYGON
和MULTIPOLYGON
几何。