From 32f18cef85a4d5d406e91ebc83a47bcaaf27f05d Mon Sep 17 00:00:00 2001
From: Cyrille Valladeau <cyrille.valladeau@c-s.fr>
Date: Thu, 4 Jun 2009 17:22:21 +0200
Subject: [PATCH] ENH: Read Quickbird metadatas for Radiometric Calibration

---
 Code/IO/otbImageMetadataInterface.cxx         | 166 ++++++++++++++++--
 .../Code/IO/otbImageMetadataInterfaceTest.cxx |  26 ++-
 .../ossim/projection/ossimQuickbirdRpcModel.h |  19 +-
 .../support_data/ossimQuickbirdMetaData.h     |   9 +-
 .../projection/ossimQuickbirdRpcModel.cpp     |  76 +++++++-
 .../projection/ossimSensorModelFactory.cpp    |   1 -
 .../support_data/ossimQuickbirdMetaData.cpp   | 124 ++++++++-----
 7 files changed, 344 insertions(+), 77 deletions(-)
 mode change 100644 => 100755 Utilities/otbossim/include/ossim/support_data/ossimQuickbirdMetaData.h
 mode change 100644 => 100755 Utilities/otbossim/src/ossim/support_data/ossimQuickbirdMetaData.cpp

diff --git a/Code/IO/otbImageMetadataInterface.cxx b/Code/IO/otbImageMetadataInterface.cxx
index 9f3840debf..3cc538b61f 100644
--- a/Code/IO/otbImageMetadataInterface.cxx
+++ b/Code/IO/otbImageMetadataInterface.cxx
@@ -431,6 +431,30 @@ ImageMetadataInterface::VariableLengthVectorType
 	  outputValuesVariableLengthVector[0] = 1156.9;
 	}
     }
+    else if(IsQuickbird(dict))
+    {
+
+      std::string keyBId= "support_data.band_id";
+      ossimString keywordStringBId = kwl.find(keyBId.c_str());
+      if( keywordStringBId == ossimString("P") )
+      {  
+          outputValuesVariableLengthVector.SetSize(1);
+          outputValuesVariableLengthVector.Fill(1381.79);
+      }
+      else if(keywordStringBId == ossimString("Multi") )
+      {
+          outputValuesVariableLengthVector.SetSize(4);
+          outputValuesVariableLengthVector[0]=1924.59;
+          outputValuesVariableLengthVector[1]=1843.08;
+          outputValuesVariableLengthVector[2]=1574.77;
+          outputValuesVariableLengthVector[3]=1113.71;
+      }
+      else
+      {
+        itkExceptionMacro(<<"Invalid bandID "<<keywordStringBId);
+      }
+
+    }
 
 
   return outputValuesVariableLengthVector;
@@ -500,7 +524,7 @@ int ImageMetadataInterface::GetDay( const MetaDataDictionaryType & dict ) const
 
   if(IsQuickbird(dict))
   {
-    key = "support_data.generation_date";
+    key = "support_data.tlc_date";
     separatorList = "-T";
   }
 
@@ -509,10 +533,19 @@ int ImageMetadataInterface::GetDay( const MetaDataDictionaryType & dict ) const
   //std::string key= "support_data.image_date";
   std::vector<ossimString> keywordStrings = keywordString.split(separatorList);
   //assert(keywordStrings.size() > 2);
+
   if(keywordStrings.size() <= 2)
     itkExceptionMacro(<<"Invalid Day");
 
-  return keywordStrings[2].toInt();
+ ossimString day = keywordStrings[2];
+ if(IsIkonos(dict))
+  {
+      // MM/DD/YY
+     day = keywordStrings[1];
+ }
+
+
+  return day.toInt();
 }
 
 
@@ -545,7 +578,7 @@ int ImageMetadataInterface::GetMonth( const MetaDataDictionaryType & dict ) cons
 
   if(IsQuickbird(dict))
   {
-    key = "support_data.generation_date";
+    key = "support_data.tlc_date";
     separatorList = "-T";
   }
 
@@ -558,12 +591,17 @@ int ImageMetadataInterface::GetMonth( const MetaDataDictionaryType & dict ) cons
   if(keywordStrings.size() <= 2)
     itkExceptionMacro(<<"Invalid Month");
 
