Как записать несколько бэндов из netcdf в бинарный файл?

У меня есть файл netcdf, я открыл его и прочитал одну переменную:

 K=open.ncdf("C:\\hiba_history.nc")
Smonthly= get.var.ncdf(nc=K,varid="evap",verbose=TRUE)

[1] "vobjtodimname: is a character type varid.  This file has 9 dims"
[1] "vobjtodimname: no cases found, returning FALSE"
[1] "get.var.ncdf: isdimvar: FALSE"
[1] "vobjtovarid: entering with varid=evap"
[1] "Variable named evap found in file with varid= 10"
[1] "vobjtovarid: returning with varid deduced from name; varid= 10"
[1] "get.var.ncdf: ending up using varid= 10"
[1] "ndims: 3"
[1] "get.var.ncdf: varsize:"
[1] 34 30 12
[1] "get.var.ncdf: start:"
[1] 1 1 1
[1] "get.var.ncdf: count:"
[1] 34 30 12
[1] "get.var.ncdf: totvarsize: 12240"
[1] "Getting var of type 3  (1=short, 2=int, 3=float, 4=double, 5=char, 6=byte)"
[1] "get.var.ncdf: C call returned 0"
[1] "count.nodegen: 34    Length of data: 12240" "count.nodegen: 30    Length of data: 12240"
[3] "count.nodegen: 12    Length of data: 12240"
[1] "get.var.ncdf: final dims of returned array:"
[1] 34 30 12
[1] "varid: 10"

Как вы можете видеть, эта переменная имеет 30 пикселей и 34 строки и 12 полос (месяцев). Я хотел бы просто написать сумму 12, поэтому я наконец получил один файл, который вычисляет сумму всех 12 месяцев (чтобы быть годовым)

      apply(Smonthly, c(1,2), sum) -> Sannual 
  to.write = file(paste("C:\\annual.bin",sep=""),"wb")

   writeBin(as.double(Sannual),to.write,size=4)

Когда я открыл файл через другую программу, я обнаружил, что карта (файл) была перевернута.


person sacvf    schedule 16.10.2012    source источник
comment
Уточните, пожалуйста, что не получилось, где не удалось посчитать сумму или не удалось сделать дамп файла? Пожалуйста, сделайте вашу проблему воспроизводимой...   -  person Paul Hiemstra    schedule 17.10.2012
comment
К вашему сведению, paste("C:\\annual.bin",sep="") не нужно, просто напишите "C:\\annual.bin".   -  person plannapus    schedule 17.10.2012


Ответы (2)


... и когда у вас есть месячные суммы, вы можете просто вызвать writeBin, чтобы сохранить их в файл:

a = array(runif(10*10*10), dim = c(10,10,10))
a_sum = apply(a, c(1,2), sum)
# Write stuff
writeBin(as.numeric(a_sum), "/tmp/test.bin", size = 4)
# read stuff back in
test = readBin("/tmp/test.bin", numeric(), 10*10, size = 4)
# ...succes???
> head(data.frame(test, as.numeric(a_sum)))
      test as.numeric.a_sum.
1 5.581374          5.581374
2 5.974429          5.974429
3 4.854637          4.854637
4 5.040194          5.040193
5 3.709209          3.709210
6 6.119048          6.119048
>     all.equal(test, as.numeric(a_sum))
[1] "Mean relative difference: 2.313248e-08"
>     all.equal(test, as.numeric(a_sum), tolerance = 1e-7)
[1] TRUE

примечание: почему вам нужно установить tolerance, чтобы all.equal вернуло TRUE, я оставляю в качестве упражнения для читателя.

person Paul Hiemstra    schedule 17.10.2012
comment
Затем поменяйте ось или запишите данные в файл в обратном порядке, см., например, Ответ @Spacedman на ваш предыдущий вопрос: заголовок stackoverflow.com/questions/12897176/ - person Paul Hiemstra; 17.10.2012

Что касается суммирования 12 месяцев вместе, вот как это сделать:

library(ncdf)
K <- open.ncdf("math.nc")
Smonthly <- get.var.ncdf(nc=K,varid="evap")
apply(Smonthly, c(1,2), sum) -> Sannual 
# Since the months are represented by dimension 3, you apply sum on dimensions 1 and 2

По запросу вот попытка сделать то же самое, используя raster:

library(raster)
library(ncdf)
Smonthly <- raster("math.nc", varname="evap", band=12)
Sannual <- calc(Smonthly, sum)
person plannapus    schedule 17.10.2012
comment
Просто любопытно, можно ли это сделать с raster? - person Roman Luštrik; 17.10.2012
comment
Честно говоря, я не очень хорошо знаком с подпрограммой writeBin/readBin, поэтому, к сожалению, я не могу помочь в этом аспекте вашего вопроса. - person plannapus; 17.10.2012