Ich versuche ein Raster zu projizieren. In R gibt es dazu die projectRaster()
Funktion (unter einem vollständig reproduzierbaren Beispiel):
# example Raster
require(raster)
r <- raster(xmn=-110, xmx=-90, ymn=40, ymx=60, ncols=40, nrows=40)
r <- setValues(r, 1:ncell(r))
projection(r)
# project to
newproj <- "+init=epsg:4714"
# using raster package to reproject
pr1 <- projectRaster(r, crs = CRS(newproj), method = 'bilinear')
Welches funktioniert gut. Es ist jedoch ziemlich langsam.
Um die Geschwindigkeit zu erhöhen, verwende ich gdalwarp
stattdessen (mit einer SSD sind die Kosten für das Lesen und Schreiben von / auf Festplatte / R nicht sehr hoch).
Ich kann jedoch die Ergebnisse der projectRaster()
Verwendung nicht reproduzieren gdalwarp
:
# using gdalwarp to reproject
tf <- tempfile(fileext = '.tif')
tf2 <- tempfile(fileext = '.tif')
writeRaster(r, tf)
system(command = paste(paste0("gdalwarp -t_srs \'", newproj, "\' -r bilinear -overwrite"),
tf,
tf2))
pr2 <- raster(tf2)
Es scheint zu funktionieren, aber die Ergebnisse sind unterschiedlich:
# Info
system(command = paste("gdalinfo",
tf))
system(command = paste("gdalinfo",
tf2))
# plots
plot(r)
plot(pr1)
plot(pr2)
#extents
extent(r)
extent(pr1)
extent(pr2)
# PROJ4
proj4string(r)
proj4string(pr1)
proj4string(pr2)
# extract value
take <- SpatialPoints(matrix(c(-100, 50), byrow = T, ncol = 2), proj4string = CRS(newproj))
plot(take, add = TRUE)
extract(pr1, take)
extract(pr2, take)
Was vermisse ich / mache ich falsch?
Gibt es andere (schnellere) Alternativen zu projectRaster()
?
-order
Flags (die "Reihenfolge des zum Verziehen verwendeten Polynoms")gdalwarp
auch ohne Verwendung von GCPs genauere Ergebnisse liefert.Antworten:
Schöne und reproduzierbare Frage. Persönlich würde ich erwarten, dass der Grund für den Unterschied in den Implementierungen der bilinearen Reprojektion liegt. Sie können natürlich den Quellcode für die beiden Ansätze untersuchen, aber ich würde erwarten, dass dies ein großer Overkill ist.
Es scheint, dass die R-Implementierung größere "Fehler" / "Änderungen" als die unformatierte GDAL-Version einführt (zumindest in meinen Versionen und Tests - projectRaster führt Änderungen um + -0,01 ein, während GDAL Werte um + -0,002 liefert).
Wenn Sie beide Ansätze mit einer Neuprojektion des nächsten Nachbarn vergleichen, stimmen sie wie erwartet überein.
quelle