R 多边形之间的重叠百分比
我是R新手,这是我第一次在这里发帖,想让你们知道我还是R语言的新手,希望这能简化你们的答案。我目前正在做我的硕士论文,其中包括很多关于南非不同物种分布的形状文件的工作。我的研究包括4个动物科;1个猎物科(包括29个物种)和3个捕食科(每个科包含更多物种)。对于每一个物种,我都有一个带有多边形分布的形状文件,所以我有很多形状文件。我现在的问题是,我必须计算每个捕食者与每个猎物物种的重叠百分比(100%重叠是指捕食者的分布/多边形在猎物的分布/多边形范围内,因此百分比应相对于猎物物种的多边形计算) 我知道我可能可以分别为每个物种一个接一个地做这件事,但这确实需要我几个星期的时间,我没有时间做这件事。就连我在大学的推广人以前也没有做过类似的事情,他自己也在想办法。他最初给了我这个密码:R 多边形之间的重叠百分比,r,R,我是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