2014-09-08 23 views
6

CMIP5 gelecekteki iklim verilerindeki boylam 0 - 360 derecede. Raster paketini kullanarak -180 - 180 dereceye nasıl dönüştürebilirim?boylamı 0 - 360 - -180 - 180 arası çevirme

shift(r0,-180) ve shift(r0,-360) ile denedim. İşe yaramıyor. Herhangi bir yardım takdir edilecektir. r0 burada bir raster.

cevap

11

rotate() deneyin: marmap paket sizin için anahtarlama ileri geri ve yapabilirsiniz. Onun yardım sayfası bile uğraşıyoruz verilerin türüne ile programı bahseder:

döndürün Bir Raster * -180 ila 180 standart koordinatlara 360 0 dan x koordinatları (boylam) sahiptir nesne derece. iklim modellerinden elde edilen verilerde 0 ile 360 ​​arası boylam kullanılmaktadır. İşte

ne yaptığını göstermek için basit bir tekrarlanabilir örnek: Ben senin downvote değilim

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+ Bu gerçekten RTM, ancak bazen bilişsel görev ilginç. Cevabınız göründüğünde, başparmağım ve işaret parmağımı bir daire içinde tuttuğumda, dönüşümlü olarak başparmaklar arasında ve daha sonra önbilgiler arasında açıldı ve zıt bir şekilde "180'lerin" geri bir araya getirilmesi için ne tür bir yeniden eşleşmenin gerekli olduğunu zihinsel olarak belirledim. –

+0

@BondedDust - Bu yeniden yakalamayı yakalamak için gereken işlevin ((% + 180) %% 360) - 180 'olduğunu düşünüyorum. Tek (nihai olarak sonuçsuz) infelisitesi, 180 ile -180 ... –

+0

arasında bir düzeltme yapmasıdır. Doğru, modulo işlemleri matematiksel bir halka tanımlar. –

0

Oldukça basit:

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

ancak 179 ve 181 orijinal iki derece aralıklı olarak, yani muhtemelen 179 eşleşmelidir ve -179 dönüşümden sonra. Bence -360 + r0' istiyorsun. – Gregor

+0

Üzgünüm, r0'ın bir raster dosyası olduğunu belirtmeyi unutmuşum. öyleyse, ifelse işlevi bu durumda çalışmaz. – user1617676

1

Bu hack türüdür ve raster yılında bunu yapmak çok daha kolay bir yolu muhtemelen var, ama burada bir seçenektir. Öncelikle, raster nesnesinizden bir matris oluşturmanız, ardından bazı boylam değerlerini değiştirmeniz (sadece 180 olanı) ve raster'e geri dönmeniz gerekir.

# 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) 
İlgili konular