-  return keywordStrings[1].toInt();
+  ossimString month = keywordStrings[1];
+   if(IsIkonos(dict))
+  {
+    month = keywordStrings[0];
+  }
+
+  return month.toInt();
 }
 
 int ImageMetadataInterface::GetYear( const MetaDataDictionaryType & dict ) const
 {
-std::cout<<"ImageMetadataInterface::GetYear"<<std::endl;
   //The image date in the ossim metadata has the form: 2007-10-03T03:17:16.973000
   ImageKeywordlistType imageKeywordlist;
 
@@ -591,7 +629,7 @@ std::cout<<"ImageMetadataInterface::GetYear"<<std::endl;
 
   if(IsQuickbird(dict))
   {
-    key = "support_data.generation_date";
+    key = "support_data.tlc_date";
     separatorList = "-T";
   }
 
@@ -607,6 +645,7 @@ std::cout<<"ImageMetadataInterface::GetYear"<<std::endl;
 // For Ikonos 2002 is 02
  if(IsIkonos(dict))
   {
+      year = keywordStrings[2];
       year = "20"+year; 
   }
 
@@ -628,8 +667,6 @@ std::string ImageMetadataInterface::GetSensorID( const MetaDataDictionaryType &
   ossimString keywordString = kwl.find(key.c_str());
   std::string output(keywordString.chars());
 
-//std::cout<< "sensorID : "<<output<<std::endl;
-
   return output;
 }
 
@@ -794,21 +831,124 @@ ImageMetadataInterface::VariableLengthVectorType
 ImageMetadataInterface::VariableLengthVectorType
     ImageMetadataInterface::GetQuickbirdPhysicalBias( const MetaDataDictionaryType & dict ) const
 {
+  ImageKeywordlistType ImageKeywordlist;
+
+ if (dict.HasKey(MetaDataKey::OSSIMKeywordlistKey))
+  {
+    itk::ExposeMetaData<ImageKeywordlistType>(dict, MetaDataKey::OSSIMKeywordlistKey, ImageKeywordlist);
+  }  
+  ossimKeywordlist kwl;
+  ImageKeywordlist.convertToOSSIMKeywordlist(kwl);
+
   VariableLengthVectorType outputValuesVariableLengthVector;
-  outputValuesVariableLengthVector.SetSize(GetNumberOfBands(dict));
-  outputValuesVariableLengthVector.Fill(0.0);
+  std::string keyBId= "support_data.band_id";
+  ossimString keywordStringBId = kwl.find(keyBId.c_str());
+  if( keywordStringBId == ossimString("P") )
+  {  
+      outputValuesVariableLengthVector.SetSize(1);
+      outputValuesVariableLengthVector.Fill(0.0);
+  }
+  else if(keywordStringBId == ossimString("Multi") )
+  {
+      outputValuesVariableLengthVector.SetSize(4);
+      outputValuesVariableLengthVector.Fill(0.0);
+  }
+  else
+  {
+     itkExceptionMacro(<<"Invalid bandID "<<keywordStringBId);
+  }
 
   return outputValuesVariableLengthVector;
 }
 
 
 ImageMetadataInterface::VariableLengthVectorType
-    ImageMetadataInterface::GetQuickbirdPhysicalGain( const MetaDataDictionaryType & dict ) const
+ImageMetadataInterface::GetQuickbirdPhysicalGain( const MetaDataDictionaryType & dict ) const
 {
+   //Values are different pre/post 2003-06-06 production date, find out where we are
+  ImageKeywordlistType ImageKeywordlist;
+
+  if (dict.HasKey(MetaDataKey::OSSIMKeywordlistKey))
+  {
+    itk::ExposeMetaData<ImageKeywordlistType>(dict, MetaDataKey::OSSIMKeywordlistKey, ImageKeywordlist);
+  }
+  ossimKeywordlist kwl;
+  ImageKeywordlist.convertToOSSIMKeywordlist(kwl);
+  std::string key= "support_data.generation_date";
+  ossimString keywordString = kwl.find(key.c_str());
+  std::string output(keywordString.chars());
+
+  //The Ikonos production date has the format MM/DD/YY
+  ossimString separatorList = "-";
+  std::vector<ossimString> keywordStrings = keywordString.split(separatorList);
+  if (keywordStrings.size() < 3)
+  {
+    itkGenericExceptionMacro(<<"Could not retrieve the production date for Ikonos");
+  }
+
+  int productionYear = keywordStrings[0].toInt();
+  int productionMonth = keywordStrings[1].toInt();
+  int productionDay = keywordStrings[2].toInt();
+  bool isPost20030606 = false;
+  if(productionYear > 2003)
+    isPost20030606 = true;
+  else
+  {
+    if(productionYear == 2003)
+    {
+      if(productionMonth > 6) 
+        isPost20030606 = true;
+      else
+        if(productionDay >= 6) 
+          isPost20030606 = true;
+    }
+  }
+
+    //Value computed from
+  // http://www.geoeye.com/CorpSite/assets/docs/technical-papers/2009/IKONOS_Esun_Calculations.pdf
+  // to get the equivalent of the SPOT alpha
+  VariableLengthVectorType gain;
+  gain.SetSize(5);
+  if (isPost20030606)
+  {
+    gain[0] = 0.16200;//Pan
+    gain[1] = 0.23590;//Blue
+    gain[2] = 0.14530;//Green
+    gain[3] = 0.17850;//Red
+    gain[4] = 0.13530;//NIR
+  }
+  else
+  {
+    gain[0] = 1;//Pan
+    gain[1] = 1;//Blue
+    gain[2] = 1;//Green
+    gain[3] = 1;//Red
+    gain[4] = 1;//NIR
+  }
+
   VariableLengthVectorType outputValuesVariableLengthVector;
-  outputValuesVariableLengthVector.SetSize(GetNumberOfBands(dict));
-  outputValuesVariableLengthVector.Fill(0.0);
 
+  std::string keyBId= "support_data.band_id";
+  ossimString keywordStringBId = kwl.find(keyBId.c_str());
+  if (keywordStringBId == ossimString("P") )
+  {
+    outputValuesVariableLengthVector.SetSize(1);
+    outputValuesVariableLengthVector[0]=gain[0];
+  }
+  // Multi spectral
+  else if(keywordStringBId == ossimString("Multi") )
+  {
+      outputValuesVariableLengthVector.SetSize(4);
+      outputValuesVariableLengthVector[0]=gain[1];
+      outputValuesVariableLengthVector[1]=gain[2];
+      outputValuesVariableLengthVector[2]=gain[3];
+      outputValuesVariableLengthVector[3]=gain[4];
+  }
+  else
+  {
+     itkExceptionMacro(<<"Invalid bandID "<<keywordStringBId);
+  }
+  
   return outputValuesVariableLengthVector;
 }
 
diff --git a/Testing/Code/IO/otbImageMetadataInterfaceTest.cxx b/Testing/Code/IO/otbImageMetadataInterfaceTest.cxx
index fd37bb808b..6f4c27c171 100644
--- a/Testing/Code/IO/otbImageMetadataInterfaceTest.cxx
+++ b/Testing/Code/IO/otbImageMetadataInterfaceTest.cxx
@@ -23,30 +23,26 @@
 #include "itkExceptionObject.h"
 
 #include <iostream>
-//#include "otbVectorImage.h"
-//#include "otbImageFileReader.h"
-//#include "otbImageMetadataInterface.h"
-#include "support_data/ossimQuickbirdMetaData.h"
-#include "base/ossimFilename.h"
+#include "otbVectorImage.h"
+#include "otbImageFileReader.h"
+#include "otbImageMetadataInterface.h"
+//#include "support_data/ossimQuickbirdMetaData.h"
+//#include "base/ossimFilename.h"
 
 int otbImageMetadataInterfaceTest (int argc, char* argv[])
 {
-
-
   // Verify the number of parameters in the command line
   const char * inputFilename  = argv[1];
-/*
+std::cout<<"pffffffffffff????????,"<<std::endl;
   typedef otb::VectorImage< double,  2 >                 InputImageType;
   typedef otb::ImageFileReader< InputImageType >         ImageReaderType;
-
+  std::cout<<"ImageMetadataInterface????????,"<<std::endl;
   ImageReaderType::Pointer reader = ImageReaderType::New();
   reader->SetFileName( inputFilename  );
-//   reader->GenerateOutputInformation();
-
   reader->UpdateOutputInformation();
-
+  std::cout<<"ImageMetadataInterface"<<std::endl;
   otb::ImageMetadataInterface::Pointer lImageMetadata = otb::ImageMetadataInterface::New();
-
+  std::cout<<"GetSensorID"<<std::endl;
   std::cout<<"GetSensorID:        "<<lImageMetadata->GetSensorID(reader->GetOutput()->GetMetaDataDictionary())<<std::endl;
   std::cout<<"GetPhysicalGain:    "<<lImageMetadata->GetPhysicalGain(reader->GetOutput()->GetMetaDataDictionary())<<std::endl;
   std::cout<<"GetPhysicalBias:    "<<lImageMetadata->GetPhysicalBias(reader->GetOutput()->GetMetaDataDictionary())<<std::endl;
@@ -55,13 +51,13 @@ int otbImageMetadataInterfaceTest (int argc, char* argv[])
   std::cout<<"GetYear:            "<<lImageMetadata->GetYear(reader->GetOutput()->GetMetaDataDictionary())<<std::endl;
   std::cout<<"GetSolarIrradiance: "<<lImageMetadata->GetSolarIrradiance(reader->GetOutput()->GetMetaDataDictionary())<<std::endl;
   std::cout<<"GetSunElevation:    "<<lImageMetadata->GetSunElevation(reader->GetOutput()->GetMetaDataDictionary())<<std::endl;
-*/
 
+/*
 ossimQuickbirdMetaData * meataData = new ossimQuickbirdMetaData();
 meataData->open(ossimFilename(inputFilename));
 std::cout<<"TEST : OPEN DONE"<<std::endl;
 delete meataData;
-
+*/
   return EXIT_SUCCESS;
 
 }
diff --git a/Utilities/otbossim/include/ossim/projection/ossimQuickbirdRpcModel.h b/Utilities/otbossim/include/ossim/projection/ossimQuickbirdRpcModel.h
index 5ab7fc5031..a7be55846d 100644
--- a/Utilities/otbossim/include/ossim/projection/ossimQuickbirdRpcModel.h
+++ b/Utilities/otbossim/include/ossim/projection/ossimQuickbirdRpcModel.h
@@ -19,8 +19,10 @@
 #define ossimQuickbirdRpcModel_HEADER
 
 #include <ossim/projection/ossimRpcModel.h>
+#include <ossim/support_data/ossimQuickbirdMetaData.h>
 
 class ossimFilename;
+class ossimQuickbirdMetaData;
 
 /*!****************************************************************************
  *
@@ -32,7 +34,8 @@ class ossimQuickbirdRpcModel : public ossimRpcModel
 public:
    ossimQuickbirdRpcModel();
    ossimQuickbirdRpcModel(const ossimQuickbirdRpcModel& rhs);
-   
+   ~ossimQuickbirdRpcModel();
+
    virtual ossimObject* dup() const;
    virtual bool saveState(ossimKeywordlist& kwl,
                           const char* prefix=0) const;
@@ -44,11 +47,21 @@ public:
    
    
 protected:
+   //void finishConstruction();
+   void parseMetaData(const ossimFilename& metadata);
+   void parseRpcData (const ossimFilename& rpcdata);
 
    bool parseNitfFile(const ossimFilename& file);
    bool parseTiffFile(const ossimFilename& file);
-   
-   
+/*
+  ossimQuickbirdMetaData* getTheSupportData()
+  {
+    return theSupportData;
+  }
+*/
+   ossimQuickbirdMetaData* theSupportData;
+
+
 TYPE_DATA
 };
 
