From 562c5b128e302ed09e7e75ea9cfceba08c7c93d7 Mon Sep 17 00:00:00 2001 From: Cyrille Valladeau <cyrille.valladeau@c-s.fr> Date: Fri, 5 Jun 2009 18:32:51 +0200 Subject: [PATCH] BUG : QB metadata file correction (2 file format) --- Testing/Code/IO/CMakeLists.txt | 7 + .../Code/IO/otbImageMetadataInterfaceTest.cxx | 4 +- .../include/ossim/base/ossimFileParser.h | 46 +++ .../src/ossim/base/ossimFileParser.cpp | 62 ++++ .../support_data/ossimQuickbirdMetaData.cpp | 322 +++++++++--------- 5 files changed, 280 insertions(+), 161 deletions(-) create mode 100644 Utilities/otbossim/include/ossim/base/ossimFileParser.h create mode 100644 Utilities/otbossim/src/ossim/base/ossimFileParser.cpp diff --git a/Testing/Code/IO/CMakeLists.txt b/Testing/Code/IO/CMakeLists.txt index eaebb85c81..551267f3ea 100755 --- a/Testing/Code/IO/CMakeLists.txt +++ b/Testing/Code/IO/CMakeLists.txt @@ -1893,6 +1893,13 @@ ADD_TEST(ioTvImageMetadataInterfaceQBTest ${IO_TESTS17} ${LARGEDATA}/TOULOUSE/QuickBird/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF ${TEMP}/ioTvImageMetadataInterfaceQB.txt ) +ADD_TEST(ioTvImageMetadataInterfaceQBCevennesTest ${IO_TESTS17} + --compare-ascii 0 ${BASELINE_FILES}/ioTvImageMetadataInterfaceQBCevennes.txt + ${TEMP}/ioTvImageMetadataInterfaceQBCevennes.txt + otbImageMetadataInterfaceTest + ${LARGEDATA}/CEVENNES/06FEB12104912-P1BS-005533998070_01_P001.TIF + ${TEMP}/ioTvImageMetadataInterfaceQBCevennes.txt +) ADD_TEST(ioTvImageMetadataInterfaceIKONOSTest ${IO_TESTS17} --compare-ascii 0 ${BASELINE_FILES}/ioTvImageMetadataInterfaceIKONOS.txt ${TEMP}/ioTvImageMetadataInterfaceIKONOS.txt diff --git a/Testing/Code/IO/otbImageMetadataInterfaceTest.cxx b/Testing/Code/IO/otbImageMetadataInterfaceTest.cxx index d4d84e2905..e8f5f4051f 100644 --- a/Testing/Code/IO/otbImageMetadataInterfaceTest.cxx +++ b/Testing/Code/IO/otbImageMetadataInterfaceTest.cxx @@ -41,10 +41,8 @@ int otbImageMetadataInterfaceTest (int argc, char* argv[]) ImageReaderType::Pointer reader = ImageReaderType::New(); reader->SetFileName( inputFilename ); reader->UpdateOutputInformation(); - otb::ImageMetadataInterface::Pointer lImageMetadata = otb::ImageMetadataInterface::New(); - std::ofstream file; file.open(outputFilename); @@ -56,7 +54,7 @@ int otbImageMetadataInterfaceTest (int argc, char* argv[]) file<<"GetYear: "<<lImageMetadata->GetYear(reader->GetOutput()->GetMetaDataDictionary())<<std::endl; file<<"GetSolarIrradiance: "<<lImageMetadata->GetSolarIrradiance(reader->GetOutput()->GetMetaDataDictionary())<<std::endl; file<<"GetSunElevation: "<<lImageMetadata->GetSunElevation(reader->GetOutput()->GetMetaDataDictionary())<<std::endl; - + file<<"GetSunAzimuth: "<<lImageMetadata->GetSunAzimuth(reader->GetOutput()->GetMetaDataDictionary())<<std::endl; file.close(); return EXIT_SUCCESS; diff --git a/Utilities/otbossim/include/ossim/base/ossimFileParser.h b/Utilities/otbossim/include/ossim/base/ossimFileParser.h new file mode 100644 index 0000000000..f4a0e75b51 --- /dev/null +++ b/Utilities/otbossim/include/ossim/base/ossimFileParser.h @@ -0,0 +1,46 @@ +//******************************************************************* +// +// License: LGPL +// +// See LICENSE.txt file in the top level directory for more details. +// +// Class declaration for ossimFileParser. +// +// This class provides tools for parsinf a file. +// +//******************************************************************** +// $Id: ossimFileParser.h 14412 2009-04-27 16:58:46Z dburken $ + +#ifndef ossimFileParser_HEADER +#define ossimFileParser_HEADER + +#include <iosfwd> + +#include <ossim/base/ossimObject.h> +#include <ossim/base/ossimString.h> + +class ossimFilename; + + +class OSSIMDLLEXPORT ossimFileParser : public ossimObject +{ +public: + + /** @brief default constructor */ + ossimFileParser(); + + /** virtual destructor */ + virtual ~ossimFileParser(); + + + bool getEndOfLine( char * fileBuf, ossimString lineBeginning, char * format, ossimString & name ); + + bool getEndOfLine( char * fileBuf, ossimString lineBeginning, char * format, ossim_float64 & value); + + + + +TYPE_DATA +}; + +#endif /* #ifndef ossimFileParser_HEADER */ diff --git a/Utilities/otbossim/src/ossim/base/ossimFileParser.cpp b/Utilities/otbossim/src/ossim/base/ossimFileParser.cpp new file mode 100644 index 0000000000..7c2d2b69ec --- /dev/null +++ b/Utilities/otbossim/src/ossim/base/ossimFileParser.cpp @@ -0,0 +1,62 @@ +//******************************************************************* +// +// License: LGPL +// +// See LICENSE.txt file in the top level directory for more details. +// +// Class declaration for ossimFileParser. +// +// This class parses a Space Imaging Quickbird meta data file. +// +//******************************************************************** +// $Id: ossimFileParser.h 14412 2009-04-27 16:58:46Z dburken $ + +#include <ossim/base/ossimFileParser.h> +#include <ossim/base/ossimTrace.h> +#include <iostream> + +RTTI_DEF1(ossimFileParser, "ossimFileParser", ossimObject); + +static ossimTrace traceExec ("ossimFileParser:exec"); +static ossimTrace traceDebug ("ossimFileParser:debug"); + +ossimFileParser::ossimFileParser() +{ +} + +ossimFileParser::~ossimFileParser() +{ +} + +bool ossimFileParser::getEndOfLine( char * fileBuf, ossimString lineBeginning, char * format, ossimString & name) + { + char * res = strstr(fileBuf, lineBeginning.c_str()); + if (!res) + { + return false; + } + fileBuf = res; + + char dummy[80], nameChar[80]; + sscanf(res, format, dummy, nameChar); + name = ossimString(nameChar); + + return true; + } + + bool getEndOfLine( char * fileBuf, ossimString lineBeginning, char * format, ossim_float64 & value) +{ + char * res = strstr(fileBuf, lineBeginning.c_str()); + if (!res) + { + return false; + } + fileBuf = res; + + char dummy[80], nameChar[80]; + sscanf(res, format, dummy, nameChar); + value = ossimString(nameChar).toFloat64(); + + return true; +} + diff --git a/Utilities/otbossim/src/ossim/support_data/ossimQuickbirdMetaData.cpp b/Utilities/otbossim/src/ossim/support_data/ossimQuickbirdMetaData.cpp index f35cf3f159..51e21ec878 100755 --- a/Utilities/otbossim/src/ossim/support_data/ossimQuickbirdMetaData.cpp +++ b/Utilities/otbossim/src/ossim/support_data/ossimQuickbirdMetaData.cpp @@ -20,6 +20,8 @@ #include <ossim/base/ossimNotify.h> #include <ossim/base/ossimKeywordNames.h> #include <ossim/base/ossimTrace.h> +#include <ossim/base/ossimFileParser.h> + RTTI_DEF1(ossimQuickbirdMetaData, "ossimQuickbirdMetaData", ossimObject); @@ -44,28 +46,28 @@ ossimQuickbirdMetaData::~ossimQuickbirdMetaData() bool ossimQuickbirdMetaData::open(const ossimFilename& imageFile) { - static const char MODULE[] = "ossimQuickbirdMetaData::open"; + static const char MODULE[] = "ossimQuickbirdMetaData::open"; - clearFields(); + clearFields(); - //retrieve information from the metadata file - //if the Quickbird tif is 02APR01105228-M1BS-000000128955_01_P001.TIF - //the metadata file will be 02APR01105228-M1BS-000000128955_01_P001.IMD + //retrieve information from the metadata file + //if the Quickbird tif is 02APR01105228-M1BS-000000128955_01_P001.TIF + //the metadata file will be 02APR01105228-M1BS-000000128955_01_P001.IMD - ossimFilename metadatafile = imageFile; - metadatafile.setExtension(ossimString("IMD")); + ossimFilename metadatafile = imageFile; + metadatafile.setExtension(ossimString("IMD")); - if( parseMetaData(metadatafile) == false ) - { + if( parseMetaData(metadatafile) == false ) + { if(traceDebug()) - { - ossimNotify(ossimNotifyLevel_WARN) - << MODULE << " errors parsing metadata" << std::endl; - } + { + ossimNotify(ossimNotifyLevel_WARN) + << MODULE << " errors parsing metadata" << std::endl; + } return false; - } + } - return true; + return true; } void ossimQuickbirdMetaData::clearFields() @@ -74,7 +76,7 @@ void ossimQuickbirdMetaData::clearFields() theBandId = "Unknown"; theSatID = "Unknown"; theTLCDate = "Unknown", - theSunAzimuth = 0.0; + theSunAzimuth = 0.0; theSunElevation = 0.0; } @@ -96,7 +98,7 @@ std::ostream& ossimQuickbirdMetaData::print(std::ostream& out) const } bool ossimQuickbirdMetaData::saveState(ossimKeywordlist& kwl, - const char* prefix)const + const char* prefix)const { @@ -115,12 +117,12 @@ bool ossimQuickbirdMetaData::saveState(ossimKeywordlist& kwl, theBandId, true); - kwl.add(prefix, + kwl.add(prefix, "sat_id", theSatID, true); - kwl.add(prefix, + kwl.add(prefix, "tlc_date", theTLCDate, true); @@ -140,7 +142,7 @@ bool ossimQuickbirdMetaData::saveState(ossimKeywordlist& kwl, } bool ossimQuickbirdMetaData::loadState(const ossimKeywordlist& kwl, - const char* prefix) + const char* prefix) { clearFields(); @@ -149,51 +151,51 @@ bool ossimQuickbirdMetaData::loadState(const ossimKeywordlist& kwl, lookup = kwl.find(prefix, ossimKeywordNames::TYPE_KW); if (lookup) - { - s = lookup; - if(s != "ossimQuickbirdMetaData") - { - return false; - } - } + { + s = lookup; + if(s != "ossimQuickbirdMetaData") + { + return false; + } + } lookup = kwl.find(prefix, "generation_date"); if (lookup) - { - theGenerationDate = lookup; - } + { + theGenerationDate = lookup; + } lookup = kwl.find(prefix, "band_id"); if (lookup) - { - theBandId = lookup; - } + { + theBandId = lookup; + } lookup = kwl.find(prefix, "sat_id"); if (lookup) - { - theSatID = lookup; - } + { + theSatID = lookup; + } lookup = kwl.find(prefix, "tlc_date"); if (lookup) - { - theTLCDate= lookup; - } + { + theTLCDate= lookup; + } lookup = kwl.find(prefix, ossimKeywordNames::AZIMUTH_ANGLE_KW); if (lookup) - { - s = lookup; - theSunAzimuth = s.toFloat64(); - } + { + s = lookup; + theSunAzimuth = s.toFloat64(); + } lookup = kwl.find(prefix, ossimKeywordNames::ELEVATION_ANGLE_KW); if (lookup) - { - s = lookup; - theSunElevation = s.toFloat64(); - } + { + s = lookup; + theSunElevation = s.toFloat64(); + } return true; } @@ -207,27 +209,26 @@ bool ossimQuickbirdMetaData::loadState(const ossimKeywordlist& kwl, bool ossimQuickbirdMetaData::parseMetaData(const ossimFilename& data_file) { if (traceExec()) - { - ossimNotify(ossimNotifyLevel_DEBUG) + { + ossimNotify(ossimNotifyLevel_DEBUG) << "DEBUG ossimQuickbirdRpcModel::parseMetaData(data_file): entering..." << std::endl; - } + } FILE* fptr = fopen (data_file, "r"); if (!fptr) - { - if (traceDebug()) { - ossimNotify(ossimNotifyLevel_DEBUG) - << "ossimQuickbirdRpcModel::parseMetaData(data_file) DEBUG:" - << "\nCould not open Meta data file: " << data_file - << "\nreturning with error..." << std::endl; + if (traceDebug()) + { + ossimNotify(ossimNotifyLevel_DEBUG) + << "ossimQuickbirdRpcModel::parseMetaData(data_file) DEBUG:" + << "\nCould not open Meta data file: " << data_file + << "\nreturning with error..." << std::endl; + } + return false; } - return false; - } char* strptr; - // char linebuf[80]; char dummy[80], name[80]; double value; @@ -237,142 +238,147 @@ bool ossimQuickbirdMetaData::parseMetaData(const ossimFilename& data_file) ossim_int32 fileSize = static_cast<ossim_int32>(data_file.fileSize()); char* filebuf = new char[fileSize]; fread(filebuf, 1, fileSize, fptr); + strptr = filebuf; fclose(fptr); + ossimFileParser parser; + ossimString temp; //--- // Generation time: //--- - strptr = strstr(filebuf, "\ngenerationTime ="); - if (!strptr) - { - if(traceDebug()) + if(parser.getEndOfLine( strptr, ossimString("\ngenerationTime ="), "%17c %s", temp)) + theGenerationDate = ossimString(temp).before(";"); + else { - ossimNotify(ossimNotifyLevel_FATAL) - << "FATAL ossimQuickbirdRpcModel::parseMetaData(data_file): " - << "\n\tAborting construction. Error encountered parsing " - << "presumed meta-data file." << std::endl; - - delete [] filebuf; - return false; + if(traceDebug()) + { + ossimNotify(ossimNotifyLevel_FATAL) + << "FATAL ossimQuickbirdRpcModel::parseMetaData(data_file): " + << "\n\tAborting construction. Error encountered parsing " + << "presumed meta-data file." << std::endl; + + delete [] filebuf; + return false; + } } - } - - sscanf(strptr, "%17c %s", dummy, name); - theGenerationDate = ossimString(name).before(";"); - //--- // BandId: //--- - strptr = strstr(filebuf, "\nbandId ="); - if (!strptr) - { - if(traceDebug()) + if(parser.getEndOfLine( strptr, ossimString("\nbandId ="), "%9c %s", temp)) + theBandId = ossimString(temp).after("\"").before("\";"); + else { - ossimNotify(ossimNotifyLevel_FATAL) - << "FATAL ossimQuickbirdRpcModel::parseMetaData(data_file): " - << "\n\tAborting construction. Error encountered parsing " - << "presumed meta-data file." << std::endl; - - delete [] filebuf; - return false; + if(traceDebug()) + { + ossimNotify(ossimNotifyLevel_FATAL) + << "FATAL ossimQuickbirdRpcModel::parseMetaData(data_file): " + << "\n\tAborting construction. Error encountered parsing " + << "presumed meta-data file." << std::endl; + + delete [] filebuf; + return false; + } } - } - - sscanf(strptr, "%9c %s", dummy, name); - theBandId = ossimString(name).after("\"").before("\";"); //--- // SatID: //--- - strptr = strstr(filebuf, "\n\tsatId ="); - if (!strptr) - { - if(traceDebug()) + if(parser.getEndOfLine( strptr, ossimString("\n\tsatId ="), "%9c %s", temp)) + theSatID = ossimString(temp).after("\"").before("\";"); + else { - ossimNotify(ossimNotifyLevel_FATAL) - << "FATAL ossimQuickbirdRpcModel::parseMetaData(data_file): " - << "\n\tAborting construction. Error encountered parsing " - << "presumed meta-data file." << std::endl; - - delete [] filebuf; - return false; + if(traceDebug()) + { + ossimNotify(ossimNotifyLevel_FATAL) + << "FATAL ossimQuickbirdRpcModel::parseMetaData(data_file): " + << "\n\tAborting construction. Error encountered parsing " + << "presumed meta-data file." << std::endl; + + delete [] filebuf; + return false; + } } - } - sscanf(strptr, "%9c %s", dummy, name); - theSatID = ossimString(name).after("\"").before("\";"); + //--- // TLCTime: //--- - strptr = strstr(filebuf, "\n\tTLCTime ="); - if (!strptr) - { - if(traceDebug()) + if(parser.getEndOfLine( strptr, ossimString("\n\tTLCTime ="), "%11c %s", temp)) + theTLCDate = ossimString(temp).before("\";"); + else { - ossimNotify(ossimNotifyLevel_FATAL) - << "FATAL ossimQuickbirdRpcModel::parseMetaData(data_file): " - << "\n\tAborting construction. Error encountered parsing " - << "presumed meta-data file." << std::endl; - - delete [] filebuf; - return false; + if(traceDebug()) + { + ossimNotify(ossimNotifyLevel_FATAL) + << "FATAL ossimQuickbirdRpcModel::parseMetaData(data_file): " + << "\n\tAborting construction. Error encountered parsing " + << "presumed meta-data file." << std::endl; + + delete [] filebuf; + return false; + } } - } - sscanf(strptr, "%11c %s", dummy, name); - theTLCDate = ossimString(name).before("\";"); - - //*** - // Sun Azimuth: - //*** - strptr = strstr(strptr, "\n\tsunAz ="); - if (!strptr) - { - if(traceDebug()) - { - ossimNotify(ossimNotifyLevel_FATAL) - << "FATAL ossimQuickbirdRpcModel::parseMetaData(data_file): " - << "\n\tAborting construction. Error encountered parsing " - << "presumed meta-data file." << std::endl; - delete [] filebuf; - return false; - } - } - sscanf(strptr, "%9c %s", dummy, name); - theSunAzimuth = ossimString(name).before(";").toFloat64();; - - //*** - // Sun Elevation: - //*** - strptr = strstr(strptr, "\n\tsunEl ="); - if (!strptr) - { - if(traceDebug()) - { - ossimNotify(ossimNotifyLevel_FATAL) - << "FATAL ossimQuickbirdRpcModel::parseMetaData(data_file): " - << "\n\tAborting construction. Error encountered parsing " - << "presumed meta-data file." << std::endl; - delete [] filebuf; - return false; + //*** + // Sun Azimuth: + //*** + if(parser.getEndOfLine( strptr, ossimString("\n\tsunAz ="), "%9c %s", temp)) + theSunAzimuth = ossimString(temp).before(";").toFloat64(); + else + { + if(parser.getEndOfLine( strptr, ossimString("\n\tmeanSunAz ="), "%13c %s", temp)) + theSunAzimuth = ossimString(temp).before(";").toFloat64(); + else + { + if(traceDebug()) + { + ossimNotify(ossimNotifyLevel_FATAL) + << "FATAL ossimQuickbirdRpcModel::parseMetaData(data_file): " + << "\n\tAborting construction. Error encountered parsing " + << "presumed meta-data file." << std::endl; + + delete [] filebuf; + return false; + } + } } - } - sscanf(strptr, "%9c %s", dummy, name); - theSunElevation = ossimString(name).before(";").toFloat64(); + //*** + // Sun Elevation: + //*** + if(parser.getEndOfLine( filebuf, ossimString("\n\tsunEl ="), "%9c %s", temp)) + theSunElevation = ossimString(temp).before(";").toFloat64(); + else + { + if(parser.getEndOfLine( filebuf, ossimString("\n\tmeanSunEl ="), "%13c %s", temp)) + theSunElevation = ossimString(temp).before(";").toFloat64(); + else + { + if(traceDebug()) + { + ossimNotify(ossimNotifyLevel_FATAL) + << "FATAL ossimQuickbirdRpcModel::parseMetaData(data_file): " + << "\n\tAborting construction. Error encountered parsing " + << "presumed meta-data file." << std::endl; + + delete [] filebuf; + return false; + } + } + } delete [] filebuf; filebuf = 0; if (traceExec()) - { - ossimNotify(ossimNotifyLevel_DEBUG) + { + ossimNotify(ossimNotifyLevel_DEBUG) << "DEBUG ossimQuickbirdRpcModel::parseMetaData(data_file): returning..." << std::endl; - } + } return true; } -- GitLab