Skip to content

Add subsetting function that returns objects whose centroids are within the subsetting object 'y' #511

@Robinlovelace

Description

@Robinlovelace

Reproducible example below, developed with @eugenividal. I've needed this many times, perhaps a dozen times per year, would be good to have a function in a package that does it.

Return features the centroids of which are inside another object

sf::st_within
#> function (x, y, sparse = TRUE, prepared = TRUE, ...) 
#> st_geos_binop("within", x, y, sparse = sparse, prepared = prepared, 
#>     ...)
#> <bytecode: 0x5556ef75b298>
#> <environment: namespace:sf>
polygons = spData::lnd
polygons_central = polygons[polygons$NAME == "City of London", ]
study_region = polygons[polygons_central, ]
study_region = sf::st_union(study_region)
subset_touching = polygons[study_region, ]
plot(polygons$geometry)
plot(subset_touching, col = "grey", add = TRUE)
#> Warning in plot.sf(subset_touching, col = "grey", add = TRUE): ignoring all but
#> the first attribute
plot(study_region, col = "red", add = TRUE)

# Function to return only polygons whose centroids are inside
x = polygons
y = study_region
filter_polygon_centroids = function(x, y) {
  x_centroids = sf::st_centroid(x)
  x_in_y = sf::st_intersects(x_centroids, y)
  x_in_y_logical = lengths(x_in_y) > 0
  x[x_in_y_logical, ]
}

subset_test = filter_polygon_centroids(x = polygons, y = study_region)
#> Warning in st_centroid.sf(x): st_centroid assumes attributes are constant over
#> geometries of x
plot(subset_test, col = "green", add = TRUE)
#> Warning in plot.sf(subset_test, col = "green", add = TRUE): ignoring all but the
#> first attribute

# Test output of st_intersects..

Created on 2022-12-15 with reprex v2.0.2

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions