-
Notifications
You must be signed in to change notification settings - Fork 48
/
mdal_gdal_netcdf.cpp
79 lines (68 loc) · 2.21 KB
/
mdal_gdal_netcdf.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
MDAL - Mesh Data Abstraction Library (MIT License)
Copyright (C) 2018 Peter Petrik (zilolv at gmail dot com)
*/
#include "mdal_gdal_netcdf.hpp"
#include "mdal_utils.hpp"
MDAL::LoaderGdalNetCDF::LoaderGdalNetCDF( const std::string &netCDFFile )
: MDAL::LoaderGdal( netCDFFile, "GRIB" )
, mTimeDiv( 1.0 )
{
}
std::string MDAL::LoaderGdalNetCDF::GDALFileName( const std::string &fileName )
{
#ifdef WIN32
// Force usage of the predefined GDAL driver
// http://gis.stackexchange.com/a/179167
// on Windows, HDF5 driver is checked before NETCDF driver in GDAL
return "NETCDF:\"" + fileName + "\"";
#else
return fileName;
#endif
}
bool MDAL::LoaderGdalNetCDF::parseBandInfo( const MDAL::GdalDataset *cfGDALDataset, const MDAL::LoaderGdal::metadata_hash &metadata, std::string &band_name, double *time, bool *is_vector, bool *is_x )
{
MDAL_UNUSED( cfGDALDataset );
metadata_hash::const_iterator iter;
iter = metadata.find( "netcdf_dim_time" );
if ( iter == metadata.end() ) return true; //FAILURE, skip no-time bands
*time = parseMetadataTime( iter->second ) / mTimeDiv;
// NAME
iter = metadata.find( "long_name" );
if ( iter == metadata.end() )
{
iter = metadata.find( "netcdf_varname" );
if ( iter == metadata.end() ) return true; //FAILURE, should be always present
band_name = iter->second;
}
else
{
band_name = iter->second;
}
// Loop throught all additional dimensions but time
for ( iter = metadata.begin(); iter != metadata.end(); ++iter )
{
std::string key = iter->first;
if ( MDAL::contains( key, "netcdf_dim_" ) )
{
key = MDAL::replace( key, "netcdf_dim_", "" );
if ( key != "time" )
{
band_name += "_" + key + ":" + iter->second;
}
}
}
// Parse X, Y components if present
parseBandIsVector( band_name, is_vector, is_x );
return false; // SUCCESS
}
void MDAL::LoaderGdalNetCDF::parseGlobals( const MDAL::LoaderGdal::metadata_hash &metadata )
{
metadata_hash::const_iterator iter = metadata.find( "time#units" );
if ( iter != metadata.end() )
{
std::string units = iter->second;
mTimeDiv = MDAL::parseTimeUnits( units );
// TODO store reference time from iter->second too, see crayfish_netcdf.cpp
}
}