将netcdf重新投影为正弦投影

时间:2019-02-07 10:49:46

标签: python python-3.x numpy gis python-xarray

我想将一个全局文件切成与modis磁贴相对应的多个netcdf文件。

随着时间的推移,我目前拥有GLOBAL netcdf文件的目录。

注意:ERA临时数据位于常规纬度/经度网格上。

  

经度的范围是0到360,在地理坐标系中等于-180到+180。 LINK

这是我当前目录的外观:

ERAIN_SFC00_6H_10mWind.nc  ERAIN_SFC00_6H_2mtemperature.nc  ERAIN_SFC00_6H_TCW-O3.nc

我想要的是正弦波投影上的一组文件,每个MODIS磁贴一个文件。像这样:

ERAIN_SFC00_6H_TCW-O3_h07v06.nc  ERAIN_SFC00_6H_TCW-O3_h24v03.nc         ERAIN_SFC00_6H_10mWind_H15V05.nc  ERAIN_SFC00_6H_10mWind_H31V06.nc
ERAIN_SFC00_6H_TCW-O3_h08v03.nc  ERAIN_SFC00_6H_TCW-O3_h24v04.nc         ERAIN_SFC00_6H_10mWind_H15V07.nc  ERAIN_SFC00_6H_10mWind_H31V07.nc
ERAIN_SFC00_6H_TCW-O3_h08v04.nc  ERAIN_SFC00_6H_TCW-O3_h24v05.nc         ERAIN_SFC00_6H_10mWind_H16V05.nc  ERAIN_SFC00_6H_10mWind_H31V08.nc
ERAIN_SFC00_6H_TCW-O3_h08v05.nc  ERAIN_SFC00_6H_TCW-O3_h24v06.nc         ERAIN_SFC00_6H_10mWind_H16V06.nc  ERAIN_SFC00_6H_10mWind_H31V09.nc
ERAIN_SFC00_6H_TCW-O3_h08v06.nc  ERAIN_SFC00_6H_TCW-O3_h24v07.nc         ERAIN_SFC00_6H_10mWind_H16V07.nc  ERAIN_SFC00_6H_10mWind_H31V10.nc
ERAIN_SFC00_6H_TCW-O3_h08v07.nc  ERAIN_SFC00_6H_TCW-O3_h25v02.nc         ERAIN_SFC00_6H_10mWind_H16V08.nc  ERAIN_SFC00_6H_10mWind_H31V11.nc
ERAIN_SFC00_6H_TCW-O3_h09v02.nc  ERAIN_SFC00_6H_TCW-O3_h25v03.nc         ERAIN_SFC00_6H_10mWind_H17V02.nc  ERAIN_SFC00_6H_10mWind_H31V12.nc

伪代码

1. Convert the files to sinusoidal projection
2. determine the extent of the MODIS tiles
3. chop the MODIS tile extents and save as new netCDF

我绝对不知道a)如何转换为正弦投影b)如何切碎莫迪斯瓷砖。

我从已经存在的modis netcdf文件中创建了这些切片范围。我不知道它们是否准确(是否有定义MODIS瓷砖的官方资料?),但是它们有价值。

数据

EXAMPLE DATA HERE

import xarray as xr

ds = xr.open_dataset('ERA_test.nc')
ds

Out[]:
<xarray.Dataset>
Dimensions:        (lat: 256, lon: 512, time: 5)
Coordinates:
  * lon            (lon) float64 0.0 0.7031 1.406 ... -2.109 -1.406 -0.7031
  * lat            (lat) float64 89.46 88.77 88.07 ... -88.07 -88.77 -89.46
  * time           (time) datetime64[ns] 2008-01-02 ... 2008-01-03
Data variables:
    temperature2m  (time, lat, lon) float32 ...
Attributes:
    content:  ERA INTERIM data of var167; converted from grb to netCDF with C...
    history:

图块范围

import pickle

tiles = pickle.load(open('tile_extents.pkl','rb'))
tiles['h16v06']

