R: Laden Sie ein großes DEM herunter, ändern Sie die Projektion und passen Sie es an einen kleineren Maßstab an

11

Dies ist ein Vorgang, der in der GIS-Software nur wenige Sekunden dauert. Mein Versuch, dies in R zu tun, verwendet eine große Menge an Speicher und schlägt dann fehl. Stimmt etwas in meinem Code nicht oder ist dies nur etwas, was R nicht kann? Ich habe gelesen, dass R in Grass funktionieren kann. Kann ich eine Grass-Funktion in R verwenden?

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.
quelle
Nur neugierig, was ist das Paket, das Sie verwenden?
DJQ
@celenius: Dieses Paket heißtraster
J. Win.

Antworten:

9

rasterWenn ich mir die Quelle anschaue, kann ich erraten, ob der Datensatz in den Speicher passt, und in diesem Fall den Vorgang im Speicher ausführen, andernfalls auf der Festplatte. Sie können die Berechnung erzwingen, indem Sie explizit festlegen chunksize(gleichzeitig zu verarbeitende Zellen) und maxmemory(maximale Anzahl von Zellen, die in den Speicher eingelesen werden sollen):

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

Alternativ können Sie die Transformation mit GDAL direkt durchführen:

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

Dies ist wahrscheinlich die schnellste Option und erfordert nicht das explizite Einrichten einer GIS-Umgebung.

scw
quelle
Das hat es nicht getan, aber das hat es getan: setOptions(chunksize = 1e+04, maxmemory = 1e+06)Zeit acht Minuten, viel weniger als für die Installation und Verwendung eines echten GIS erforderlich wäre.
J. Win.
@J. Winchester: Ich habe meine Antwort aktualisiert, um Ihre Einstellungen einzuschließen, da dies der bessere Ansatz ist. Der Autor des Pakets wäre wahrscheinlich interessiert zu erfahren, wann und warum es abstürzt, und hoffentlich die Standardeinstellungen zu aktualisieren, um dies widerzuspiegeln.
scw
1
Es ist eine gute Idee, dem GeoTIFF von gdalwarp (verlustfreie) Komprimierung und Kacheln (standardmäßig 256x256) hinzuzufügen, wenn Ihr Ziel damit umgehen kann: -co COMPRESS = LZW -co TILED = YES
mdsumner
Ich habe Robert Hijmans über den Fall informiert. Bei einem kleineren DEM sind die Standardeinstellungen nahezu optimal, daher ist dies bislang ein Rätsel.
J. Win.
großartig! Dadurch konnte ich auch einen RasterLayer in eine (3 GB) Netcdf mit exportieren writeRaster.
David LeBauer
3

Sie können das Paket spgrass6 auch für die Integration zwischen R und grass verwenden. Der Autor ist Roger Bivand (der Autor von sp)

Dieses Paket hat viele Funktionen, um Gras vollständig in R (oder umgekehrt) laufen zu lassen und Daten zwischen R und Gras auszutauschen

Weitere Informationen: http://cran.r-project.org/web/packages/spgrass6/index.html

Dickoa
quelle
1

HALLO,

Dies ist ein Vorgang, der in der GIS-Software nur wenige Sekunden dauert. Mein Versuch, dies in R zu tun, verwendet eine> große Menge an Speicher und schlägt dann fehl.

Sie haben Ihre Fragen beantwortet, dies in GRASS oder GDAL getan und R für andere Aufgaben verlassen.

Pablo
quelle
1
Der Vollständigkeit halber: Sie sollten auf das spgrass-Paket schauen, um Gras in R.
johanvdw
1
Und eine dritte Option ist die Verwendung von Saga Gis. Es gibt ein Modul (RSAGA), das Saga und R. verbindet
johanvdw
Diese R-Funktion ist für die Verwendung von GDAL ausgelegt, scheint sie in diesem Fall jedoch nicht gut zu verwenden. Meine Frage lautet "Wie kann ich diese Aufgabe am besten mit R ausführen?" Und nicht "Welche GIS-Software ist verfügbar, die diese Aufgabe ausführen kann?".
J. Win.