2017-01-24 10 views
0

Я создаю файл NetCDF4, который в настоящее время имеет четыре переменные:Как указать размерные значения при создании файла NetCDF в Python?

1) Земля температура поверхности (3D массив - время, широта, долгота)

2) Долгота (1D - координата каждого пикселя центра)

3) Широта (1D - координата каждого пикселя центра)

4) время (время получения изображения в часах с момента 1900-01-01 00:00:00)

я в настоящее время с помощью следовать ING код, чтобы сделать это:

#==========================WRITE THE NETCDF FILE==========================# 

    newfile = nc.Dataset(export_filename, 'w', format = 'NETCDF4_CLASSIC') 


    #==========================SET FILE DIMENSIONS============================# 

    newfile.createDimension('lat', ny) 
    newfile.createDimension('lon', nx) 
    newfile.createDimension('time', len(filenames)) 


    #==========================SET GLOBAL ATTRIBUTES==========================# 

    newfile.title = ('Title') 
    newfile.history = "File created on " + datetime.strftime(datetime.today(), "%c") 
    newfile.Conventions = 'CF-1.6' 



    #==========================CREATE DATA VARIABLES==========================# 

    #--------------------------LST VARIABLE-----------------------------------# 

    LSTs = newfile.createVariable('LST', np.int16, ('time', 'lat', 'lon'), fill_value = -8000) 
    LSTs.units = 'Degrees C' 
    LSTs.add_offset = 273.15 
    LSTs.scale_factor = 0.01 
    LSTs.standard_name = 'LST' 
    LSTs.long_name = 'Land Surface Temperature' 
    LSTs.grid_mapping = 'latitude_longitude' 
    LSTs.coordinates = 'lon lat' 

    LSTs[:] = LSTd[:] 


    #--------------------------LON AND LAT AND TIME--------------------------# 

    LONGITUDEs = newfile.createVariable('LONGITUDE', np.float64, ('lon',)) 
    LONGITUDEs.units = 'Decimal Degrees East' 
    LONGITUDEs.standard_name = 'Longitude' 
    LONGITUDEs.long_name = 'Longitude' 
    LONGITUDEs[:] = LONd[:] 

    LATITUDEs = newfile.createVariable('LATITUDE', np.float64, ('lat',)) 
    LATITUDEs.units = 'Decimal Degrees North' 
    LATITUDEs.standard_name = 'Latitude' 
    LATITUDEs.long_name = 'Latitude' 
    LATITUDEs[:] = LATd[:] 

    TIMEs = newfile.createVariable('TIME', np.int32, ('time',)) 
    TIMEs.units = 'hours since 1900-01-01 00:00:00' 
    TIMEs.standard_name = 'Time' 
    TIMEs.long_name = 'Time of Image Acquisition' 
    TIMEs.axis = 'T' 
    TIMEs.calendar = 'gregorian' 
    TIMEs[:] = time[:] 

    #--------------------------SAVE THE FILE---------------------------------# 

    newfile.close(); 

Этот код создает файл NetCDF с переменной температурой поверхности земли, имеющей 24 полос (по одному на каждый час дня). Этот код работает так, как я хотел, хотя бы одну небольшую проблему, к которой я хочу обратиться. Когда я бегу gdalinfo для LST переменной, я получаю (это сокращенный вариант):

Band 1..... 
... 
NETCDF_DIM_TIME = 1 
... 

Я хочу, чтобы это значение 1, чтобы быть установлен такой же, как «время» переменной (которая является чем-то вроде 1081451 часы с 1900-01-01 00:00:00), которые я включил в мой код выше. Поэтому я хочу понять, как это можно изменить для каждой группы в файле?

ОБНОВЛЕНИЕ НА ВОПРОС: Когда я gdalinfo на файл (опять же, подмножество):

NETCDF_DIM_EXTRA={time} 
NETCDF_DIM_time_DEF={24,3} 

но есть вариант отсутствует «NETCDF_DIM_time_VALUES», и мне нужно, чтобы установить это время переменная, и она должна работать. КАК Я ДЕЛАТЬ ЭТО?

В настоящее время он устанавливается только на номер группы, но я хочу, чтобы он содержал информацию о времени его приобретения.

UPDATE 1:

Я попытался указать

LSTs.NETCDF_DIM_Time = time 

во время формирования файла NetCDF и это присвоила все значения времени на NETCDF_DIM_TIME в GDAL так, что каждая группа имеет 24 раз а не только один.

UPDATE 2:

При некотором рытье я думаю, что это метаданные NETCDF_DIM_time_VALUES, который должен быть установлен в переменной «время». Я обновил свой вопрос, чтобы спросить, как это сделать.

ответ

1

Переменные, связанные с размерами, должны иметь то же имя, что и размеры. Таким образом, в приведенном выше коде замените строчную переменную строку следующим образом:

TIMEs = newfile.createVariable('time', np.int32, ('time',)) 

сейчас gdalinfo знает где искать данные.Я побежал ваш код, используя фиктивные раз [1000000, 1000024] и библиотеки GDAL информация возвращается:

Band1... 
... 
NETCDF_DIM_time=1000000  
... 
Band2... 
... 
NETCDF_DIM_time=1000024 
... 

Чтобы ответить на ваш вопрос в заголовке: Вы не можете присвоить значения измерения, но вы можете иметь переменную с тем же именем, измерение, которое содержит данные/значения, связанные с измерением. Читатели файлов netcdf, такие как gdal, ищут соглашения, подобные этому, для интерпретации данных. См., Например, Unidata's 'Writing NetCDF Files: Best Practices' 'Coordinate Systems'