R: Загрузите большую матрицу высот, измените проекцию и настройте на меньший масштаб

11

Это процесс, который занимает всего несколько секунд в программном обеспечении ГИС. Моя попытка сделать это в R использует большой объем памяти, а затем терпит неудачу. Что-то не так в моем коде, или это просто то, что R не может сделать? Я прочитал, что R может работать внутри Grass, могу ли я использовать функцию Grass изнутри 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)
Дж. Вин.
источник
Просто любопытно, какой пакет вы используете?
djq
@celenius: этот пакет называетсяraster
J. Win.

Ответы:

9

Исходя из моего взгляда на источник, rasterможно догадаться, помещается ли набор данных в память, и если да, выполнить операцию в памяти, в противном случае на диске. Вы можете заставить его выполнить вычисление, явно указав chunksize(количество ячеек для обработки за один раз) и maxmemory(максимальное количество ячеек для чтения в память):

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

В качестве альтернативы, вы можете выполнить преобразование напрямую с помощью 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

Вероятно, это будет самый быстрый вариант и не требует явной настройки ГИС-среды.

SCW
источник
Это не сработало, но сработало: setOptions(chunksize = 1e+04, maxmemory = 1e+06)времени восемь минут, гораздо меньше, чем потребуется, чтобы установить и использовать настоящую ГИС.
Дж. Вин.
@J. Винчестер: я обновил свой ответ, чтобы включить ваши настройки, так как это лучший подход. Автору пакета, вероятно, будет интересно узнать, когда и почему он падает, и, надеюсь, обновить настройки по умолчанию, чтобы отразить это.
SCW
1
Хорошая идея добавить (без потерь) сжатие и тайлинг (по умолчанию 256x256) в GeoTIFF из gdalwarp, если ваша цель может с этим справиться: -co COMPRESS = LZW -co TILED = YES
mdsumner
Я сообщил Роберту Хеймансу об этом деле. На меньшей матрице высот настройки по умолчанию почти оптимальны, так что пока это загадка.
Дж. Вин.
большой! Это также позволило мне экспортировать RasterLayer в (3GB) netcdf с writeRaster.
Дэвид Лебауэр
3

Вы также можете использовать пакет spgrass6 для интеграции между R и grass. Автор Roger Bivand (автор sp)

Этот пакет имеет много функций для полного запуска травы внутри R (или наоборот) и обмена данными между R и травой

для получения дополнительной информации: http://cran.r-project.org/web/packages/spgrass6/index.html

dickoa
источник
1

ЗДРАВСТВУЙ,

Это процесс, который занимает всего несколько секунд в программном обеспечении ГИС. Моя попытка сделать это в R использует> большой объем памяти, затем терпит неудачу.

Вы ответили на ваши вопросы, сделайте это в GRASS или GDAL и оставьте R для других задач.

Pablo
источник
1
Для полноты: вам нужно обратиться к пакету spgrass для запуска травы в R.
johanvdw
1
И третий вариант - использование саги. Есть модуль (RSAGA), который соединяет саги и Р.
johanvdw
Эта R-функция предназначена для использования GDAL, но, похоже, в этом случае она не используется должным образом. Мой вопрос: «Как мне лучше всего выполнить эту задачу с помощью R», а не «Какое программное обеспечение ГИС доступно, чтобы выполнить эту задачу».
Дж. Вин.