Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[feature] add NetCDF format, fixes #11
- Loading branch information
1 parent
688dce5
commit 8e7fa75
Showing
12 changed files
with
242 additions
and
29 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,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 | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
/* | ||
MDAL - Mesh Data Abstraction Library (MIT License) | ||
Copyright (C) 2018 Peter Petrik (zilolv at gmail dot com) | ||
*/ | ||
|
||
#ifndef MDAL_GDAL_NETCDF_HPP | ||
#define MDAL_GDAL_NETCDF_HPP | ||
|
||
#include "mdal_gdal.hpp" | ||
#include "mdal_data_model.hpp" | ||
#include "mdal.h" | ||
#include <string> | ||
|
||
namespace MDAL | ||
{ | ||
|
||
class LoaderGdalNetCDF: public LoaderGdal | ||
{ | ||
public: | ||
LoaderGdalNetCDF( const std::string &netCDFFile ); | ||
private: | ||
std::string GDALFileName( const std::string &fileName ) override; | ||
bool parseBandInfo( const MDAL::GdalDataset *cfGDALDataset, | ||
const metadata_hash &metadata, std::string &band_name, | ||
double *time, bool *is_vector, bool *is_x | ||
) override; | ||
void parseGlobals( const metadata_hash &metadata ) override; | ||
|
||
//! delimiter to get time in hours | ||
double mTimeDiv; | ||
}; | ||
|
||
} // namespace MDAL | ||
#endif // MDAL_GDAL_NETCDF_HPP |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
/* | ||
MDAL - Mesh Data Abstraction Library (MIT License) | ||
Copyright (C) 2018 Peter Petrik (zilolv at gmail dot com) | ||
*/ | ||
#include "gtest/gtest.h" | ||
#include <string> | ||
#include <vector> | ||
|
||
//mdal | ||
#include "mdal.h" | ||
#include "mdal_testutils.hpp" | ||
|
||
TEST( MeshGdalNetCDFTest, Indonesia ) | ||
{ | ||
std::vector<std::string> files; | ||
files.push_back( "indonesia_nc3.nc" ); | ||
files.push_back( "indonesia_nc4.nc" ); | ||
for ( const std::string &file : files ) | ||
{ | ||
std::string path = test_file( std::string( "/netcdf/" ) + file ); | ||
MeshH m = MDAL_LoadMesh( path.c_str() ); | ||
ASSERT_NE( m, nullptr ); | ||
MDAL_Status s = MDAL_LastStatus(); | ||
EXPECT_EQ( MDAL_Status::None, s ); | ||
ASSERT_EQ( 2, MDAL_M_datasetGroupCount( m ) ); | ||
|
||
DatasetGroupH g = MDAL_M_datasetGroup( m, 1 ); | ||
ASSERT_NE( g, nullptr ); | ||
|
||
int meta_count = MDAL_G_metadataCount( g ); | ||
ASSERT_EQ( 1, meta_count ); | ||
|
||
const char *name = MDAL_G_name( g ); | ||
EXPECT_EQ( std::string( "Total cloud cover" ), std::string( name ) ); | ||
|
||
bool scalar = MDAL_G_hasScalarData( g ); | ||
EXPECT_EQ( true, scalar ); | ||
|
||
bool onVertices = MDAL_G_isOnVertices( g ); | ||
EXPECT_EQ( true, onVertices ); | ||
|
||
ASSERT_EQ( 31, MDAL_G_datasetCount( g ) ); | ||
DatasetH ds = MDAL_G_dataset( g, 10 ); | ||
ASSERT_NE( ds, nullptr ); | ||
|
||
bool valid = MDAL_D_isValid( ds ); | ||
EXPECT_EQ( true, valid ); | ||
|
||
bool active = MDAL_D_active( ds, 50 ); | ||
EXPECT_EQ( true, active ); | ||
|
||
int count = MDAL_D_valueCount( ds ); | ||
ASSERT_EQ( 234, count ); | ||
|
||
double value = MDAL_D_value( ds, 50 ); | ||
EXPECT_DOUBLE_EQ( 32759, value ); | ||
|
||
MDAL_CloseMesh( m ); | ||
} | ||
} | ||
|
||
int main( int argc, char **argv ) | ||
{ | ||
testing::InitGoogleTest( &argc, argv ); | ||
return RUN_ALL_TESTS(); | ||
} | ||
|
Oops, something went wrong.