diff --git a/Utilities/otbossim/include/ossim/support_data/ossimQuickbirdMetaData.h b/Utilities/otbossim/include/ossim/support_data/ossimQuickbirdMetaData.h
old mode 100644
new mode 100755
index 896293879a..306c7f6de5
--- a/Utilities/otbossim/include/ossim/support_data/ossimQuickbirdMetaData.h
+++ b/Utilities/otbossim/include/ossim/support_data/ossimQuickbirdMetaData.h
@@ -92,6 +92,11 @@ public:
 
    bool parseEPHData(const ossimFilename& data_file);
 
+   ossimString getSatID()
+   {
+		return theSatID;
+   }
+
  /*****************************************
 *parseATTData EPH GEO IMD RPB TIL
 *
@@ -99,8 +104,10 @@ public:
    
 private:
 
-   ossimString   theGenerationTime;
+   ossimString   theGenerationDate;
    ossimString   theBandId;
+   ossimString   theSatID;
+   ossimString   theTLCDate;
    ossim_float64 theSunAzimuth;
    ossim_float64 theSunElevation;
    /*ossim_uint32  theNumBands;*/
diff --git a/Utilities/otbossim/src/ossim/projection/ossimQuickbirdRpcModel.cpp b/Utilities/otbossim/src/ossim/projection/ossimQuickbirdRpcModel.cpp
index 39449d77c7..2040ea9981 100644
--- a/Utilities/otbossim/src/ossim/projection/ossimQuickbirdRpcModel.cpp
+++ b/Utilities/otbossim/src/ossim/projection/ossimQuickbirdRpcModel.cpp
@@ -33,13 +33,29 @@ RTTI_DEF1(ossimQuickbirdRpcModel, "ossimQuickbirdRpcModel", ossimRpcModel);
 
 
 ossimQuickbirdRpcModel::ossimQuickbirdRpcModel()
