spatial join, spatial filter
st_join(x, y, join, ...)# S3 method for sf
st_join(
x,
y,
join = st_intersects,
...,
suffix = c(".x", ".y"),
left = TRUE,
largest = FALSE
)
st_filter(x, y, ...)
# S3 method for sf
st_filter(x, y, ..., .predicate = st_intersects)
object of class sf
object of class sf
geometry predicate function with the same profile as st_intersects; see details
for st_join
: arguments passed on to the join
function or to st_intersection
when largest
is TRUE
; for st_filter
arguments passed on to the .predicate
function, e.g. prepared
, or a pattern for st_relate
length 2 character vector; see merge
logical; if TRUE
return the left join, otherwise an inner join; see details.
see also left_join
logical; if TRUE
, return x
features augmented with the fields of y
that have the largest overlap with each of the features of x
; see https://github.com/r-spatial/sf/issues/578
geometry predicate function with the same profile as st_intersects; see details
an object of class sf
, joined based on geometry
alternative values for argument join
are:
any user-defined function of the same profile as the above
A left join returns all records of the x
object with y
fields for non-matched records filled with NA
values; an inner join returns only records that spatially match.
To replicate the results of st_within(x, y)
you will need to use st_join(x, y, join = "st_within", left = FALSE)
.
# NOT RUN { a = st_sf(a = 1:3, geom = st_sfc(st_point(c(1,1)), st_point(c(2,2)), st_point(c(3,3)))) b = st_sf(a = 11:14, geom = st_sfc(st_point(c(10,10)), st_point(c(2,2)), st_point(c(2,2)), st_point(c(3,3)))) st_join(a, b) st_join(a, b, left = FALSE) # two ways to aggregate y's attribute values outcome over x's geometries: st_join(a, b) %>% aggregate(list(.$a.x), mean) library(dplyr) st_join(a, b) %>% group_by(a.x) %>% summarise(mean(a.y)) # example of largest = TRUE: nc <- st_transform(st_read(system.file("shape/nc.shp", package="sf")), 2264) gr = st_sf( label = apply(expand.grid(1:10, LETTERS[10:1])[,2:1], 1, paste0, collapse = " "), geom = st_make_grid(st_as_sfc(st_bbox(nc)))) gr$col = sf.colors(10, categorical = TRUE, alpha = .3) # cut, to check, NA's work out: gr = gr[-(1:30),] nc_j <- st_join(nc, gr, largest = TRUE) # the two datasets: opar = par(mfrow = c(2,1), mar = rep(0,4)) plot(st_geometry(nc_j)) plot(st_geometry(gr), add = TRUE, col = gr$col) text(st_coordinates(st_centroid(gr)), labels = gr$label) # the joined dataset: plot(st_geometry(nc_j), border = 'black', col = nc_j$col) text(st_coordinates(st_centroid(nc_j)), labels = nc_j$label, cex = .8) plot(st_geometry(gr), border = 'green', add = TRUE) par(opar) # }
Run the code above in your browser using DataCamp Workspace