Суммирование значений атрибутов перекрывающихся полигонов в 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