2016-02-24 3 views
0

Я пытаюсь импортировать файл netCDF в RasterBrick в R. Файл netCDF имеет 3 размера.Измените размеры RasterBrick от TXY до XYT

library(ncdf) 
nc <- open.ncdf("fm100_2003.nc"); 
print(nc) 
[1] "file fm100_2003.nc has 3 dimensions:" 
[1] "lon Size: 1386" 
[1] "lat Size: 585" 
[1] "day Size: 365" 
[1] "------------------------" 
[1] "file fm100_2003.nc has 1 variables:" 
[1] "short dead_fuel_moisture_100hr[day,lon,lat] Longname:dead_fuel_moisture_100hr Missval:-9999" 

Размер дня соответствует ежедневной влажности топлива в течение одного года (365 дней). Я хотел бы импортировать их в RasterBrick для дополнительного анализа, который довольно прост с,

r <- "fm100_2003.nc" 
b <- brick(r,varname="dead_fuel_moisture_100hr") 

Однако проблема в том, что ncol и nlayers в RasterBrick переключены, что приводит к неправильному rasterLayer для каждого слой в кирпиче. Размеры RasterBrick следует читать 1386, 585, 505890, 365 вместо размеров ниже:

class  : RasterBrick 
dimensions : 1386, 365, 505890, 585 (nrow, ncol, ncell, nlayers) 
resolution : 1, 0.04166667 (x, y) 
extent  : 37619.5, 37984.5, -124.793, -67.043 (xmin, xmax, ymin, ymax) 
coord. ref. : NA 
data source : fm100_2003.nc 
names  : X49.3960227966309, X49.3543561299642, X49.3126894632975, X49.2710227966309, X49.2293561299642, X49.1876894632975, X49.1460227966309, X49.1043561299642, X49.0626894632975, X49.0210227966309, X48.9793561299642, X48.9376894632975, X48.8960227966309, X48.8543561299642, X48.8126894632975, ... 
degrees_north: 25.0626894632975, 49.3960227966309 (min, max) 
varname  : dead_fuel_moisture_100hr 

Я интересно, если есть способ указать размеры при создании RasterBrick, чтобы избежать этой проблемы?

ответ

0

мне удалось выяснить решение (или, возможно, обойти) к этой задаче.

Я сначала импортирую файл netCDF в массив в R.

dname <- "dead_fuel_moisture_100hr" 
array1 <- get.var.ncdf(nc, dname) 
dim(array1) 
[1] 365 1386 585 

Размеры массива 1: дни, столбцы, строки. Однако я могу изменить размеры массива:

array2<-aperm(array1, c(3, 2, 1)) 
dim(array2) 
[1] 585 1386 365 

Теперь массив организован правильно: строки, столбцы, дни. На данный момент я могу получить доступ диапазон глубины мне нужно (дни с 1 по 365) в качестве матрицы:

fm.day.001<-array2[,,1] 
... 
fm.day.365<-array2[,,365] 

Матрица может быть преобразован в растр тоже:

r2<-raster(nrow=585,ncol=1386,vals=fm.day.001, xmn=-124.7722, xmx=-67.06383, ymn=25.06269, ymx=49.39602) 
0

Это довольно странно, почему измерение неверно. Вы можете изучить файл ncdf, используя некоторые команды ниже:

# Open your dimension 
# following by '$' you can use tab to see the next available command (R Studio) 
r$dim 

# REad value for each dimension 
lon = get.var.ncdf(r, varid='lon') 
lat = get.var.ncdf(r, varid='lat') 
time = get.var.ncdf(r, varid='day') 
+0

Спасибо @Eko. Я могу изучить файл ncdf, и размеры выглядят правильно. Хотя, я думаю, что в вашем примере код будет выглядеть следующим образом: lon = get.var.ncdf (nc, varid = 'lon') –

0

Вы можете попробовать dims аргумент. Что-то вроде:

b <- brick("fm100_2003.nc", varname="dead_fuel_moisture_100hr", dims=3:1) 

Это экспериментальный. Даже если он создает правильный объект, объект может не работать для последующих операций.

+0

Спасибо за вход @RobertH. Кажется, что ваш код создает правильный объект, растровщик, но строки и столбцы по-прежнему переключаются на 1386 строк, 585 столбцов. Возможно, это связано с форматом этих данных netCDF? Именно это и поставило меня с самого начала. –

Смежные вопросы