# small geometry constructors -------------------------------------------------
rect <- function(xmin, ymin, xmax, ymax) {
sf::st_polygon(list(rbind(
c(xmin, ymin), c(xmin, ymax), c(xmax, ymax), c(xmax, ymin), c(xmin, ymin)
)))
}
ring <- function(xmin, ymin, xmax, ymax) {
rbind(c(xmin, ymin), c(xmin, ymax), c(xmax, ymax), c(xmax, ymin), c(xmin, ymin))
}
# ADM2 districts, each with a deliberate flaw -------------------------------
# D1: a real interior hole (large) PLUS a hairline sliver hole (tiny)
d1 <- sf::st_polygon(list(
ring(0, 0, 1, 1), # outer
ring(0.3, 0.3, 0.7, 0.7), # real hole -> kept
ring(0.9, 0.9, 0.9005, 0.9005) # sliver hole -> removed
))
# D2: a self-intersecting "bowtie" -> invalid, repaired by st_make_valid()
d2 <- sf::st_polygon(list(rbind(
c(2, 0), c(3, 1), c(3, 0), c(2, 1), c(2, 0)
)))
# D3: a multipolygon = one real part + one tiny detached sliver part
d3 <- sf::st_multipolygon(list(
list(ring(4, 0, 5, 1)), # real part -> kept
list(ring(6, 0, 6.0005, 6.0005)) # sliver part -> removed
))
# D4 and its exact duplicate (same name + geometry) -> flagged
d4 <- rect(0, 2, 1, 3)
shp_adm2 <- sf::st_sf(
adm0_name = "ALPHA",
adm0_guid = "g-alpha",
adm1_name = c("NORTH", "NORTH", "SOUTH", "SOUTH", "SOUTH"),
adm1_guid = c("g-an", "g-an", "g-as", "g-as", "g-as"),
adm2_name = c("D1", "D2", "D3", "D4", "D4"),
guid = c("g-d1", "g-d2", "g-d3", "g-d4", "g-d4"),
startdate = "2015-01-01",
enddate = c("9999-12-31", "9999-12-31", "2020-12-31", "9999-12-31", "9999-12-31"),
geometry = sf::st_sfc(d1, d2, d3, d4, d4, crs = 4326)
)
# ADM1 provinces and ADM0 country (dissolved extents, no flaws) ---------------
shp_adm1 <- sf::st_sf(
adm0_name = "ALPHA", adm0_guid = "g-alpha",
adm1_name = c("NORTH", "SOUTH"), guid = c("g-an", "g-as"),
startdate = "2015-01-01", enddate = "9999-12-31",
geometry = sf::st_sfc(rect(0, 0, 1, 1), rect(2, 0, 6, 3), crs = 4326)
)
shp_adm0 <- sf::st_sf(
adm0_name = "ALPHA", guid = "g-alpha",
startdate = "2015-01-01", enddate = "9999-12-31",
geometry = sf::st_sfc(rect(0, 0, 6, 3), crs = 4326)
)
# write the three layers into one folder --------------------------------------
src_dir <- file.path(tempdir(), "boundaries")
dir.create(src_dir, showWarnings = FALSE)
sf::st_write(shp_adm0, file.path(src_dir, "world_adm0.gpkg"), quiet = TRUE, delete_dsn = TRUE)
sf::st_write(shp_adm1, file.path(src_dir, "world_adm1.gpkg"), quiet = TRUE, delete_dsn = TRUE)
sf::st_write(shp_adm2, file.path(src_dir, "world_adm2.gpkg"), quiet = TRUE, delete_dsn = TRUE)