Использование временных файлов при обработке растровых слоев / в ГИС-операциях в R - PullRequest
1 голос
/ 28 марта 2020

Я пытаюсь манипулировать несколькими растровыми файлами и выполнять над ними различные ГИС-операции (например, создание mosai c, переклассификация, кадрирование и т. Д. c.). Я ищу эффективный способ сделать это с точки зрения кодирования, времени выполнения и веса конечного вывода на жестком диске.

Рассмотрим ситуацию, когда я хочу создать серию мозаик, переклассифицировать каждую мозаику c и сохранить окончательные результаты в виде .vrt файлов.

У меня есть папка dem, состоящая из подпапок, каждая из которых содержит набор растровых плиток на данном сайте. Пока что единственный способ сделать это - открыть растры, создать файл .vrt, открыть только что созданный .vrt, переклассифицировать его и сохранить результат как .tif изображение.

library(tidyverse)
library(raster)
library(sf)

# merging dem
dem_ls <- list.files("GIS/Elev/dem", full.names = TRUE)

for (i in dem_ls) {
  outfile <- i %>% 
    basename() %>% 
    str_replace_all(" ", "_")
  i %>% 
    list.files(
      pattern = "\\.tif$",
      full.names = TRUE
    ) %>% 
    gdal_utils(
      util = "buildvrt",
      source = .,
      destination = str_c("GIS/Elev/vrt/", outfile, ".vrt")
    )
}


# reclassifying dem
vrt_ls <- list.files("GIS/Elev/vrt", full.names = TRUE)

for (i in vrt_ls) {
  outfile <- i %>% 
    basename() %>% 
    str_split("\\.") %>% 
    pluck(1, 1)

  r <- raster(i)
  NAvalue(r) <- -1
  r <- setMinMax(r)

  k <- 100
  lv <- minValue(r) %>% floor_nearest(100) # custom function to round down to the nearest given value
  hv <- maxValue(r) %>% floor_nearest(100)
  lower_v <- seq(lv, hv, k)
  higher_v <- seq(lv + k, hv + k, k)

  tibble(
    lower = lower_v,
    higher = higher_v,
    new_value = lower_v
  ) %>% 
    reclassify(r, ., right = FALSE) %>% 
    writeRaster(
      filename = str_c("GIS/Elev/Mosaic/", outfile, "_reclass.tif"),
      drivername = "GTiff",
      type = "Float32"
    )
}

Есть ли более эффективный способ сделать это, например, использовать временные файлы? Я не нахожу много информации о временных файлах и как их использовать.

В идеале я хотел бы сделать один l oop, использовать временные файлы в течение всего процесса и сохранять только конечный результат как .vrt.
Что-то вроде:

  1. открыть набор плиток
  2. создать mosai c во временном файле
  3. реклассифицировать новые mosai c (+ другие дополнительные операции)
  4. сохранить окончательный вывод как .vrt файл

Возможно ли это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...