Рассчитать перекрытие площадей для пар полигонов в матричном формате в R - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь вычислить площадь и процент перекрытия между полигонами для нескольких пар. Например, у меня есть 5 полигонов, и я хочу рассчитать площадь и процент перекрытия для каждой комбинации пар. Есть ли способ, которым я могу запустить функцию, включающую все полигоны (шейп-файлы) и получить матричный вывод, показывающий значения для каждой пары? Я хотел бы получить вывод, как это:

overlap    poly 1     poly 2    poly 3     poly 4 poly 5

poly 1

poly 2

poly 3

poly 4

poly 5

Формула, которую я использую для расчета процента перекрытия для пары полигонов, выглядит следующим образом:

AreaOverlap/(SQRT(AreaPolyA*AreaPolyB))

Спасибо!

1 Ответ

0 голосов
/ 17 января 2019

Без примеров данных, я думаю, что возможное решение может быть:

создать пример данных

library( sf)
#square of 2 x 2
pol = st_polygon(list(rbind(c(0,0), c(2,0), c(2,2), c(0,2), c(0,0))))
#add two more squares of 2 x 2
b = st_sfc(pol, pol + c(.8, .2), pol + c(4, .8))

plot(b)

enter image description here

рассчитать площадь перекрытия

l <- lapply( b, function(x) { 
       lapply(b, function(y) st_intersection( x, y ) %>% st_area() ) 
     })

matrix(unlist(l), ncol = length(b), byrow = TRUE)
#      [,1] [,2] [,3]
# [1,] 4.00 2.16    0
# [2,] 2.16 4.00    0
# [3,] 0.00 0.00    4

рассчитать процент перекрытия

l2 <- lapply( b, function(x) { 
  lapply(b, function(y) st_intersection( x, y ) %>% st_area() * 100 /sqrt( st_area(x) * st_area(y) ) ) 
})

matrix(unlist(l2), ncol = length(b), byrow = TRUE)
#      [,1] [,2] [,3]
# [1,]  100   54    0
# [2,]   54  100    0
# [3,]    0    0  100
...