R: Pobierz duży DEM, zmień rzut i dostosuj do mniejszej skali

11

Jest to proces, który zajmuje zaledwie kilka sekund w oprogramowaniu GIS. Moja próba zrobienia tego w R zużywa dużą ilość pamięci, a potem kończy się niepowodzeniem. Czy w moim kodzie jest coś nie tak, czy jest to coś, czego R nie może zrobić? Czytałem, że R może działać wewnątrz Grassa, czy mogę używać funkcji Grassa z wnętrza 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.
źródło
Ciekawe, jakiego pakietu używasz?
djq
@celenius: ten pakiet nazywa sięraster
J. Win.

Odpowiedzi:

9

Z mojego spojrzenia na źródło, rasterzgaduję, czy zestaw danych pasuje do pamięci, a jeśli tak, wykonaj operację w pamięci, w przeciwnym razie na dysku. Możesz zmusić go do wykonania obliczeń poprzez jawne ustawienie chunksize(komórki przetwarzane jednocześnie) i maxmemory(maksymalna liczba komórek wczytywanych do pamięci):

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

Alternatywnie możesz wykonać transformację bezpośrednio za pomocą 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

Będzie to prawdopodobnie najszybsza opcja i nie wymaga jawnej konfiguracji środowiska GIS.

scw
źródło
To nie zrobiło tego, ale tak zrobiło: setOptions(chunksize = 1e+04, maxmemory = 1e+06)czas osiem minut, znacznie mniej niż zajęłoby zainstalowanie i korzystanie z prawdziwego GIS.
J. Win.
@JOT. Winchester: Zaktualizowałem moją odpowiedź, aby uwzględnić twoje ustawienia, ponieważ jest to lepsze podejście. Autor pakietu prawdopodobnie byłby zainteresowany usłyszeniem, kiedy i dlaczego ulega awarii, i mam nadzieję, że zaktualizuje ustawienia domyślne, aby to odzwierciedlić.
scw
1
dobrym pomysłem jest dodanie (bezstratnej) kompresji i kafelkowania (domyślnie 256 x 256) do GeoTIFF z gdalwarp, jeśli twój cel może to obsłużyć: -co COMPRESS = LZW -co TILED = TAK
mdsumner
Powiadomiłem Roberta Hijmansa o sprawie. W mniejszym DEM ustawienia domyślne są prawie optymalne, więc do tej pory jest to tajemnica.
J. Win.
wspaniały! To pozwoliło mi również wyeksportować RasterLayer do (3GB) netcdf z writeRaster.
David LeBauer,
3

Możesz także użyć pakietu spgrass6 do integracji R z trawą. Autorem jest Roger Bivand (autor sp)

Ten pakiet ma wiele funkcji, aby całkowicie uruchomić trawę wewnątrz R (lub odwrotnie) i wymieniać dane między R i trawą

Więcej informacji: http://cran.r-project.org/web/packages/spgrass6/index.html

dickoa
źródło
1

CZEŚĆ,

Jest to proces, który zajmuje zaledwie kilka sekund w oprogramowaniu GIS. Moja próba zrobienia tego w R używa> dużej ilości pamięci, a następnie kończy się niepowodzeniem.

Odpowiedziałeś na swoje pytania, zrób to w GRASS lub GDAL i zostaw R na inne zadania.

Pablo
źródło
1
Dla kompletności: powinieneś spojrzeć na pakiet spgrass, aby uruchomić trawę w R.
johanvdw
1
Trzecią opcją jest użycie saga gis. Istnieje moduł (RSAGA), który łączy sagę i R.
johanvdw
Ta funkcja R została zaprojektowana do używania GDAL, ale wydaje się, że nie używa jej dobrze w tym przypadku. Moje pytanie brzmi: „Jak najlepiej wykonać to zadanie za pomocą R”, a nie „Jakie oprogramowanie GIS jest w stanie wykonać to zadanie”.
J. Win.