library(sf)library(dplyr)library(ggplot2)library(ggrepel)library(stringr)# a circlep1 <-st_point(c(-2, 0)) |>st_buffer(1, nQuadSegs =90)# an identical circlep2 <- p1# same circle shifted to the right so it is touchingp3 <- p1 +c(2, 0)# shifted circle scaled to half sizep4 <- p3 *matrix(c(0.5, 0, 0, 0.5), 2, 2)# and shifted down so it's touching p3 and overlapping p4 p5 <- p4 +c(0, -0.5)# a donut to the sidep6 <-st_difference(p3, p4) +c(2.1, 0)# and a circle overlapping the donutp7 <- p4 *matrix(c(1.5, 0, 0, 1.5), 2, 2) +c(2, -1)polys <-st_sfc(list(p1, p2, p3, p4, p5, p6, p7)) |>st_sf() |>mutate(ID =as.factor(1:7), dx =c(0, 0, .5, 0, 0, 0, 0), dy =c(-1, 1, 2, 0, 0, 0, 0))
We can tabulate the result of applying all the spatial predicates to these polygons into a table.
The details of how this is done don’t matter greatly, but if you are interested click into the code below. The core of it is based on the various st_* functions such as st_intersects or st_contains. These correspond, more or less to the relations identified in Figure 5.1. The spatial predicates available in the sf package in R correspond to those implemented in spatial databases such as PostGIS.
# License (MIT)## Copyright (c) 2023 David O'Sullivan## Permission is hereby granted, free of charge, to any person# obtaining a copy of this software and associated documentation# files (the "Software"), to deal in the Software without restriction,# including without limitation the rights to use, copy, modify, merge,# publish, distribute, sublicense, and/or sell copies of the Software,# and to permit persons to whom the Software is furnished to do so,# subject to the following conditions:## The above copyright notice and this permission notice shall be included# in all copies or substantial portions of the Software.## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER# DEALINGS IN THE SOFTWARE.