lapply к unionSpatialPolygons в списке

У меня есть большой список объектов SpatialPolygonsDataFrame, которые я создал с помощью lapply и gdal_polygonizeR (код здесь: https://johnbaumgartner.wordpress.com/2012/07/26/getting-rasters-into-shape-from-r/) в списке объектов RasterLayer. Теперь я хочу объединить границы частей многоугольника, которые соприкасаются внутри каждого SpatialPolygonsDataFrame, используя unionSpatialPolygons (maptools). Я проверил это, вызвав отдельный объект SpatialPolygonsDataFrame, и, похоже, он работает. Но когда я пытаюсь сделать это для списка всех SpatialPolygonsDataFrame, используя lapply, я получаю сообщение об ошибке. См. код ниже (очень жаль, что мой пример не воспроизводим) и, пожалуйста, предоставьте решение, используя lapply или альтернативу. Спасибо

#convert RasterLayers to SpatialPolygonsDataFrame objects
polyl <- lapply(rastl, gdal_polygonizeR)

#test union of polygon parts within individual SpatialPolygonsDataFrame
tmp = unionSpatialPolygons(polyl[[10]], polyl[[10]]$DN) 

polyl[[10]]  #n = 360 features
tmp          #n = 8 features

#run union on all SpatialPolygonsDataFrame in list
polyl_union <- lapply(polyl, unionSpatialPolygons, SpP = 
polyl, IDs = polyl$DN)  

#Error in FUN(X[[i]], ...) : not a SpatialPolygons object

person Dorothy    schedule 18.10.2018    source источник


Ответы (1)


Я не знаю, что вызывает ошибку. Альтернативный путь, который вы можете попробовать, это

library(raster)
x <- bind(poly)
y <- aggregate(x, "DN")

С примерными данными:

set.seed(0)
r <- raster(ncol=5, nrow=5, xmn=0, xmx=1, ymn=0, ymx=1)
values(r) = sample(5, ncell(r), replace=TRUE)
rr <- list()
rr[[1]] <- crop(r, extent(0,0.5,0,0.5))
rr[[2]] <- crop(r, extent(0.5,1,0.5,1))
rr[[3]] <- crop(r, extent(0,0.5,0.5,1))
rr[[4]] <- crop(r, extent(0.5,1,0,0.5))
x <- list(r1, r2, r3, r4)  
y <- lapply(x, rasterToPolygons)


b <- bind(y) 
a <- aggregate(b, 'layer')

plot(r)
plot(a, add=TRUE)
person Robert Hijmans    schedule 19.10.2018
comment
Большое спасибо за ваш ответ. Однако теперь я получаю следующую другую ошибку, когда применяю ваш метод к своим данным: «Ошибка в (функции (классы, fdef, mtable): невозможно найти унаследованный метод для функции« привязать »для подписи« SpatialPolygonsDataFrame , отсутствует Может быть, gdal_polygonizeR (который мне нужно использовать вместо rasterToPolygon для уменьшения общего времени выполнения) создает проблему? - person Dorothy; 19.10.2018
comment
Я предполагаю, что по крайней мере один элемент списка не имеет объекта SpatialPDF; возможно, потому что все клетки были NA?. Это также объясняет ошибку, которую вы получаете с вашим кодом. Запустите lapply(poly1, class) или lapply(poly1, is.null), чтобы найти элементы списка, которые нужно удалить. - person Robert Hijmans; 19.10.2018
comment
Спасибо за предложение, но использование предложенного вами метода показывает, что все элементы являются «SpatialPDF» и «FALSE», так что это не проблема. Любые другие предложения? - person Dorothy; 21.10.2018