将GeoTIFF栅格的时间序列打包为单个NetCDF文件

时间:2015-11-19 15:18:53

标签: python regex gdal netcdf geotiff

我尝试将this solution用于我的图像堆栈,但我没有查看数据!!

我认为问题可能来自 pat ,它使用 regex 从文件路径中提取年份和月份。

所有数据都在名为 data_sample 的文件夹中,以下是文件名称:

R20060111_075725___SIG0__ASAWS___M1VVD_TUW_SGRT15A00_AF075M_E060N054T6.tif
R20060114_080443___SIG0__ASAWS___M1VVD_TUW_SGRT15A00_AF075M_E060N054T6.tif
R20060117_081036___SIG0__ASAWS___M1VVD_TUW_SGRT15A00_AF075M_E060N054T6.tif
R20060118_073857___SIG0__ASAWS___M1VVD_TUW_SGRT15A00_AF075M_E060N054T6.tif

输出是:

dimensions:
    lon = 8000 ;
    lat = 8000 ;
    time = UNLIMITED ; // (0 currently)
variables:
    float time(time) ;
        time:units = "days since 2006-01-11 00:00:00" ;
        time:standard_name = "time" ;
    float lon(lon) ;
        lon:standard_name = "longitude" ;
    float lat(lat) ;
        lat:standard_name = "latitude" ;
    int crs ;
        crs:long_name = "Lon/Lat Coords in WGS84" ;
        crs:grid_mapping_name = "latitude_longitude" ;
        crs:longitude_of_prime_meridian = 0. ;
        crs:semi_major_axis = 6378137. ;
        crs:inverse_flattening = 298.257223563 ;
    short tmn(time, lat, lon) ;
        tmn:_FillValue = -9999s ;
        tmn:units = "degC" ;
        tmn:scale_factor = 0.01 ;
        tmn:add_offset = 0. ;
        tmn:long_name = "minimum monthly temperature" ;
        tmn:standard_name = "air_temperature" ;
        tmn:grid_mapping = "crs" ;

// global attributes:
        :Conventions = "CF-1.6" ;
}

这是我编辑的代码(@ rich-signell)

import numpy as np
import datetime as dt
import os
import gdal
import netCDF4
import re

ds = gdal.Open('/data_sample/R20060111_075725___SIG0__ASAWS___M1VVD_TUW_SGRT15A00_AF075M_E060N054T6.tif')

a = ds.ReadAsArray()
nlat, nlon = np.shape(a)

b = ds.GetGeoTransform()  # bbox, interval
lon = np.arange(nlon)*b[1]+b[0]
lat = np.arange(nlat)*b[5]+b[3]

basedate = dt.datetime(2006, 01, 11, 0, 0, 0)

# Create NetCDF file
nco = netCDF4.Dataset('time_series.nc', 'w', clobber=True)

chunk_lon = 16
chunk_lat = 16
chunk_time = 12

# Create dimensions, variables and attributes:
nco.createDimension('lon', nlon)
nco.createDimension('lat', nlat)
nco.createDimension('time', None)

timeo = nco.createVariable('time', 'f4', ('time',))
timeo.units = 'days since 2006-01-11 00:00:00'
timeo.standard_name = 'time'

lono = nco.createVariable('lon', 'f4', ('lon',))
lono.standard_name = 'longitude'

lato = nco.createVariable('lat', 'f4', ('lat',))
lato.standard_name = 'latitude'

# Create container variable for CRS: lon/lat WGS84 datum
crso = nco.createVariable('crs', 'i4')
crso.long_name = 'Lon/Lat Coords in WGS84'
crso.grid_mapping_name = 'latitude_longitude'
crso.longitude_of_prime_meridian = 0.0
crso.semi_major_axis = 6378137.0
crso.inverse_flattening = 298.257223563

# Create short integer variable for temperature data, with chunking
tmno = nco.createVariable('tmn', 'i2',  ('time', 'lat', 'lon'),
                          zlib=True, chunksizes=[chunk_time,
                                                 chunk_lat,
                                                 chunk_lon],
                          fill_value=-9999)
tmno.units = 'degC'
tmno.scale_factor = 0.01
tmno.add_offset = 0.00
tmno.long_name = 'minimum monthly temperature'
tmno.standard_name = 'air_temperature'
tmno.grid_mapping = 'crs'
tmno.set_auto_maskandscale(False)

nco.Conventions = 'CF-1.6'

# Write lon,lat
lono[:] = lon
lato[:] = lat

pat = re.compile('(\w{1})(\d{4})(\d{2})(\d{2})_\d{6}')
itime = 0

# Step through data, writing time and data to NetCDF
for root, dirs, files in os.walk('/data_sample/'):
    dirs.sort()
    files.sort()
    for f in files:
        if re.match(pat, f):
            # read the time values by parsing the filename
            year = int(f[4:8])
            mon = int(f[8:10])
            date = dt.datetime(year, mon, 1, 0, 0, 0)
            print(date)
            dtime = (date-basedate).total_seconds()/86400.
            timeo[itime] = dtime
            # min temp
            tmn_path = os.path.join(root, f)
            print(tmn_path)
            tmn = gdal.Open(tmn_path)
            a = tmn.ReadAsArray()  # data
            tmno[itime, :, :] = a
            itime = itime+1

nco.close()

有人知道哪里可能有问题吗? 谢谢

0 个答案:

没有答案