在 sf - R 中保持不相交多边形的交集

Intersection keeping non-intersecting polygons in sf - R

我希望与 2 个空间层相交,同时保留所有不相交的特征。

我的第一层是澳大利亚新南威尔士州的SA2,看起来像

enter image description here

我的第二层是区域考拉重要区域 (ARKS):

enter image description here

当我将它们相交时,我得到了我想要的结果的一部分,即用 ARKS 细分 SA2。

enter image description here

问题是我还想拥有其余不相交的 SA2 多边形。期望的结果将是 SA2 的地图,其中相交的将根据它们与 ARKS 层相交的位置进行细分,不相交的将包含 NA。类似于下一张图片,但在单个数据集中而不是两个: enter image description here

我 post 我的代码如下:

library(sf)
SA2 <- st_read('C:/Users/Maxi/Desktop/NSW Planning/Koala/Data/SA2_2021_GDA94/SA2_2021_AUST_GDA94.shp')
ARKS <- st_read('C:/Users/Maxi/Desktop/ARKS_data/ARKS_renamedv6_PriorityPopulations_GDA94geog.shp')
ARKS <- st_transform(ARKS, 3577)
SA2 <- st_transform(SA2, 3577)
SA2 <- SA2[SA2$STE_CODE21=='1',]

intersection <- st_intersection(SA2, ARKS)

数据获取自:

SA2:https://www.abs.gov.au/statistics/standards/australian-statistical-geography-standard-asgs-edition-3/jul2021-jun2026/access-and-downloads/digital-boundary-files#downloads-for-gda94-digital-boundary-files

方舟:https://datasets.seed.nsw.gov.au/dataset/areas-of-regional-koala-significance-arks

希望这些信息足够了!

请考虑这种方法:一旦你有了 intersection,你就可以删除与 st_difference 相交的部分。这将有效地将相交的 SA2 基于 ARKS 划分为多个区域,而其余部分保持原样。之后,您可以使用 dplyr::bind_rows 重新加入数据集,将 ARKS 层、SA2 相交分割和 SA2 non-intersected 保持原样:

library(sf)
library(ggplot2)
library(dplyr)

SA2 <- st_read("./SA2_2021_AUST_SHP_GDA94/SA2_2021_AUST_GDA94.shp")
ARKS <-
  st_read(
    "./Biodiversity_KoalaPrioritisationProjectNSW_ARKS/KoalaPrioritisationProjectNSW_ARKS.shp"
  )
ARKS <- st_transform(ARKS, 3577)
SA2 <- st_transform(SA2, 3577)
SA2 <- SA2[SA2$STE_CODE21 == "1", ]



intersection <- st_intersection(SA2, ARKS)

# Control var, you can remove this
intersection$koala <- "Yes"

# Difference
SA2_diff <-
  st_difference(SA2, st_union(st_geometry(intersection)))

# Check visually, we should see the gaps
ggplot(SA2_diff) +
  geom_sf(fill = "green")


# Join all back
SA2_end <- dplyr::bind_rows(
  SA2_diff,
  intersection
)


ggplot(SA2_end) +
  geom_sf(aes(fill = koala))