Out[]:
{'lon_min': -23.09401076758503,
 'lon_max': -10.641777724759121,
 'lat_min': 20.0,
 'lat_max': 30.0}

转换为正弦投影

这是我真的不知道该怎么做的那个。我想我已经从pyproj找到了MODIS投影。

import pyproj as Proj

p_modis_grid = Proj('+proj=sinu +R=6371007.181 +nadgrids=@null +wktext')

但是如何使用它来重新投影netCDF数据?很高兴知道我使用的工具是否错误。 rasterio会更适合吗?还是NCO / CDO?

感谢您的帮助。

当前的最佳猜测。

因此,这似乎改变了投影,但同时也弄乱了所有尺寸。我认为这是一个起点,但是从这里开始呢?

gdalwarp -t_srs "+proj=sinu +R=6371007.181 +nadgrids=@null +wktext" ERA_test.nc out.nc
$ ncdump -h out.nc

netcdf out {
dimensions:
    x = 512 ;
    y = 256 ;
variables:
    short Band1(y, x) ;
        Band1:long_name = "GDAL Band Number 1" ;
        Band1:_FillValue = -32767s ;
        Band1:grid_mapping = "sinusoidal" ;
        Band1:units = "K" ;
    short Band2(y, x) ;
        Band2:long_name = "GDAL Band Number 2" ;
        Band2:_FillValue = -32767s ;
        Band2:grid_mapping = "sinusoidal" ;
        Band2:units = "K" ;
    short Band3(y, x) ;
        Band3:long_name = "GDAL Band Number 3" ;
        Band3:_FillValue = -32767s ;
        Band3:grid_mapping = "sinusoidal" ;
        Band3:units = "K" ;
    short Band4(y, x) ;
        Band4:long_name = "GDAL Band Number 4" ;
        Band4:_FillValue = -32767s ;
        Band4:grid_mapping = "sinusoidal" ;
        Band4:units = "K" ;
    short Band5(y, x) ;
        Band5:long_name = "GDAL Band Number 5" ;
        Band5:_FillValue = -32767s ;
        Band5:grid_mapping = "sinusoidal" ;
        Band5:units = "K" ;
    char sinusoidal ;
        sinusoidal:grid_mapping_name = "sinusoidal" ;
        sinusoidal:false_easting = 0. ;
        sinusoidal:false_northing = 0. ;
        sinusoidal:longitude_of_central_meridian = 0. ;
        sinusoidal:long_name = "CRS definition" ;
        sinusoidal:longitude_of_prime_meridian = 0. ;
        sinusoidal:semi_major_axis = 6371007.181 ;
        sinusoidal:inverse_flattening = 0. ;
        sinusoidal:spatial_ref = "PROJCS[\"unnamed\",GEOGCS[\"unnamed ellipse\",DATUM[\"unknown\",SPHEROID[\"unnamed\",6371007.181,0],EXTENSION[\"PROJ4_GRIDS\",\"@null\"]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]],PROJECTION[\"Sinusoidal\"],PARAMETER[\"longitude_of_center\",0],PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",0],EXTENSION[\"PROJ4\",\"+proj=sinu +R=6371007.181 +nadgrids=@null +wktext\"]]" ;
        sinusoidal:GeoTransform = "-360.3515625 0.7028340789935529 0 89.81365616296401 0 -0.7028340789935529 " ;
    double x(x) ;
        x:standard_name = "projection_x_coordinate" ;
        x:long_name = "x coordinate of projection" ;
        x:units = "m" ;
    double y(y) ;
        y:standard_name = "projection_y_coordinate" ;
        y:long_name = "y coordinate of projection" ;
        y:units = "m" ;

// global attributes:
        :Conventions = "CF-1.5" ;
        :GDAL = "GDAL 2.3.3, released 2018/12/14" ;
        :history = "Thu Feb 07 14:27:39 2019: GDAL Create( out.nc, ... )" ;
}

0 个答案:

没有答案