std::unique_ptr<MDAL::Mesh> MDAL::LoaderGdal::load( MDAL_Status *status ) { if ( status ) *status = MDAL_Status::None ; mPafScanline = nullptr; mMesh.reset(); try { registerDriver(); // some formats like NETCFD has data stored in subdatasets std::vector<std::string> subdatasets = parseDatasetNames( mFileName ); // First parse ALL datasets/bands to gather vector quantities // if case they are splitted in different subdatasets for ( auto iter = subdatasets.begin(); iter != subdatasets.end(); ++iter ) { std::string gdal_dataset_name = *iter; // Parse dataset parameters and projection MDAL::GdalDataset *cfGDALDataset = new MDAL::GdalDataset; cfGDALDataset->init( gdal_dataset_name ); if ( !mMesh ) { // If it is first dataset, create mesh from it gdal_datasets.push_back( cfGDALDataset ); // Init memory for data reader mPafScanline = new double [cfGDALDataset->mXSize]; // Create mMesh createMesh(); // Parse bands parseRasterBands( cfGDALDataset ); } else if ( meshes_equals( meshGDALDataset(), cfGDALDataset ) ) { gdal_datasets.push_back( cfGDALDataset ); // Parse bands parseRasterBands( cfGDALDataset ); } else { // Do not use delete cfGDALDataset; } } // Create MDAL datasets addDatasetGroups(); } catch ( MDAL_Status error ) { if ( status ) *status = ( error ); mMesh.reset(); } for ( auto it = gdal_datasets.begin(); it != gdal_datasets.end(); ++it ) { delete ( *it ); } gdal_datasets.clear(); if ( mPafScanline ) delete[] mPafScanline; // do not allow mesh without any valid datasets if ( mMesh && ( mMesh->datasetGroups.empty() ) ) { if ( status ) *status = MDAL_Status::Err_InvalidData; mMesh.reset(); } return std::unique_ptr<Mesh>( mMesh.release() ); }
std::unique_ptr<MDAL::Mesh> MDAL::DriverGdal::load( const std::string &fileName, MDAL_Status *status ) { mFileName = fileName; if ( status ) *status = MDAL_Status::None ; mPafScanline = nullptr; mMesh.reset(); try { registerDriver(); // some formats like NETCFD has data stored in subdatasets std::vector<std::string> subdatasets = parseDatasetNames( mFileName ); // First parse ALL datasets/bands to gather vector quantities // if case they are splitted in different subdatasets for ( auto iter = subdatasets.begin(); iter != subdatasets.end(); ++iter ) { std::string gdal_dataset_name = *iter; // Parse dataset parameters and projection std::shared_ptr<MDAL::GdalDataset> cfGDALDataset = std::make_shared<MDAL::GdalDataset>(); cfGDALDataset->init( gdal_dataset_name ); if ( !mMesh ) { // If it is first dataset, create mesh from it gdal_datasets.push_back( cfGDALDataset ); // Init memory for data reader mPafScanline = new double [cfGDALDataset->mXSize]; // Create mMesh createMesh(); // Parse bands parseRasterBands( cfGDALDataset.get() ); } else if ( meshes_equals( meshGDALDataset(), cfGDALDataset.get() ) ) { gdal_datasets.push_back( cfGDALDataset ); // Parse bands parseRasterBands( cfGDALDataset.get() ); } } // Fix consistency of groups // It can happen that we thought that the // group is vector based on name, but it could be just coicidence // or clash in naming fixRasterBands(); // Create MDAL datasets addDatasetGroups(); } catch ( MDAL_Status error ) { if ( status ) *status = ( error ); mMesh.reset(); } gdal_datasets.clear(); if ( mPafScanline ) delete[] mPafScanline; // do not allow mesh without any valid datasets if ( mMesh && ( mMesh->datasetGroups.empty() ) ) { if ( status ) *status = MDAL_Status::Err_InvalidData; mMesh.reset(); } return std::unique_ptr<Mesh>( mMesh.release() ); }