Когда вам в руки попадает неведомый вам файл геоданных, первое, что вы должны сделать, это использовать утилиту GDAL для ознакомления с этим форматом и что содержит конкретный файл:
В формате NetCDF любят хранить данные метеорологи, гидрологи и модельеры-экологи, т.ч. этот формат достаточно распространен и нужно уметь с ним работать. К тому же работа с ним в целом аналогична работе с HDF. Помоему, QGIS умеет открывать его как и какой-нибудь TIF, хотя чтобы чего-нибудь не напутать (особенно с размерностями) лучше использовать GDAL напрямую.
Возьмем, к примеру, файл проекта MERRA содержащий среднесуточную температуру на высоте 2 метра и посмотрим, что нам выдаст gdalinfo.
Код: Выделить всё
Warning 1: No UNIDATA NC_GLOBAL:Conventions attribute
Driver: netCDF/Network Common Data Format
Files: MERRA2_100.statD_2d_slv_Nx.19800102.nc4.nc
Size is 576, 361
Coordinate System is `'
Origin = (-180.312500000000000,90.250000000000000)
Pixel Size = (0.625000000000000,-0.500000000000000)
Metadata:
lat#CLASS=DIMENSION_SCALE
lat#fullnamepath=/lat
lat#long_name=latitude
lat#NAME=lat
lat#origname=lat
lat#units=degrees_north
lat#valid_range={-9.9999999e+14,9.9999999e+14}
lat#vmax=9.9999999e+14
lat#vmin=-9.9999999e+14
lat#_Netcdf4Dimid=1
lon#CLASS=DIMENSION_SCALE
lon#fullnamepath=/lon
lon#long_name=longitude
lon#NAME=lon
lon#origname=lon
lon#units=degrees_east
lon#valid_range={-9.9999999e+14,9.9999999e+14}
lon#vmax=9.9999999e+14
lon#vmin=-9.9999999e+14
lon#_Netcdf4Dimid=0
NC_GLOBAL#HDF5_GLOBAL.Comment=GMAO filename: d5124_m2_jan79.statD_2d_slv_Nx.19800102.nc4
NC_GLOBAL#HDF5_GLOBAL.Contact=http://gmao.gsfc.nasa.gov
NC_GLOBAL#HDF5_GLOBAL.Conventions=CF-1
NC_GLOBAL#HDF5_GLOBAL.DataResolution=0.5 x 0.625
NC_GLOBAL#HDF5_GLOBAL.EasternmostLongitude=179.375
NC_GLOBAL#HDF5_GLOBAL.Filename=MERRA2_100.statD_2d_slv_Nx.19800102.nc4
NC_GLOBAL#HDF5_GLOBAL.Format=NetCDF-4/HDF-5
NC_GLOBAL#HDF5_GLOBAL.GranuleID=MERRA2_100.statD_2d_slv_Nx.19800102.nc4
NC_GLOBAL#HDF5_GLOBAL.History=Original file generated: Sat May 31 18:44:33 2014 GMT
NC_GLOBAL#HDF5_GLOBAL.identifier_product_doi=10.5067/9SC1VNTWGWV3
NC_GLOBAL#HDF5_GLOBAL.identifier_product_doi_authority=http://dx.doi.org/
NC_GLOBAL#HDF5_GLOBAL.Institution=NASA Global Modeling and Assimilation Office
NC_GLOBAL#HDF5_GLOBAL.LatitudeResolution=0.5
NC_GLOBAL#HDF5_GLOBAL.LongitudeResolution=0.625
NC_GLOBAL#HDF5_GLOBAL.LongName=MERRA2 statD_2d_slv_Nx: 2d,Daily,Aggregated Statistics,Single-Level,Assimilation,Single-Level Diagnostics
NC_GLOBAL#HDF5_GLOBAL.nco_openmp_thread_number=1
NC_GLOBAL#HDF5_GLOBAL.NorthernmostLatitude=90.0
NC_GLOBAL#HDF5_GLOBAL.ProductionDateTime=Original file generated: Sat May 31 18:44:33 2014 GMT
NC_GLOBAL#HDF5_GLOBAL.RangeBeginningDate=1980-01-02
NC_GLOBAL#HDF5_GLOBAL.RangeBeginningTime=00:00:00.000000
NC_GLOBAL#HDF5_GLOBAL.RangeEndingDate=1980-01-02
NC_GLOBAL#HDF5_GLOBAL.RangeEndingTime=23:59:59.000000
NC_GLOBAL#HDF5_GLOBAL.References=http://gmao.gsfc.nasa.gov
NC_GLOBAL#HDF5_GLOBAL.ShortName=M2SDNXSLV
NC_GLOBAL#HDF5_GLOBAL.Source=CVS tag: GEOSadas-5_12_4
NC_GLOBAL#HDF5_GLOBAL.SouthernmostLatitude=-90.0
NC_GLOBAL#HDF5_GLOBAL.SpatialCoverage=global
NC_GLOBAL#HDF5_GLOBAL.TemporalRange=1980-01-01 -> 2016-12-31
NC_GLOBAL#HDF5_GLOBAL.Title=MERRA2 statD_2d_slv_Nx: 2d,Daily,Aggregated Statistics,Single-Level,Assimilation,Single-Level Diagnostics
NC_GLOBAL#HDF5_GLOBAL.VersionID=5.12.4
NC_GLOBAL#HDF5_GLOBAL.WesternmostLongitude=-180.0
NETCDF_DIM_EXTRA={time}
NETCDF_DIM_time_DEF={1,4}
NETCDF_DIM_time_VALUES=690
T2MMEAN#fmissing_value=9.9999999e+14
T2MMEAN#fullnamepath=/T2MMEAN
T2MMEAN#long_name=2-meter_air_temperature
T2MMEAN#missing_value=9.9999999e+14
T2MMEAN#origname=T2MMEAN
T2MMEAN#standard_name=2-meter_air_temperature
T2MMEAN#units=K
T2MMEAN#valid_range={-9.9999999e+14,9.9999999e+14}
T2MMEAN#vmax=9.9999999e+14
T2MMEAN#vmin=-9.9999999e+14
T2MMEAN#_FillValue=9.9999999e+14
T2MMEAN#_Netcdf4Dimid=2
time#begin_date=19800102
time#begin_time=3000
time#CLASS=DIMENSION_SCALE
time#fullnamepath=/time
time#long_name=time
time#NAME=time
time#origname=time
time#time_increment=240000
time#time_interval=24
time#units=minutes since 1980-01-02 00:30:00
time#valid_range={-9.9999999e+14,9.9999999e+14}
time#vmax=9.9999999e+14
time#vmin=-9.9999999e+14
time#_Netcdf4Dimid=2
Corner Coordinates:
Upper Left (-180.3125000, 90.2500000)
Lower Left (-180.3125000, -90.2500000)
Upper Right ( 179.6875000, 90.2500000)
Lower Right ( 179.6875000, -90.2500000)
Center ( -0.3125000, 0.0000000)
Band 1 Block=576x1 Type=Float32, ColorInterp=Undefined
NoData Value=999999986991104
Unit Type: K
Metadata:
fmissing_value=9.9999999e+14
fullnamepath=/T2MMEAN
long_name=2-meter_air_temperature
missing_value=9.9999999e+14
NETCDF_DIM_time=690
NETCDF_VARNAME=T2MMEAN
origname=T2MMEAN
standard_name=2-meter_air_temperature
units=K
valid_range={-9.9999999e+14,9.9999999e+14}
vmax=9.9999999e+14
vmin=-9.9999999e+14
_FillValue=9.9999999e+14
_Netcdf4Dimid=2
Как видно тут у нас полная информация о проекции, разрешении, слоях и их атрибутах. NetCDF может содержать несколько слоев, по этому нужно внимательно посмотреть документацию и вывод gdalinfo, чтобы понять, что именно вам нужно.
В нашем случае, файл содержит всего один канал (переменная Band 1 в выводе gdalinfo). Далее нас интересует название переменной, которую мы хотим экстрагировать (NETCDF_VARNAME). В случае с температурой на высоте 2-х метров это NETCDF_VARNAME=T2MMEAN. Поскольку растр находится в географической системе координат, то логично и вывести его в этой системе. До сих пор имел дело лишь с данными глобального охвата находящимися в этой системе. Возможно, в некоторых случаях придется дополнительно напрячься с настройкой целевой системы координат. Итак, экстрагируем конкретный слой c помощью утилиты gdalwarp:
Код: Выделить всё
gdalwarp -of GTiff -t_srs EPSG:4326 \
netCDF:"MERRA2_100.statD_2d_slv_Nx.19800102.nc4.nc":T2MMEAN output.tif
Где
-of GTiff -- формат выходного файла
-t_srs EPSG:4326 -- целевая система координат (в данном случае +proj=longlat +datum=WGS84 +no_defs)
далее идет конструкция тип_файла:название_файла:название_слоя
может быть и так: тип_файла:название_файла:название_набора:название_слоя (это все смотрим в выводе gdalinfo)
output.tif -- путь и название выходного файла TIF
Вот и все.
Еще: всегда следите за размерностью выходного файла!
С NetCDF проблем не припомню, а вот с похожим форматом GRIB были проблемы -- GDAL без разрешения переводил все размерности в систему СИ, при этом в метафайл прописывались исходные размерности. Например, он преобразовывал градусы Кельвина в градусы Цельсия, а в метаданных оставлял Кельвины! Сейчас вроде этот глюк исправили, но я с той поры стал страховаться и заперщать GDAL самовольно менять размерности. Для GRIB это делается с помощью флага GRIB_NORMALIZE_UNITS=NO.