使用 terra 或 sf 在 gdb 中切割重叠的多边形

问题描述 投票:0回答:1

我有一个巨大的 gdb,里面有很多多边形,其中许多是重叠的(有时是部分重叠,有时是完全重叠)。多边形代表具有我想保留的不同属性的景观处理(例如处理类型、处理年份)。最终,我希望得到一个没有重叠的栅格或矢量层,并且为每个像素或多边形保留所有相关属性。我想在 R 中处理这些数据,最好使用 terra 或 sf 包(这两个包我都是新手)。

这是一个过于简化的图像来说明如果我使用矢量方法我希望得到的结果。假设我从三个多边形开始:2010 年发生的橙色处理、2010 年发生的黄色处理和 2016 年发生的蓝色处理。 Example illustration: 在本例中,我希望最终得到 9 个不同的多边形,并保留这些示例属性:

1:橙色,2010 年

2:橙色+黄色,2010年

3:蓝色+橙色+黄色,2010 + 2016

4:橙色+黄色,2010年

5:蓝色+橙色,2010 + 2016

6:蓝色+橙色,2010 + 2016

7:蓝色,2016 年

8:黄色,2010 年

9:橙色,2010

我使用的真实数据是来自 USFS 的公开燃料处理数据,可以在此处找到:https://data.fs.usda.gov/geodata/edw/datasets.php?xmlKeyword=facts+common+属性(我正在使用区域 5 数据的子集 - 它们是海量数据集)。

我很难弄清楚如何提出这个问题,所以请让我知道如何澄清这篇文章,以帮助您帮助我解决这个问题 - 谢谢大家!

从上面的两个大数据集中,我裁剪了

到目前为止,我已经研究了 sf 和 terra 交叉函数,但似乎使用这些函数不允许我保留所有重叠多边形的属性。

如果有人可以提出一种解决方案,简单地沿任何相交线切割多边形(因此在上面的示例中,我最终会得到一个属性为橙色的多边形“1”,2010;两个形状相同的多边形“2”-一个)属性为橙色,2010,一个属性为黄色,2010 等),我可以从那里提取 gdb 的属性并将处理属性合并到字符串中,然后将属性与空间数据合并回并仅保留一个版本每个多边形。这是我的首选解决方案,因为它可以让我最大程度地控制维护属性数据。

另一个想法是对我的所有数据进行栅格化,并为每种治疗类型或每年设置一个波段。但我不知道如何执行这个解决方案,并且我无法想象在单个像素上同一年或同一类型的处理发生多种类型的处理的情况下如何在不丢失数据的情况下做到这一点发生在多年内。

在这个问题上感觉非常迷失。非常感谢任何提示或建议!谢谢大家!

r intersection r-sf terra
1个回答
0
投票

terra::union 可以做到这一点。我不知道是否适合您的目的,因为它为每个原始多边形创建一个属性变量。如果你有很多多边形,那可能并不理想。

示例数据

library(terra)
v <- vect(system.file("ex/lux.shp", package="terra"))
# create overlapping polygons
b <- buffer(v, 2000)

解决方案

u <- union(b)

u
# class       : SpatVector 
# geometry    : polygons 
# dimensions  : 47, 13  (geometries, attributes)
# extent      : 5.726209, 6.546187, 49.42983, 50.19956  (xmin, xmax, ymin, ymax)
# coord. ref. : lon/lat WGS 84 (EPSG:4326) 
# names       :  id_1  id_2  id_3  id_4  id_5  id_6  id_7  id_8  id_9 id_10 (and 3 more)
# type        : <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>             
# values      :     1     0     0     0     0     0     0     0     0     0             
#                   0     1     0     0     0     0     0     0     0     0             
#                   1     1     0     0     0     0     0     0     0     0

插图

u$sum <- rowSums(as.data.frame(u))
plot(u, "sum")

ids <- apply(as.data.frame(u), 1, \(i) paste(which(i==1), collapse=", "))
ids
# [1] "1"         "2"         "1, 2"      "3"         "2, 3"      "4"         "1, 4"      "2, 4"      "1, 2, 4"   "5"         "1, 5"      "2, 5"     
#[13] "1, 2, 5"   "3, 5"      "2, 3, 5"   "6"         "2, 6"      "7"         "8"         "6, 8"      "7, 8"      "9"         "3, 9"      "10"       
#[25] "7, 10"     "9, 10"     "11"        "7, 11"     "8, 11"     "7, 8, 11"  "9, 11"     "10, 11"    "7, 10, 11" "9, 10, 11" "12"        "2, 12"    
#[37] "3, 12"     "2, 3, 12"  "6, 12"     "2, 6, 12"  "8, 12"     "6, 8, 12"  "9, 12"     "3, 9, 12"  "11, 12"    "8, 11, 12" "9, 11, 12"
© www.soinside.com 2019 - 2024. All rights reserved.