R: Tải xuống một DEM lớn, thay đổi phép chiếu và điều chỉnh theo tỷ lệ nhỏ hơn


11

Đây là một quá trình chỉ mất vài giây trong phần mềm GIS. Cố gắng của tôi để làm điều đó trong R sử dụng một lượng lớn bộ nhớ sau đó không thành công. Có điều gì đó sai trong mã của tôi, hoặc đây chỉ là điều R không thể làm được? Tôi đã đọc R có thể hoạt động bên trong Grass, tôi có thể sử dụng chức năng Grass từ bên trong R không?

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)

Chỉ tò mò, gói bạn đang sử dụng là gì?
djq

@celenius: gói này được gọi làraster
J. Win.

Câu trả lời:


9

Từ cái nhìn của tôi về nguồn, rasternhìn để đoán xem tập dữ liệu có vừa với bộ nhớ hay không, và nếu vậy, hãy thực hiện thao tác trong bộ nhớ, nếu không thì trên đĩa. Bạn có thể buộc nó thực hiện phép tính bằng cách cài đặt rõ ràng chunksize(các ô để xử lý tại một thời điểm) và maxmemory(số lượng ô tối đa để đọc vào bộ nhớ):

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

Ngoài ra, bạn có thể thực hiện chuyển đổi trực tiếp với 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

Đây có thể sẽ là tùy chọn nhanh nhất và không yêu cầu thiết lập môi trường GIS một cách rõ ràng.


Điều đó đã không làm điều đó, nhưng điều này đã làm: setOptions(chunksize = 1e+04, maxmemory = 1e+06)Thời gian tám phút, ít hơn nhiều so với việc cài đặt và sử dụng một hệ thống GIS thực sự.
J. Thắng.

@J. Winchester: Tôi đã cập nhật phản hồi của mình để bao gồm các cài đặt của bạn vì đó là cách tiếp cận tốt hơn. Tác giả gói, có thể sẽ quan tâm để nghe khi nào và tại sao nó gặp sự cố, và hy vọng cập nhật các mặc định để phản ánh điều này.
scw

1
nên thêm (nén) không mất dữ liệu (mặc định là 256x256) vào GeoTIFF từ gdalwarp nếu mục tiêu của bạn có thể xử lý nó: -co COMPRESS = LZW -co TILED = YES
mdsumner 23/211

Tôi cho Robert Hijmans biết về vụ án. Trên một DEM nhỏ hơn, các cài đặt mặc định gần như tối ưu, vì vậy đây là một bí ẩn cho đến nay.
J. Thắng.

tuyệt quá! Điều này cũng cho phép tôi xuất RasterLayer sang netcdf (3 GB) với writeRaster.
David LeBauer

3

Bạn cũng có thể sử dụng gói spgrass6 để tích hợp giữa R và cỏ. Tác giả là Roger Bivand (tác giả của sp)

Gói này có nhiều chức năng để chạy hoàn toàn cỏ bên trong R (hoặc ngược lại) và trao đổi dữ liệu giữa R và cỏ

để biết thêm thông tin: http://cran.r-project.org/web/packages/spgrass6/index.html


1

CHÀO,

Đây là một quá trình chỉ mất vài giây trong phần mềm GIS. Cố gắng của tôi để làm điều đó trong R sử dụng một lượng lớn bộ nhớ sau đó không thành công.

Bạn đã trả lời các câu hỏi của mình, thực hiện điều đó trong GRASS hoặc GDAL và để R cho các nhiệm vụ khác.


1
Để hoàn thiện: bạn nên tìm đến gói cỏ để chạy cỏ trong R.
johanvdw

1
Và một lựa chọn thứ ba là sử dụng saga gis. Có một mô-đun (RSAGA) kết nối saga và R.
johanvdw

Hàm R này được thiết kế để sử dụng GDAL, nhưng dường như không sử dụng tốt trong trường hợp này. Câu hỏi của tôi là "Làm thế nào tôi có thể hoàn thành tốt nhất nhiệm vụ này với R", chứ không phải "Phần mềm GIS nào có sẵn có thể thực hiện nhiệm vụ này".
J. Thắng.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.