2014-09-08 7 views
6

La longitudine in dati climatici futuri CMIP5 è compresa tra 0 e 360 ​​gradi. Come posso convertirlo a -180 - 180 gradi usando il pacchetto raster?come convertire la longitudine da 0 - 360 a -180 - 180

Ho provato con shift(r0,-180) e shift(r0,-360). Non funziona. Qualsiasi aiuto sarà apprezzato. r0 ecco un raster.

risposta

11

Prova rotate(). La sua pagina di aiuto menziona anche la sua utilità con il tipo di dati si sta trattando:

ruotare un Raster * oggetto che ha coordinate x (longitudine) da 0 a 360 , in coordinate standard tra -180 e 180 gradi. La longitudine tra 0 e 360 ​​viene spesso utilizzata nei dati dei modelli climatici globali .

Ecco un semplice esempio riproducibile per mostrare ciò che fa:

library(raster) 
r <- raster(matrix(1:100, ncol=10), 0, 360, -90, 90, crs="+proj=merc") 
r2 <- rotate(r) 
r2 
# class  : RasterLayer 
# dimensions : 10, 10, 100 (nrow, ncol, ncell) 
# resolution : 36, 18 (x, y) 
# extent  : -180, 180, -90, 90 (xmin, xmax, ymin, ymax) 
# coord. ref. : +proj=merc 
# data source : in memory 
# names  : layer 
# values  : 1, 100 (min, max) 
+1

1+ È davvero RTM, ma a volte il compito cognitivo è interessante. Quando la tua risposta è apparsa, stavo tenendo i pollici e l'indice in un cerchio, alternativamente aprendoli tra i pollici e poi tra gli indici, e capendo mentalmente quale tipo di rimappatura era necessario per riportare correttamente i "180" opposti. –

+0

@BondedDust - Penso che la funzione necessaria per catturare quella rimappatura sia '((long + 180) %% 360) - 180'. La sua unica (in definitiva irrilevante) infelicità è che rimappa da 180 a -180 ... –

+0

A destra, le operazioni modulo definiscono un anello matematico. –

0

E 'piuttosto semplice:

ifelse(r0 > 180, -360 + r0, r0) 
+0

Non sono il tuo downvote, ma 179 e 181 sono due gradi l'una dall'altra in originale, in modo che dovrebbe probabilmente mappa a 179 e -179 dopo la trasformazione. Penso che tu voglia '-360 + r0'. – Gregor

+0

Scusa, ho dimenticato di menzionare che r0 è un file raster. quindi, la funzione ifelse non funziona in questo caso. – user1617676

1

Si tratta di una specie di hack e probabilmente c'è un modo molto più semplice di farlo in raster, ma qui è un'opzione. Per prima cosa, devi creare una matrice dal tuo oggetto raster, quindi modificare alcuni valori di longitudine (solo quelli che sono> 180) e tornare a un raster. Il pacchetto marmap può fare avanti e indietro di commutazione per voi:

# Switching from a raster to a matrix of class 'bathy' 
library(marmap) 
temp <- as.bathy(r0) 
summary(temp) 

# Changing the relevant longitude 
names <- as.numeric(row.names(temp)) 
names[names > 180] <- names[names > 180] - 360 

# Renaming the longitudes and switching back from a 'bathy' object to a raster 
rownames(temp) <- names 
r0.modified <- as.raster(temp)