R:下载较大的DEM,更改投影并调整为较小的比例


11

在GIS软件中,此过程仅需几秒钟。我在R中尝试执行此操作会占用大量内存,然后失败。我的代码中有什么问题吗,还是R不能做的事情?我已经读过R可以在Grass内部使用,我可以从R内部使用Grass函数吗?

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 2011年

@celenius:此软件包称为raster
J. Win。

Answers:


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

这可能是最快的选择,并且不需要显式设置GIS环境。


这样做并没有做到,但确实做到了:setOptions(chunksize = 1e+04, maxmemory = 1e+06)时间八分钟,比安装和使用真实的GIS所需的时间少得多。
J. Win。

@J。温彻斯特:我已经更新了回复,以包含您的设置,因为这是更好的方法。程序包作者可能会想知道它何时以及为什么崩溃,并希望更新默认值以反映这一情况。
scw

1
如果目标可以处理,最好从gdalwarp向GeoTIFF添加(无损)压缩和平铺(默认为256x256):-co COMPRESS = LZW -co TILED = YES
mdsumner 2011年

我让罗伯特·希曼斯(Robert Hijmans)知道此案。在较小的DEM上,默认设置接近最佳,因此到目前为止,这仍然是个谜。
J. Win。

大!这也使我可以使用将RasterLayer导出到(3GB)netcdf writeRaster
David LeBauer


1

嗨,

在GIS软件中,该过程仅需几秒钟。我在R中尝试执行此操作会使用大量内存,然后失败。

您回答了问题,使用GRASSGDAL进行操作,而将R留给其他任务。


1
为完整起见:您应该看一下spgrass软件包在R中

1
第三种选择是使用saga gis。有一个模块(RSAGA)连接传奇和
R。– johanvdw

该R函数旨在使用GDAL,但在这种情况下似乎使用不佳。我的问题是“我怎样才能最好地用R完成这项任务”,而不是“可以使用哪些GIS软件来完成此任务”。
J. Win。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.