Sie können hierfür gdalUtils::gdalwarp
verwenden. Für mich ist es weniger effizient als @ JosephWoods fasterAgg.Fun
für Raster mit 1.000.000 Zellen, aber für Josephs größeres Beispiel ist es viel schneller. Voraussetzung dafür ist, dass das Raster auf der Festplatte vorhanden ist. Schreiben Sie die Zeit in den unteren Bereich, wenn sich Ihr Raster im Speicher befindet.
Unten habe ich die Änderung von fasterAgg.Fun
verwendet, die den häufigsten Wert zurückgibt, anstatt seinen Index im Block.
library(raster)
x <- matrix(rpois(10^8, 2), 10000)
a <- raster(x)
fasterAgg.Fun <- function(x,...) {
myRle.Alt <- function (x1) {
n1 <- length(x1)
y1 <- x1[-1L] != x1[-n1]
i <- c(which(y1), n1)
x1[i][which.max(diff(c(0L, i)))]
}
if (sum(x)==0) {
return(NA)
} else {
myRle.Alt(sort(x, method="quick"))
}
}
system.time(a2 <- aggregate(a, fact=10, fun=fasterAgg.Fun))
## user system elapsed
## 67.42 8.82 76.38
library(gdalUtils)
writeRaster(a, f <- tempfile(fileext='.tif'), datatype='INT1U')
system.time(a3 <- gdalwarp(f, f2 <- tempfile(fileext='.tif'), r='mode',
multi=TRUE, tr=res(a)*10, output_Raster=TRUE))
## user system elapsed
## 0.00 0.00 2.93
Man beachte, dass es ein leichter Unterschied Bindungen in der Definition des Modus, wenn es: gdalwarp
den höchsten Wert auswählt, während die zu aggregate
oben geleitet Funktionen (über which.max
‚Verhalten) Wählen Sie die niedrigste (zB , siehe which.max(table(c(1, 1, 2, 2, 3, 4)))
).
Auch das Speichern der Rasterdaten als Ganzzahl ist wichtig (falls zutreffend). Wenn die Daten als Float gespeichert sind (z. B. writeRaster
), dauert die obige Operation gdalwarp
~ 14 Sekunden auf meinem System. Verfügbare Typen finden Sie unter ?dataType
.
Bitte beachten Sie, dass 'which.max (table (x))' 'den Index des Wertes mit maximaler Wiederholung zurückgibt, nicht den Wert. Die meisten likey in Ihrem Fall Indizes werden mit Werten übereinstimmen, aber um sicher zu haben, den Wert, den Sie verwenden sollten as.numeric (Namen (which.max (Tabelle (x)))) ... – digEmAll
Was die Leistung betrifft ... Nun, ich denke, Sie sollten auf einige Rcpp Stück Code zurückgreifen, um etwas zu gewinnen ... – digEmAll