2014-09-08 3 views
6

Долголетие в климатических данных климата CMIP5 составляет 0 - 360 градусов. Как я могу преобразовать его в -180 - 180 градусов, используя растровый пакет?как конвертировать долготу от 0 - 360 до -180 - 180

Я пробовал с shift(r0,-180) и shift(r0,-360). Это не работает. Любая помощь будет оценена. r0 вот растровый.

ответ

11

Try rotate(). Его страница помощи даже упоминает его полезность, с типом данных, которые вы имеете дело с:

Поворот растровый * объект, который имеет координаты х (долгота) от 0 до 360, в стандартных координатах между -180 и 180 градусов. Долгота между 0 и 360 часто используется в данных глобальных моделей .

Вот простой воспроизводимый пример, чтобы показать, что он делает:

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+ Это действительно RTM, но иногда когнитивная задача интересна. Когда появился ваш ответ, я держал большие пальцы и указательный палец по кругу, поочередно открывая их между большими пальцами, а затем между указательными пальцами и мысленно выясняя, какое переназначение необходимо было для правильного соединения противоположных «180-х». –

+0

@BondedDust - Я думаю, что функция, необходимая для захвата этого переназначения, равна '((long + 180) %% 360) - 180'. Его единственная (в конечном счете несущественная) неправомерность заключается в том, что она переназначает значение от 180 до -180 ... –

+0

Право, операции по модулю определяют математическое кольцо. –

0

Это довольно просто:

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

Я не твой downvote, но 179 и 181 находятся два градуса друг от друга в оригинале, так что они, вероятно, следует сопоставить 179 и -179 после преобразования. Я думаю, вы хотите '-360 + r0'. – Gregor

+0

Извините, я забыл упомянуть, что r0 - это растровый файл. поэтому функция ifelse в этом случае не работает. – user1617676

1

Это своего рода хак, и там, наверное, гораздо более простой способ сделать это в raster, но вот вариант. Во-первых, вам нужно создать матрицу из вашего растрового объекта, а затем изменить некоторые значения долготы (только те, что есть> 180) и вернуться к растровому. Пакет marmap может сделать назад и вперед переключение для вас:

# 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) 
Смежные вопросы