-      :ossimRpcModel()
+      :ossimRpcModel(),
+      theSupportData(0)
 {
+   theSupportData = new ossimQuickbirdMetaData();
 }
 
 ossimQuickbirdRpcModel::ossimQuickbirdRpcModel(const ossimQuickbirdRpcModel& rhs)
       : ossimRpcModel(rhs)
 {
+//   if (theSupportData)
+//    {
+//       delete theSupportData;
+//   }
+//   *(theSupportData) = *(rhs.getTheSupportData());
+}
+
+ossimQuickbirdRpcModel::~ossimQuickbirdRpcModel()
+{
+   if (theSupportData)
+   {
+      delete theSupportData;
+      theSupportData = 0;
+   }
 }
 
 ossimObject* ossimQuickbirdRpcModel::dup() const
@@ -85,11 +101,32 @@ bool ossimQuickbirdRpcModel::parseNitfFile(const ossimFilename& file)
    ossimQuickbirdTile tileHdr;
    ossimFilename tileFile = file;
    ossimFilename rpcFile = file;
+   ossimFilename metadataFile = file;
 
    tileFile = tileFile.replaceAllThatMatch("_R[0-9]+C[0-9]+");
    rpcFile  = rpcFile.replaceAllThatMatch("_R[0-9]+C[0-9]+");
