只读R中的作物或光栅范围

时间:2018-06-13 01:18:42

标签: r geospatial raster tiff geotiff

我正在处理每日tif文件中的大量数据(每天数千个文件)。我正在分析shapefile区域中栅格的平均值,在可能的数千个形状层上重复。

我目前的.tif文件适用于整个国家/地区实际上我只需要为每个shapefile图层提供每个tif文件的一小块区域。每个形状图层都有一组不同的提取天数,即数据框如下:

df <- data.frame(shplayer=c("shp_layerbuffer1","shp_layerbuffer2", "shp_layerbuffer3"), start=c("2000_02_18", "2004_03_19", "2010_08_20"), end=c("2010_01_09", "2005_03_15", "2012_09_04"))

在R中,有没有办法在读取文件之前裁剪.tif(或任何栅格类型文件)?这样我就可以只读取每个tif文件的裁剪区域

我设想了一些事情(重复整个日期):

library(sf)
library(raster)
shp_layerbuffer1 <- st_read("myshpfolder", layer="shp_layerbuffer1", quiet=T)

###EXAMPLE BUT doesn't work to crop the raster as it comes in
tempraster <- raster::raster("mytif_2000_02_18.tif", ext=extent(shp_layerbuffer1))

然后通常的velox(或光栅)提取物,重复。

2 个答案:

答案 0 :(得分:3)

在这种情况下,我会使用gdalUitls包创建virtual raster file (VRT)。这是创建一个或多个栅格数据集的子集(甚至虚拟马赛克)的最快方法。对于此VRT,您可以使用sf::extent设置所需范围

最小(不可重现)的例子是:

library(gdalUitls)
library(raster)
library(sf)

shp_layerbuffer1 <- st_read("myshpfolder", layer="shp_layerbuffer1", quiet=T)

gdalbuildvrt(gdalfile = "yourraster.tif", 
             output.vrt = "tmp.vrt", 
             te = st_bbox(shp_layerbuffer1))

tempraster <- raster("tmp.vrt")

VRT基本上为新的“光栅”文件创建了一个虚拟画布。然后它引用相应的行和列形成(一个或多个)基础栅格文件。因此,您需要创建一个全新的栅格,而只需引用现有文件。 VRT的文件大小不应超过几KB。

答案 1 :(得分:2)

如果您对数据而不是栅格对象(或vrt / tiff)感兴趣,那么这可能是一种方法:

如果你&#34;加载&#34;来自文件的栅格,它并不一定意味着它被加载到内存中,正如raster的文档所解释的那样:

  

在许多情况下,例如当从文件创建RasterLayer时,它(最初)不包含(RAM)内存中的任何单元(像素)值,它只有描述RasterLayer的参数。您可以使用getValues,提取和相关函数访问单元格值。您可以使用setValues和替换分配新值。

所以你可以先&#34;索引&#34;然后使用getValuesBlock来读取属于您感兴趣区域的值。

library(raster)

f <- system.file('external/test.grd',package = 'raster')

# index
r <- raster(f)

# check if in memory

inMemory(r)
#[1] FALSE # output

# this would be an extent from your overlapping shapefile
e <- extent(r,58,68,40,50)

# get cells from extent; either use cells as index directly or convert to rowcol

rowcol <- rowColFromCell(r,cellsFromExtent(r,e))

v <- getValuesBlock(r,row=rowcol[1,1],nrows=(rowcol[nrow(rowcol),1] - rowcol[1,1]),
                    col=rowcol[1,2],ncols=(rowcol[nrow(rowcol),2] - rowcol[1,2]))

v
# [1] 295.392 225.710 258.595 310.336 324.666 322.702 307.217 283.611 263.987 156.609 322.978 297.565 301.797 315.971
# [15] 323.605 326.920 317.894 297.138 270.027 225.769 337.503 323.388 314.900 308.877 314.556 343.555 344.035 315.400
# [29] 291.188 270.876 337.866 324.632 307.220 278.294 264.379 348.519 356.456 322.450 301.790 285.815 331.383 318.950
# [43] 299.246 262.026 230.869 294.012 320.274 312.777 300.513 285.317 321.075 311.447 296.952 278.519 270.279 283.797
# [57] 296.415 298.861 293.150 277.573 306.692 300.772 289.376 273.141 258.457 258.638 272.966 283.977 284.621 271.690
# [71] 286.749 286.617 275.618 247.307 198.884 193.865 240.465 268.687 277.303 271.431 260.336 271.458 263.977 231.071
# [85] 161.407 154.181 222.417 258.672 271.711 272.642 235.458 258.810 257.763 239.553 209.409 205.905 234.162 255.668
# [99] 266.260 270.532

编辑:

# check if raster was loaded after getValuesBlock
inMemory(r)
#[1] FALSE