Суммирование значений атрибутов перекрывающихся полигонов в SpatialPolygonsDataFrame с R

У меня есть один файл формы, содержащий множество пространственных полигонов, которые частично перекрываются. Эти полигоны относятся к применению фунгицида на поле, и каждый полигон имеет ассоциированную норму применения в качестве атрибута.

То, что я хочу получить, это исправить карту AsApplied, принимая во внимание перекрывающиеся области, означающие, что скорость должна суммироваться и объединяться, если два (или более) многоугольника перекрываются.

В следующем примере кода создается SpatialPolygonsDataFrame, упрощающий проблему:

library(raster)
library(sp)

p<-SpatialPolygons(list(Polygons(list(Polygon(cbind(c(1,4,4,3,3,1,1),c(1,1,3,3,4,4,1)),hole = F)), "1_ "),
                    Polygons(list(Polygon(cbind(c(3,4,4,3,3),c(3,3,4,4,3)),hole = F)), "1_2"),
                    Polygons(list(Polygon(cbind(c(3,4,4,3,3),c(3,3,4,4,3)),hole = F)), "2_1"),
                    Polygons(list(Polygon(cbind(c(4,4,5,5,3,3,4),c(4,3,3,5,5,4,4)),hole = F)),"2_")))

pid <- sapply(slot(p, "polygons"), function(x) slot(x, "ID"))
p.df <- data.frame( ID=1:length(p), row.names = pid) 
p <- SpatialPolygonsDataFrame(p, p.df)
p$Rate <- c(100, 100, 100, 100)
crs(p) <- "+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0"
plot(p)

Вы можете увидеть два квадрата из четырех многоугольников, которые частично перекрываются. Каждый полигон имеет ассоциированную скорость 100. Я хотел бы иметь три полигона. Два не перекрывающихся должны иметь скорость 100, а два перекрывающихся должны быть объединены в один многоугольник, имеющий значение 200.

Я уже попробовал объединить или пересечь функции растрового пакета, но смог получить только информацию о перекрывающихся многоугольниках, но не суммирование и слияние. Кроме того, я явно ищу решение в R.

Любая помощь в решении этой проблемы высоко ценится.

Обновление: решение, предоставленное RobertH, представленное ниже, работает для моего простого примера. Большое спасибо уже!

Однако при переходе на мой реальный сценарий использования я получаю следующие ошибки и предупреждения:

Error in if (is.numeric(i) && i < 0) { : 
  missing value where TRUE/FALSE needed
In addition: Warning messages:
1: In RGEOSUnaryPredFunc(spgeom, byid, "rgeos_isvalid") :
  Too few points in geometry component at or near point 8.3634020800000002 50.056772690000003
...

Пример файла формы загружен здесь: (устарело)

Есть идеи, как бороться с этой проблемой?

Обновление № 2 Использование текущей версии разработки 2.5-10 действительно исправляет предупреждения в RGEOSUnaryPredFunc. Однако, если многоугольники только очень мало перекрывают друг друга, я все равно получаю ошибку:

Error in if (is.numeric(i) && i < 0) { : 
  missing value where TRUE/FALSE needed

Пример файла формы, для которого это происходит, загружен здесь: http://www.share-online.biz/dl/O4ZIVH8OBW. Точнее, поле выглядит следующим образом:

Изображение полигона, пример 2

Два полигона, отмеченные красным, вызывают ошибку, и если один из двух удален, объединение работает нормально.

Большое спасибо уже за вашу большую помощь!

1 ответ

Решение

Я думаю, что это действительно union вы после. Он объединяет и идентифицирует перекрывающиеся полигоны. С этим вы можете суммировать ставки.

# example data
library(raster)
p1 <- cbind(c(1,4,4,1),c(1,1,4,4))
p2 <- cbind(c(3,5,5,3),c(3,3,5,5))
p <- spPolygons(p1, p2, crs="+proj=longlat +datum=WGS84", 
                        attr=data.frame(ID=1:2, Rate =c(50,100)))

#data.frame(p)
#  ID Rate
#1  1   50
#2  2  100

Союз первого использования

x <- union(p)
ud <- data.frame(x)
ud$count <- NULL

Суммируйте ставки за внесение полигонов

udRate <- t( t(ud) * p$Rate )
x$Rate <- rowSums(udRate)
data.frame(x)

#  ID.1 ID.2 count Rate
#1    1    0     1   50
#2    0    1     1  100
#3    1    1     2  150
Другие вопросы по тегам