+   metadataFile = metadataFile.replaceAllThatMatch("_R[0-9]+C[0-9]+");
    bool useInternalRpcTags = false;
    
+   if ( !theSupportData )
+   {
+      theSupportData = new ossimQuickbirdMetaData();
+   }
+
+   metadataFile = metadataFile.setExtension("IMD");
+   if(!theSupportData->open(metadataFile))
+   {
+      metadataFile = metadataFile.setExtension("imd");
+      if(!theSupportData->open(tileFile))
+      {
+         return false;
+      }
+   }
+   else
+   {
+       theSensorID = theSupportData->getSatID();
+   }
+
    if(!hdr.open(rpcFile))
    {
       rpcFile = rpcFile.setExtension("RPB");
@@ -338,12 +375,35 @@ bool ossimQuickbirdRpcModel::parseTiffFile(const ossimFilename& file)
    
    ossimQuickbirdRpcHeader hdr;
    ossimQuickbirdTile tileHdr;
+
    ossimFilename tileFile = file;
    ossimFilename rpcFile = file;
+   ossimFilename metadataFile = file;
 
    tileFile = tileFile.replaceAllThatMatch("_R[0-9]+C[0-9]+");
    rpcFile  = rpcFile.replaceAllThatMatch("_R[0-9]+C[0-9]+");
-   
+   metadataFile = metadataFile.replaceAllThatMatch("_R[0-9]+C[0-9]+");
+
+   if ( !theSupportData )
+   {
+      theSupportData = new ossimQuickbirdMetaData();
+   }
+
+   metadataFile = metadataFile.setExtension("IMD");
+   if(!theSupportData->open(metadataFile))
+   {
+      metadataFile = metadataFile.setExtension("imd");
+      if(!theSupportData->open(tileFile))
+      {
+         return false;
+      }
+   }
+   else
+   {
+       theSensorID = theSupportData->getSatID();
+   }
+
+
    if(!hdr.open(rpcFile))
    {
       rpcFile = rpcFile.setExtension("RPB");
@@ -492,11 +552,23 @@ bool ossimQuickbirdRpcModel::parseTiffFile(const ossimFilename& file)
 bool ossimQuickbirdRpcModel::saveState(ossimKeywordlist& kwl,
                                        const char* prefix) const
 {
+ if(theSupportData)
+   {
+      ossimString supportPrefix = ossimString(prefix) + "support_data.";
+      theSupportData->saveState(kwl, supportPrefix);
+   }
+
    return ossimRpcModel::saveState(kwl, prefix);
 }
 
 bool ossimQuickbirdRpcModel::loadState(const ossimKeywordlist& kwl,
                                        const char* prefix)
 {
+ if(theSupportData)
+   {
+      ossimString supportPrefix = ossimString(prefix) + "support_data.";
+      theSupportData->loadState(kwl, supportPrefix);
+   }
+
    return ossimRpcModel::loadState(kwl, prefix);
 }
diff --git a/Utilities/otbossim/src/ossim/projection/ossimSensorModelFactory.cpp b/Utilities/otbossim/src/ossim/projection/ossimSensorModelFactory.cpp
index 7bfabb4000..a39002d97b 100644
--- a/Utilities/otbossim/src/ossim/projection/ossimSensorModelFactory.cpp
+++ b/Utilities/otbossim/src/ossim/projection/ossimSensorModelFactory.cpp
@@ -506,7 +506,6 @@ bool ossimSensorModelFactory::isTileMap(const ossimFilename& filename)const
   temp.downcase();
   if(temp.ext()=="otb")
   {
-    std::cout << "TileMap format "<<std::endl;
     return true;
   }
   return false;
diff --git a/Utilities/otbossim/src/ossim/support_data/ossimQuickbirdMetaData.cpp b/Utilities/otbossim/src/ossim/support_data/ossimQuickbirdMetaData.cpp
old mode 100644
new mode 100755
index 017100a061..f35cf3f159
--- a/Utilities/otbossim/src/ossim/support_data/ossimQuickbirdMetaData.cpp
+++ b/Utilities/otbossim/src/ossim/support_data/ossimQuickbirdMetaData.cpp
@@ -29,11 +29,12 @@ static ossimTrace traceDebug ("ossimQuickbirdMetaData:debug");
 
 ossimQuickbirdMetaData::ossimQuickbirdMetaData()
   :
-  theGenerationTime("Unknown"),
+  theGenerationDate("Unknown"),
   theBandId("Unknown"),
+  theSatID("Unknown"),
+  theTLCDate("Unknown"),
   theSunAzimuth(0.0),
   theSunElevation(0.0)
-
 {
 }
 
@@ -51,18 +52,9 @@ bool ossimQuickbirdMetaData::open(const ossimFilename& imageFile)
    //if the Quickbird tif is 02APR01105228-M1BS-000000128955_01_P001.TIF
    //the metadata file will be 02APR01105228-M1BS-000000128955_01_P001.IMD
 
-//    ossimString separator(".");
-   //ossimString filenamebase = imageFile.fileNoExtension();
-//    std::vector< ossimString > filenameparts = filenamebase.split(separator);
-// metadatafile += ".IMD";
-// metadatafile.setPath(imageFile.path());
-
-std::cout<<"ImageFile : "<<imageFile<<std::endl;
    ossimFilename metadatafile = imageFile;
    metadatafile.setExtension(ossimString("IMD"));
 
-std::cout<<"metadatafile : "<<metadatafile<<std::endl;
-
    if( parseMetaData(metadatafile) == false )
    {
       if(traceDebug())
@@ -72,30 +64,18 @@ std::cout<<"metadatafile : "<<metadatafile<<std::endl;
       }
       return false;
    }
-   
-   ossimFilename geofile = imageFile;
-   geofile.setExtension(ossimString("GEO"));
-std::cout<<"geofile : "<<geofile<<std::endl;
-   if( parseGEOData(geofile) == false )
-   {
-      if(traceDebug())
-      {
-         ossimNotify(ossimNotifyLevel_WARN)
-         << MODULE << " errors parsing GEO" << std::endl;
-      }
-      return false;
-   }
-
 
    return true;
 }
 
 void ossimQuickbirdMetaData::clearFields()
 {
+  theGenerationDate = "Unknown";
+  theBandId = "Unknown";
+  theSatID = "Unknown";
+  theTLCDate = "Unknown",
   theSunAzimuth = 0.0;
   theSunElevation = 0.0;
-  theBandId = "Unknown";
-  theGenerationTime = "Unknown";
 }
 
 std::ostream& ossimQuickbirdMetaData::print(std::ostream& out) const
