使用 terra::union 解决 terra 中重叠向量的问题
Problem solving overlapping vectors in terra using terra::union
我有几个栖息地类型的多边形,根据这些多边形,我 select 我需要获得一个国家/地区的百分比。问题是很多多边形相交,所以我需要解决交点,这样我就不会两次添加面积并假设国家的百分比高于我应该计算的百分比。
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
(此问题的更详细版本可用 here)
我认为这在不久前已修复,但尚未在 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), ]
更一般地说,您似乎正在使用已转换为多边形的栅格数据。那就是要求惩罚。不能用原始栅格数据吗?
我有几个栖息地类型的多边形,根据这些多边形,我 select 我需要获得一个国家/地区的百分比。问题是很多多边形相交,所以我需要解决交点,这样我就不会两次添加面积并假设国家的百分比高于我应该计算的百分比。
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
(此问题的更详细版本可用 here)
我认为这在不久前已修复,但尚未在 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), ]
更一般地说,您似乎正在使用已转换为多边形的栅格数据。那就是要求惩罚。不能用原始栅格数据吗?