R 多边形之间的重叠百分比

R 多边形之间的重叠百分比,r,R,我是R新手,这是我第一次在这里发帖,想让你们知道我还是R语言的新手,希望这能简化你们的答案。我目前正在做我的硕士论文,其中包括很多关于南非不同物种分布的形状文件的工作。我的研究包括4个动物科;1个猎物科(包括29个物种)和3个捕食科(每个科包含更多物种)。对于每一个物种,我都有一个带有多边形分布的形状文件,所以我有很多形状文件。我现在的问题是,我必须计算每个捕食者与每个猎物物种的重叠百分比(100%重叠是指捕食者的分布/多边形在猎物的分布/多边形范围内,因此百分比应相对于猎物物种的多边形计算)

我是R新手,这是我第一次在这里发帖,想让你们知道我还是R语言的新手,希望这能简化你们的答案。我目前正在做我的硕士论文,其中包括很多关于南非不同物种分布的形状文件的工作。我的研究包括4个动物科;1个猎物科(包括29个物种)和3个捕食科(每个科包含更多物种)。对于每一个物种,我都有一个带有多边形分布的形状文件,所以我有很多形状文件。我现在的问题是,我必须计算每个捕食者与每个猎物物种的重叠百分比(100%重叠是指捕食者的分布/多边形在猎物的分布/多边形范围内,因此百分比应相对于猎物物种的多边形计算)

我知道我可能可以分别为每个物种一个接一个地做这件事,但这确实需要我几个星期的时间,我没有时间做这件事。就连我在大学的推广人以前也没有做过类似的事情,他自己也在想办法。他最初给了我这个密码:

my_rangemaps <- list.files(path = "imagine_rangemaps", pattern = ".shp", full.names = TRUE) 
my_rangemaps 
rangemap_matrix <- pairwiseRangemaps(my_rangemaps, projection = 3035, 
             Ncpu = 1, nchunks = 1, filename = "rangemap_matrix.csv") 

my_rangemaps为了好玩,这里有一个例子。这里或gis.stackexchange.com上的一些人在petto中可能有更好的方法:

library(raster)
library(sp)
## example data:
p1 <- structure(c(0, 0, 0.4, 0.4, 0, 0.6, 0.6, 0), .Dim = c(4L, 2L), .Dimnames = list(NULL, c("x", "y")))
p2 <- structure(c(0.2, 0.2, 0.6, 0.6, 0, 0.4, 0.4, 0), .Dim = c(4L, 2L), .Dimnames = list(NULL, c("x", "y")))
p3 <- structure(c(0, 0, 0.8, 0.8, 0, 0.8, 0.8, 0), .Dim = c(4L, 2L), .Dimnames = list(NULL, c("x", "y")))
poly <- SpatialPolygons(list(Polygons(list(Polygon(p1)), "a"),Polygons(list(Polygon(p2)), "b"),Polygons(list(Polygon(p3)), "c")),1L:3L)
plot(poly)
库(光栅)
图书馆(sp)
##示例数据:
p1
## areas for the original shapes:
areas_poly <- vector(length = length(poly)) 
for (x in seq_along(poly)) areas_poly[x]<-area(poly[x])

## areas for the overlapping regions:
idx <- combn(seq_along(poly),2)
areas_intersect <- sapply(1:ncol(idx), function(x) {
  area(intersect(poly[idx[1,x]], poly[idx[2,x]])) 
})

## get overlaps in percentages:
overlap_perc <- 
  round(do.call(cbind, lapply(seq_len(ncol(idx)), function(x)  
  rbind(
    areas_intersect[x] / areas_poly[idx[1,x]] * 100, 
    areas_intersect[x] / areas_poly[idx[2,x]] * 100
  )
)), 2)

## into matrix form:
m <- matrix(100, ncol=length(poly), nrow=length(poly))
m[rbind(t(idx),t(idx)[,2:1])] <- as.vector(t(overlap_perc))
m
#       [,1]   [,2] [,3]
# [1,] 100.0  33.33  100
# [2,]  50.0 100.00  100
# [3,]  37.5  25.00  100