2012-10-16 4 views
0

J'ai fichier netcdf je l'ai ouvert et lu une variable:Comment écrire plusieurs bandes de netcdf dans un fichier binaire?

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" 

Comme vous pouvez le voir, cette variable a 30 pixels et 34 lignes et 12 bandes (mois) Je voudrais juste écrire la somme du 12 donc je suis finalement un dossier qui calculent la somme de tous les 12 mois (à annuelle)

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

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

Quand j'Opend le fichier à travers un autre programme, je trouve que la carte (fichier) était à l'envers vers le bas

+1

S'il vous plaît spécifier ce qui ne fonctionne pas, où vous ne parvenez pas à calculer la somme, ou incapable de vider le fichier? Veuillez rendre votre problème reproductible ... –

+0

FYI 'paste (" C: \\ annual.bin ", sep =" ")' est inutile, écrivez juste '" C: \\ annual.bin "'. – plannapus

Répondre

2

En ce qui additionnant les 12 mois ensemble, voici la façon de le faire:

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 

Comme par demande est ici une tentative de faire la même chose en utilisant raster:

library(raster) 
library(ncdf) 
Smonthly <- raster("math.nc", varname="evap", band=12) 
Sannual <- calc(Smonthly, sum) 
+0

Juste curieux, cela serait-il faisable avec 'raster'? –

+0

Honnêtement, je ne suis pas très familier avec la routine 'writeBin' /' readBin' donc je ne peux pas vraiment vous aider sur cet aspect de votre question malheureusement. – plannapus

2

... et une fois que vous avez les sommes mensuelles, vous pouvez simplement appeler writeBin pour les enregistrer dans un fichier:

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 

Note: pourquoi vous devez définir tolerance pour obtenir all.equal pour retourner TRUE Je pars comme un exercice pour le lecteur.

+0

Échangez ensuite l'axe ou écrivez les données dans le fichier dans l'ordre inverse, voir par ex. @ Spacedman's réponse à votre question précédente: http://stackoverflow.com/questions/12897176/how-to-display-longitude-and-latitude-lines-on-a-map-using-r –

Questions connexes