-
Notifications
You must be signed in to change notification settings - Fork 300
Closed
Description
I had a similar problem as in this SO question and I started thinking that maybe sf could use a filtering function, eg. st_filter().
Since the default error message for when one or both objects are not sf objects is that the crs's don't match, I've also added a more informative error message.
The default method is st_intersects but one can specify another by using eg, st_filter(x, y, st_crosses).
What do you think?
library(sf)
library(tidyverse)
nc <- st_read(system.file("shape/nc.shp", package="sf"))
st_filter <- function(.x, .y, f = st_intersects) {
geoms_attr <- sapply(list(.x, .y), attr, "sf_column")
null_geoms <- sapply(geoms_attr, is.null)
if(any(null_geoms)) {
stop("`st_geometry` should not be `NULL`")
}
.x[f(.x, .y, sparse = FALSE), ]
}
nc %>% st_filter(mtcars)
#> Error in st_filter(., mtcars): `st_geometry` should not be `NULL`
my_line <- tibble(name = "my line", x = c(-81, -79), y = c(34.5, 37)) %>%
st_as_sf(coords = c("x", "y")) %>%
summarize() %>%
st_cast("LINESTRING") %>%
st_set_crs(4267)
ggplot(nc) +
geom_sf() +
geom_sf(data = my_line)nc %>%
st_filter(my_line) %>%
ggplot() +
geom_sf()
#> although coordinates are longitude/latitude, st_intersects assumes that they are planarCreated on 2019-09-12 by the reprex package (v0.3.0)
Robinlovelace, jbixon13, sheffe and LDalby
Metadata
Metadata
Assignees
Labels
No labels

