2017-01-24 10 views
0

I은 ​​네 개의 변수를 갖는 NetCDF4 파일 생성하고 :Python에서 NetCDF 파일을 만들 때 치수 값을 지정하는 방법은 무엇입니까?

1) 토양 표면 온도 (3D 어레이 - 시간, 위도, 경도)

2) 경도 (1D - 각 화소의 중심의 좌표)

3) 위도 (1D는 -) 각각의 화소 센터의 Y 좌표

4) 시간 (1900-01-01 0시 0분 0초)

보낸 시간에서의 화상 취득의 시간 I는 현재 사용하고있는 따르다 코드를 보내고 것은 이렇게하려면 :

#==========================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(); 

이 코드는 24 개 밴드를 갖는 랜드 표면 온도 변수 (하루의 시간마다 하나)와 netCDF의 파일을 생성한다. 이 코드는 제가 해결하고자하는 하나의 작은 문제 임에도 불구하고 작동합니다.

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

내가 1이 값이 1,081,451 같은 인 '시간'변수 (과 동일하게 설정해야 할 : 나는 LST 변수에 대한 gdalinfo를 실행하면, 내가 얻을 (이 감소 된 버전입니다) 1900-01-01 00:00:00 이후로) 위의 코드에 포함되어 있습니다. 따라서 파일의 각 밴드에 대해 이것이 어떻게 변경 될 수 있는지 알고 싶습니까?에 의문을

업데이트 : 파일에 gdalinfo 않으면 (다시, 부분 집합) :

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

하지만 거기 NETCDF_DIM_time_VALUES를 '없는 옵션이고 나는 시간으로 설정해야합니다 변수와 그것을 작동합니다. 어떻게해야합니까?

현재 밴드 번호가 설정되어 있지만 수집 시간과 관련된 정보가 포함되기를 바랍니다.

업데이트 1 : 나는 netCDF의 파일을 형성하는 동안

LSTs.NETCDF_DIM_Time = time 

을 지정하는 데 노력하고 각 밴드는 24 시간을 가질 수 있도록이 GDAL에 NETCDF_DIM_TIME 시간에서 모든 값을 할당 한

값이 아니라 하나.

업데이트 2 : 내가 생각하는 몇 가지 더 파고와

는 '시간'변수로 설정 될 필요가 NETCDF_DIM_time_VALUES 메타 데이터입니다. 어떻게해야하는지 묻는 질문을 업데이트했습니다.

답변

1

차원과 연결된 변수의 이름은 차원과 동일해야합니다. 따라서 위의 코드에서 다음과 같이 변수 행을 변경하십시오.

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

이제 gdalinfo는 데이터를 찾을 위치를 알고 있습니다.

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

는 제목의 질문에 대답하기 : 당신은 치수 값을 할당 할 수 있지만 같은 이름의 변수를 가질 수 있습니다 나는 반환 코드를 사용하여 더미 번 [1000000, 1000024] 및 GDAL 정보를 실행 차원과 관련된 데이터/값을 보유하는 차원입니다. gdal과 같은 netcdf 파일을 읽는 사용자는 데이터를 해석하기 위해 이와 같은 규칙을 찾습니다. 예를 들어 Unidata's 'Writing NetCDF Files: Best Practices' 'Coordinate Systems'