@@ -103,8 +83,10 @@ std::ostream& ossimQuickbirdMetaData::print(std::ostream& out) const
 
   out << "\n----------------- Info on Quickbird Image -------------------"
       << "\n  "
-      << "\n  Generation date:   " << theGenerationTime
+      << "\n  Generation date:   " << theGenerationDate
       << "\n  Band Id:   " << theBandId
+      << "\n  Sat Id:   " << theSatID
+      << "\n  TLC date:   " << theTLCDate
       << "\n  Sun Azimuth:    " << theSunAzimuth
       << "\n  Sun Elevation:   " << theSunElevation
       << "\n"
@@ -124,8 +106,8 @@ bool ossimQuickbirdMetaData::saveState(ossimKeywordlist& kwl,
           true);
 
   kwl.add(prefix,
-          "generation_time",
-          theGenerationTime,
+          "generation_date",
+          theGenerationDate,
           true);
 
   kwl.add(prefix,
@@ -133,6 +115,16 @@ bool ossimQuickbirdMetaData::saveState(ossimKeywordlist& kwl,
           theBandId,
           true);
 
+    kwl.add(prefix,
+          "sat_id",
+          theSatID,
+          true);
+
+   kwl.add(prefix,
+          "tlc_date",
+          theTLCDate,
+          true);
+
   kwl.add(prefix,
           ossimKeywordNames::AZIMUTH_ANGLE_KW,
           theSunAzimuth,
@@ -165,10 +157,10 @@ bool ossimQuickbirdMetaData::loadState(const ossimKeywordlist& kwl,
      }
   }
 
-  lookup = kwl.find(prefix, "generation_time");
+  lookup = kwl.find(prefix, "generation_date");
   if (lookup)
   {
-     theGenerationTime = lookup;
+     theGenerationDate = lookup;
   }
 
   lookup = kwl.find(prefix, "band_id");
@@ -177,6 +169,18 @@ bool ossimQuickbirdMetaData::loadState(const ossimKeywordlist& kwl,
      theBandId = lookup;
   }
 
+  lookup = kwl.find(prefix, "sat_id");
+  if (lookup)
+  {
+     theSatID = lookup;
+  }
+
+  lookup = kwl.find(prefix, "tlc_date");
+  if (lookup)
+  {
+     theTLCDate= lookup;
+  }
+
   lookup = kwl.find(prefix, ossimKeywordNames::AZIMUTH_ANGLE_KW);
   if (lookup)
   {
@@ -254,8 +258,7 @@ bool ossimQuickbirdMetaData::parseMetaData(const ossimFilename& data_file)
   }
 
   sscanf(strptr, "%17c %s", dummy, name);
-  theGenerationTime = name;
-std::cout<<name<<std::endl;
+  theGenerationDate = ossimString(name).before(";");
 
 
   //---
@@ -277,8 +280,48 @@ std::cout<<name<<std::endl;
   }
 
   sscanf(strptr, "%9c %s", dummy, name);
