R: Descargue un DEM grande, cambie la proyección y ajústelo a una escala más pequeña

11

Este es un proceso que lleva solo unos segundos en el software SIG. Mi intento de hacerlo en R utiliza una gran cantidad de memoria y luego falla. ¿Hay algo mal en mi código o es algo que R no puede hacer? He leído que R puede funcionar dentro de Grass, ¿puedo usar una función Grass desde dentro de 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)
J. Win.
fuente
Por curiosidad, ¿cuál es el paquete que está utilizando?
DJ
@celenius: este paquete se llamaraster
J. Win.

Respuestas:

9

Desde mi observación de la fuente, rasterbusca adivinar si el conjunto de datos se ajusta a la memoria y, de ser así, realizar la operación en la memoria, de lo contrario en el disco. Puede forzarlo a realizar el cálculo estableciendo explícitamente chunksize(celdas para procesar a la vez) y maxmemory(número máximo de celdas para leer en la memoria):

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

Alternativamente, puede realizar la transformación con GDAL directamente:

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

Esta será probablemente la opción más rápida y no requiere la configuración explícita de un entorno SIG.

scw
fuente
Eso no lo hizo, pero sí lo hizo: setOptions(chunksize = 1e+04, maxmemory = 1e+06)tiempo ocho minutos, mucho menos de lo que tomaría instalar y usar un SIG real.
J. Win.
@J. Winchester: He actualizado mi respuesta para incluir su configuración, ya que ese es el mejor enfoque. Es probable que el autor del paquete esté interesado en saber cuándo y por qué se bloquea y, con suerte, actualizar los valores predeterminados para reflejar esto.
scw
1
es una buena idea agregar compresión y mosaico (sin pérdida) (el valor predeterminado es 256x256) al GeoTIFF desde gdalwarp si su objetivo puede manejarlo: -co COMPRESS = LZW -co TILED = YES
mdsumner
Dejé que Robert Hijmans supiera sobre el caso. En un DEM más pequeño, la configuración predeterminada es casi óptima, por lo que hasta ahora es un misterio.
J. Win.
¡Excelente! Esto también me permitió exportar un RasterLayer a un (3 GB) netcdf con writeRaster.
David LeBauer
3

También puede usar el paquete spgrass6 para la integración entre R y grass. El autor es Roger Bivand (el autor de sp)

Este paquete tiene muchas funciones para ejecutar completamente hierba dentro de R (o al revés) e intercambiar datos entre R y hierba

Para más información: http://cran.r-project.org/web/packages/spgrass6/index.html

dickoa
fuente
1

HOLA,

Este es un proceso que toma solo unos segundos en el software SIG. Mi intento de hacerlo en R usa una> gran cantidad de memoria y luego falla.

Respondiste tus preguntas, hazlo en GRASS o GDAL y dejas R para otras tareas.

Pablo
fuente
1
Para completar: usted debe buscar al paquete spgrass a plazo hierba en R.
johanvdw
1
Y una tercera opción es usar saga gis. Hay un módulo (RSAGA) que conecta la saga y R.
johanvdw
Esta función R está diseñada para usar GDAL, pero parece no estar usándola bien en este caso. Mi pregunta es "¿Cómo puedo realizar mejor esta tarea con R", no "Qué software SIG está disponible para hacer esta tarea?"
J. Win.