我有几个栖息地类型的多边形,根据我选择的多边形,我需要得到一个国家的百分比。问题是许多多边形相交,所以我需要解决交集,这样我就不会把面积加两次,并假设国家的百分比比我应该计算的要高。
library(sf)
library(terra)
hab1 <- sf::read_sf("/vsicurl/https://github.com/Sustainscapes/BiodiversityCounsil/raw/master/ForQuestion/Overdrev.shp") |>
terra::vect()
hab2 <- sf::read_sf("/vsicurl/https://github.com/Sustainscapes/BiodiversityCounsil/raw/master/ForQuestion/Strandeng.shp") |>
terra::vect()
Test1 <- terra::union(hab1, hab2)
这并没有像它应该的那样工作,因为test1中的特征数量是21528,但是每个变量的长度只有3
,如下面的代码所示,并且不允许子集:
length(Test1)
# [1] 21528
length(Test1$Overdrev)
# [1] 3
length(Test1$Strandeng)
# [1] 3
(这个问题的更详细的版本在这里)
我认为这是修复了一段时间,但不是在CRAN版本。你能在开发版上试试吗?您可以使用install.packages('terra', repos='https://rspatial.r-universe.dev')
安装它。这个版本,我得到:
library(terra)
hab1 <- vect("/vsicurl/https://github.com/Sustainscapes/BiodiversityCounsil/raw/master/ForQuestion/Overdrev.shp")
hab2 <- vect("/vsicurl/https://github.com/Sustainscapes/BiodiversityCounsil/raw/master/ForQuestion/Strandeng.shp")
Test1 <- terra::union(hab1, hab2)
length(Test1)
#[1] 3
#data.frame(Test1)
# Overdrev Strandeng
#1 Overdrev Strandeng
#2 Overdrev <NA>
#3 <NA> Strandeng
Test1
# class : SpatVector
# geometry : polygons
# dimensions : 3, 2 (geometries, attributes)
# extent : 445333, 892786.7, 6050590, 6400331 (xmin, xmax, ymin, ymax)
# coord. ref. : ETRS89 / UTM zone 32N (EPSG:25832)
# names : Overdrev Strandeng
# type : <chr> <chr>
# values : Overdrev Strandeng
# Overdrev NA
# NA Strandeng
和重叠区域:
ovp <- Test1[!is.na(Test1$Overdrev) & !is.na(Test1$Strandeng), ]
更一般地说,似乎你正在使用转换为多边形的栅格数据。这是自找惩罚。你不能使用原始的栅格数据吗?