-  theBandId = name;
-std::cout<<name<<std::endl;
+  theBandId = ossimString(name).after("\"").before("\";");
+
+
+  //---
+  // SatID:
+  //---
+  strptr = strstr(filebuf, "\n\tsatId =");
+  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);
+  theSatID = ossimString(name).after("\"").before("\";");
+
+  //---
+  // TLCTime:
+  //---
+  strptr = strstr(filebuf, "\n\tTLCTime =");
+  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, "%11c %s", dummy, name);
+  theTLCDate = ossimString(name).before("\";");
 
    //***
    // Sun Azimuth:
@@ -297,10 +340,8 @@ std::cout<<name<<std::endl;
       return false;
     }
   }
-
   sscanf(strptr, "%9c %s", dummy, name);
-  //theSunAzimuth = name;
-std::cout<<name<<std::endl;
+  theSunAzimuth = ossimString(name).before(";").toFloat64();;
 
    //***
    // Sun Elevation:
@@ -319,10 +360,9 @@ std::cout<<name<<std::endl;
       return false;
     }
   }
-
   sscanf(strptr, "%9c %s", dummy, name);
- // theSunElevation = value;
-std::cout<<name<<std::endl;
+  theSunElevation = ossimString(name).before(";").toFloat64();
+
 
   delete [] filebuf;
   filebuf = 0;
-- 
GitLab