R: Scarica un grande DEM, cambia la proiezione e regola su scala più piccola


11

Questo è un processo che richiede solo pochi secondi nel software GIS. Il mio tentativo di farlo in R utilizza una grande quantità di memoria, quindi fallisce. C'è qualcosa di sbagliato nel mio codice o è solo qualcosa che R non può fare? Ho letto che R può funzionare all'interno di Grass, posso usare una funzione Grass dall'interno di R?

library(raster)

# I have many environmental rasters in this format
new_r <- raster(ncol=615, nrow=626, xmn=-156.2, xmx=-154.8, ymn=18.89, ymx=20.30)
res(new_r) <- 0.00225
projection(new_r) <- "+proj=longlat +ellps=GRS80 +datum=NAD83 +no_defs +towgs84=0,0,0"

R> new_r ### not too big with a few hundred cells per side
class       : RasterLayer 
dimensions  : 627, 622, 1  (nrow, ncol, nlayers)
ncell       : 389994 
resolution  : 0.00225, 0.00225  (x, y)
projection  : +proj=longlat +ellps=GRS80 +datum=NAD83 +no_defs +towgs84=0,0,0 
extent      : -156.2, -154.8, 18.89, 20.3  (xmin, xmax, ymin, ymax)
values      : none

# I get the DEM at much higher resolution (zipfile is 182Mb)
zipurl <- "ftp://soest.hawaii.edu/coastal/webftp/Hawaii/dem/Hawaii_DEM.zip"
DEMzip <- download.file(zipurl, destfile = "DEMzip")
unzip("DEMzip", exdir = "HIDEM")
HIDEM <- raster("HIDEM/hawaii_dem")

R> HIDEM ### 10m resolution, file is way too big
class       : RasterLayer 
dimensions  : 15067, 13136, 1  (nrow, ncol, nlayers)
ncell       : 197920112 
resolution  : 10, 10  (x, y)
projection  : +proj=utm +zone=5 +ellps=GRS80 +datum=NAD83 +units=m +no_defs +towgs84=0,0,0 
extent      : 179066, 310426, 2093087, 2243757  (xmin, xmax, ymin, ymax)
values      : HIDEM/hawaii_dem 
min value   : 0 
max value   : 4200 

# the following line fails (after a long time)
new_HIDEM <- projectRaster(HIDEM, new_r)

Solo curioso, qual è il pacchetto che stai usando?
djq

@celenius: questo pacchetto si chiamaraster
J. Win.

Risposte:


9

Dal mio sguardo alla fonte, rastercerca di indovinare se il set di dati si adatta alla memoria e, in tal caso, esegue l'operazione in memoria, altrimenti su disco. È possibile forzarlo per eseguire il calcolo impostando esplicitamente chunksize(celle da elaborare alla volta) e maxmemory(numero massimo di celle da leggere in memoria):

setOptions(chunksize = 1e+04, maxmemory = 1e+06)

In alternativa, è possibile eseguire direttamente la trasformazione con GDAL:

gdalwarp -t_srs '+proj=utm +zone=5 +ellps=GRS80 +datum=NAD83 +units=m +no_defs +towgs84=0,0,0' HIDEM/hawaii_dem hawaii_dem_utm.tif

Questa sarà probabilmente l'opzione più veloce e non richiede l'impostazione esplicita di un ambiente GIS.


Ciò non ha funzionato, ma è bastato: setOptions(chunksize = 1e+04, maxmemory = 1e+06)tempo otto minuti, molto meno di quanto occorrerebbe per installare e utilizzare un vero GIS.
J. Win.

@J. Winchester: ho aggiornato la mia risposta per includere le tue impostazioni in quanto è l'approccio migliore. L'autore del pacchetto sarebbe probabilmente interessato a sapere quando e perché si blocca e, si spera, aggiornare le impostazioni predefinite per riflettere questo.
scw,

1
è una buona idea aggiungere compressione (lossless) e piastrellatura (impostazione predefinita 256x256) al GeoTIFF da gdalwarp se il tuo obiettivo può gestirlo: -co COMPRESS = LZW -co TILED = YES
mdsumner

Ho informato Robert Hijmans del caso. Su un DEM più piccolo, le impostazioni predefinite sono quasi ottimali, quindi questo è un mistero finora.
J. Win.

grande! Questo mi ha anche permesso di esportare un RasterLayer in un (3GB) netcdf con writeRaster.
David LeBauer,


1

CIAO,

il suo è un processo che richiede solo pochi secondi nel software GIS. Il mio tentativo di farlo in R usa una grande quantità di memoria, quindi fallisce.

Hai risposto alle tue domande, fallo in GRASS o GDAL e lascia R per altre attività.


1
Per completezza: dovresti cercare il pacchetto spgrass per eseguire grass in R.
johanvdw,

1
E una terza opzione sta usando saga gis. C'è un modulo (RSAGA) che collega saga e R.
johanvdw,

Questa funzione R è progettata per utilizzare GDAL, ma sembra non utilizzarla bene in questo caso. La mia domanda è "Come posso svolgere al meglio questa attività con R", non "Quale software GIS è disponibile in grado di svolgere questa attività."
J. Win.
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.