картинки лучше, чем слова, поэтому, пожалуйста, посмотрите на часть растровой ячейки, покрытой одним или несколькими полигонами: есть ли более быстрый способ сделать это (в R)?
Что у меня есть
- объект RasterLayer (заполняется случайными значениями здесь только в целях иллюстрации, фактические значения не имеет значения)
- а SpatialPolygons объект с большим и большим количеством полигонов в нем
Вы можете воссоздать пример данных я использовал для изображения с помощью следующего кода:
library(sp)
library(raster)
library(rgeos)
# create example raster
r <- raster(nrows=10, ncol=15, xmn=0, ymn=0)
values(r) <- sample(x=1:1000, size=150)
# create example (Spatial) Polygons
p1 <- Polygon(coords=matrix(c(50, 100, 100, 50, 50, 15, 15, 35, 35, 15), nrow=5, ncol=2), hole=FALSE)
p2 <- Polygon(coords=matrix(c(77, 123, 111, 77, 43, 57, 66, 43), nrow=4, ncol=2), hole=FALSE)
p3 <- Polygon(coords=matrix(c(110, 125, 125, 110, 67, 75, 80, 67), nrow=4, ncol=2), hole=FALSE)
lots.of.polygons <- SpatialPolygons(list(Polygons(list(p1, p2, p3), 1)))
crs(lots.of.polygons) <- crs(r) # copy crs from raster to polygons (please ignore any potential problems related to projections etc. for now)
# plot both
plot(r) #values in this raster for illustration purposes only
plot(lots.of.polygons, add=TRUE)
Для каждой ячейки растра, я хочу знать, сколько из них покрыто одним или несколькими полигонами. Или фактически: область всех полигонов внутри растровой ячейки, без того, что находится за пределами рассматриваемой ячейки. Если есть несколько многоугольников, перекрывающих ячейку, мне нужна их общая область.
Следующий код делает то, что я хочу, но занимает больше, чем на неделю, чтобы работать с реальными наборами данных:
# empty the example raster (don't need the values):
values(r) <- NA
# copy of r that will hold the results
r.results <- r
for (i in 1:ncell(r)){
r.cell <- r # fresh copy of the empty raster
r.cell[i] <- 1 # set the ith cell to 1
p <- rasterToPolygons(r.cell) # create a polygon that represents the i-th raster cell
cropped.polygons <- gIntersection(p, lots.of.polygons) # intersection of i-th raster cell and all SpatialPolygons
if (is.null(cropped.polygons)) {
r.results[i] <- NA # if there's no polygon intersecting this raster cell, just return NA ...
} else{
r.results[i] <- gArea(cropped.polygons) # ... otherwise return the area
}
}
plot(r.results)
plot(lots.of.polygons, add=TRUE)
я могу выжать немного больше скорости, используя sapply
вместо for
-loop , но узкое место, похоже, находится где-то в другом месте. Весь подход выглядит довольно неудобно, и мне интересно, пропустил ли я что-то очевидное. Сначала я подумал, что rasterize()
должен быть в состоянии сделать это легко, но я не могу понять, что положить в аргумент fun=
. Есть идеи?
Имейте в виду, что [Для многоугольников, значения передаются, если многоугольник охватывает центр растровая ячейка. ] (Https://cran.rstudio.com/web/packages/raster/raster.pdf). Вы можете использовать ['foreach'] (http://stackoverflow.com/documentation/r/1677/parallel-processing/5164/parallel-processing-with-foreach-package#t=201611171522367924677) циклы для использования ваших нескольких ядер (если доступно). – loki