Differenza tra gdalwarp e projectRaster


9

Sto cercando di proiettare un raster. In R c'è la projectRaster()funzione per fare ciò (sotto un esempio completamente riproducibile):

# 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')

Che funziona benissimo. Tuttavia è abbastanza lento.

Al fine di aumentare la velocità, ho pensato di usarlo gdalwarp(con un SSD i costi di lettura e scrittura da / su disco / R non sono molto alti).

Tuttavia, non riesco a riprodurre i risultati projectRaster()dell'utilizzo di 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)

Sembra funzionare, tuttavia i risultati sono diversi:

# 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)

Cosa mi sto perdendo / facendo di sbagliato?

Ci sono altre alternative (più veloci) a projectRaster()?


Nessuno? Ho fornito un esempio completamente riproducibile (dovrebbe funzionare con Linux o Mac) ...
EDi

Che cosa ti aspetti Entrambe le opzioni usano lo stesso proj.4?

Mi aspetto che entrambi i metodi producano lo stesso raster riproiettato, la stessa estensione e lo stesso valore a (-100, 50). Tuttavia, a quanto pare non lo fanno :(
EDi

1
I due programmi stanno creando diverse griglie su cui deformarsi. Anche se il campionamento bilineare fosse esattamente lo stesso, i punti che vengono interpolati si trovano in luoghi diversi e si otterrebbero risposte diverse. Le origini e le dimensioni dei pixel sono diverse. È possibile impostare alcuni flag in gdalwarp (-te, -tr, ecc.) Per provare a riprodurre la versione R, quindi confrontare i valori dei pixel e vedere quanto sono diversi.

Ho scoperto in più occasioni che l'uso della -orderbandiera (l '"ordine del polinominale usato per la deformazione") gdalwarpanche senza usare i GCP ha prodotto risultati più accurati.
christoph,

Risposte:


10

Domanda piacevole e riproducibile. Personalmente, mi aspetto che la ragione della differenza sia nelle implementazioni della riproiezione bilineare. Ovviamente puoi esaminare il codice sorgente per i due approcci, ma mi aspetto che sia un enorme sovraccarico.
Sembra che l'implementazione di R introduca "errori" / "modifiche" più grandi rispetto alla versione GDAL non elaborata (almeno nelle mie versioni e test - projectRaster introduce modifiche intorno a + -0,01 mentre GDAL fornisce valori attorno a + -0,002).

Se si confrontano entrambi gli approcci utilizzando la riproiezione del vicino più vicino, corrispondono come previsto.


Grazie per questo suggerimento con i metodi di proiezione! Se trovo il tempo, darò uno sguardo più approfondito a quelli (Tuttavia, ho più familiarità con R quindi con C).
EDi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.