r Растровый кирпич writeRaster to netcdf завершается ошибкой после обрезки и маскирования кирпича, изначально созданного из файла netcdf - PullRequest
0 голосов
/ 06 марта 2020

У меня есть несколько файлов netcdf, которые представляют собой ежедневные климатические данные с разрешением 1/2 градуса для всего земного шара в течение 10 лет; каждый слой имеет данные за 1 год. Каждый файл состоит из одной переменной (hurs в примере ниже) с тремя измерениями - lat, long и time. Я хочу создать месячные индексы, чтобы я мог усреднять или суммировать данные по месяцам (и, возможно, другим периодам, например, 3 месяца windows).

Меня интересуют только данные о климате на суше. Обрезка кирпича до уровня земли имеет преимущество, заключающееся в уменьшении размера файла с примерно 2,2 ГБ до 0,8 ГБ, что ускоряет работу, а также создает новые сложности.

В приведенном ниже коде я читаю файл netcdf как кирпич с именем temp и использую nc_open для создания ncin, использую данные wrld_land для обрезки temp и затем пытаюсь записать результат в новый файл netcdf. Названия слоев в растровом кирпиче выглядят как "X2015.01.01" "X2015.01.02" "X2015.01.03" "X2015.01.04" "X2015.01.05" "X2015.01.06". Я создаю индексы с indices <- format(as.Date(names(ncin.brick), format = "X%Y.%m.%d"), format = "%m")

    library(ncdf4)
    library(raster)
    library(maptools)
    data(wrld_simpl)
    wrld_land <- subset(wrld_simpl, !NAME == "Antarctica")
    fileNameIn <- "/Volumes/PassportMac/ISIMIP/cmip6/ssp585/MPI-ESM1-2-HR/mpi-esm1-2-hr_r1i1p1f1_w5e5_ssp585_hurs_global_daily_2015_2020.nc"
    ncin <- nc_open(fileNameIn)
    temp <- brick(fileNameIn)
    head(names(temp))
    temp <- readAll(temp)
    tempCropped <- crop(temp, extent(wrld_land))
    tempCropped <- mask(tempNew, wrld_land)

Исходный растровый кирпич temp имеет переменную az с именем Date temp@z[["Date"]], которая имеет такую ​​структуру

Date[1:2192], format: "2015-01-01" "2015-01-02" "2015-01-03" ...

кирпич tempCropped имеет другой temp@z name 'time' - tempCropped@z[["time"]], но с той же структурой Date[1:2192], format: "2015-01-01" "2015-01-02" "2015-01-03" ...

Когда я пытаюсь записать новый файл netcdf с writeRaster(tempCropped, filename = "tempNew.nc",overwrite=TRUE, format="CDF"), я получаю эту ошибку

Name of variable that the error occurred on: "time"
I.e., you are trying to add a variable with that name to the file, but it ALREADY has a variable with that name!
[1] "----------------------"
[1] "Var:  time"
[1] "Ndims:  3"
[1] "Dimids: "
[1] 2 1 0
Error in ncvar_add(nc, vars[[ivar]], verbose = verbose, indefine = TRUE) : 
  Error in ncvar_add, defining var time

Я запутался в том, как обойти эту ошибку. Я попытался добавить новую переменную z с именем Date и удалить переменную с именем Time. writeRaster завершен, но новый файл n c испорчен.

...