diff --git a/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarData.cpp b/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarData.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6ef51ec92d802cd615635fc9a8dd261066a563f2 --- /dev/null +++ b/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarData.cpp @@ -0,0 +1,159 @@ +//---------------------------------------------------------------------------- +// +// "Copyright Centre National d'Etudes Spatiales" +// "Copyright Centre for Remote Imaging, Sensing and Processing" +// +// License: LGPL +// +// See LICENSE.txt file in the top level directory for more details. +// +//---------------------------------------------------------------------------- +// $Id$ + +#include <AlosSarData.h> +#include <AlosSarRecordHeader.h> + +#include <AlosSarDataFileDescriptor.h> + +#include <ossim/base/ossimTrace.h> +#include <ossim/base/ossimKeywordlist.h> +#include <ossim/base/ossimKeywordNames.h> + +// Static trace for debugging +static ossimTrace traceDebug("ossimAlosSarData:debug"); + +namespace ossimplugins +{ + +const int AlosSarData::AlosSarDataFileDescriptorID = 1; + +AlosSarData::AlosSarData() +{ + +} + +AlosSarData::~AlosSarData() +{ + ClearRecords(); +} + +std::ostream& operator<<(std::ostream& os, const AlosSarData& data) +{ + std::map<int, AlosSarRecord*>::const_iterator it = data._records.begin(); + while(it != data._records.end()) + { + (*it).second->Write(os); + ++it; + } + return os; + +} + +std::istream& operator>>(std::istream& is, AlosSarData& data) +{ + + data.ClearRecords(); + + AlosSarRecordHeader header; + bool eof = false; + while(!eof) + { + is>>header; + if(is.eof()) + { + eof = true; + } + else + { + AlosSarRecord* record = new AlosSarDataFileDescriptor; + if (record != NULL) + { + record->Read(is); + data._records[header.get_rec_seq()] = record; + } + else + { + char* buff = new char[header.get_length()-12]; + is.read(buff, header.get_length()-12); + delete buff; + } + } + } + return is; +} + + +AlosSarData::AlosSarData(const AlosSarData& rhs) +{ + std::map<int, AlosSarRecord*>::const_iterator it = rhs._records.begin(); + while(it != rhs._records.end()) + { + _records[(*it).first] = (*it).second->Clone(); + ++it; + } +} + +AlosSarData& AlosSarData::operator=(const AlosSarData& rhs) +{ + ClearRecords(); + std::map<int, AlosSarRecord*>::const_iterator it = rhs._records.begin(); + while(it != rhs._records.end()) + { + _records[(*it).first] = (*it).second->Clone(); + ++it; + } + + return *this; +} + +void AlosSarData::ClearRecords() +{ + std::map<int, AlosSarRecord*>::const_iterator it = _records.begin(); + while(it != _records.end()) + { + delete (*it).second; + ++it; + } + _records.clear(); +} + +bool AlosSarData::saveState(ossimKeywordlist& kwl, + const char* prefix) const +{ + + static const char MODULE[] = "AlosSarData::saveState"; + + if (traceDebug()) + { + ossimNotify(ossimNotifyLevel_DEBUG)<< MODULE << " entered...\n"; + } + + bool result = true; + + char name[64]; + + kwl.add(prefix, ossimKeywordNames::TYPE_KW, "ossimAlosSarModel", true); + /* + * Adding metadata necessary to the sensor model in the keywordlist + */ + const AlosSarDataFileDescriptor *datafiledesc = get_AlosSarDataFileDescriptor(); + if (leaderfiledesc != NULL) + { + kwl.add(prefix, "num_lines",datafiledesc->get_num_lines(),true); + kwl.add(prefix, "num_pix_in_line", datafiledesc->get_num_pix_in_line(),true); + } + else + { + result = false; + } + + return result; +} + + +const AlosSarFileDescriptor * AlosSarData::get_AlosSarDataFileDescriptor() const +{ + return dynamic_cast<const AlosSarFileDescriptor*>(_records.find(AlosSarDataFileDescriptorID)->second); +} + +} diff --git a/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarData.h b/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarData.h new file mode 100644 index 0000000000000000000000000000000000000000..51ce72179f35d0c719f7b6721eac1bb2eb11038c --- /dev/null +++ b/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarData.h @@ -0,0 +1,100 @@ +//---------------------------------------------------------------------------- +// +// "Copyright Centre National d'Etudes Spatiales" +// "Copyright Centre for Remote Imaging, Sensing and Processing" +// +// License: LGPL +// +// See LICENSE.txt file in the top level directory for more details. +// +//---------------------------------------------------------------------------- +// $Id$ + +#ifndef AlosSarData_h +#define AlosSarData_h + +#include <iostream> +#include "AlosSarFileDescriptor.h" +#include "AlosSarDataSetSummary.h" +#include "AlosSarMapProjectionData.h" +#include "AlosSarPlatformPositionData.h" +#include "AlosSarFacilityData.h" +#include <map> + +class ossimKeywordlist; + +namespace ossimplugins +{ + +class AlosSarPlatformPositionData; +class AlosSarMapProjectionData; +class AlosSarDataSetSummary; +class AlosSarFileDescriptor; +class AlosSarFacilityData; + +/** + * @ingroup AlosSarDataFile + * @brief This class is able to read the Leader file of the AlosSar file structure + */ +class AlosSarData +{ +public: + /** + * @brief Constructor + */ + AlosSarData(); + + /** + * @brief Destructor + */ + ~AlosSarData(); + + /** + * @brief This function write the AlosSarData in a stream + */ + friend std::ostream& operator<<(std::ostream& os, const AlosSarData& data); + + /** + * @brief This function read a AlosSarData from a stream + */ + friend std::istream& operator>>(std::istream& is, AlosSarData& data); + + /** + * @brief Copy constructor + */ + AlosSarData(const AlosSarData& rhs); + + /** + * @brief Copy operator + */ + AlosSarData& operator=(const AlosSarData& rhs); + + /** + * @brief Remove all the previous records from the AlosSarData + */ + void ClearRecords(); + + + /** + * @brief Method to save object state to a keyword list. + * @param kwl Keyword list to save to. + * @param prefix added to keys when saved. + * @return true on success, false on error. + */ + virtual bool saveState(ossimKeywordlist& kwl, + const char* prefix=0) const; + + + const AlosSarFileDescriptor * get_AlosSarDataFileDescriptor() const; + +protected: + typedef std::map<int, AlosSarRecord*> RecordType; + RecordType _records; + + + static const int AlosSarDataFileDescriptorID; +private: + +}; +} +#endif diff --git a/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarDataFileDescriptor.cpp b/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarDataFileDescriptor.cpp new file mode 100644 index 0000000000000000000000000000000000000000..babdd25a997576fa31f2cdd5390b395c9b744079 --- /dev/null +++ b/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarDataFileDescriptor.cpp @@ -0,0 +1,70 @@ +//---------------------------------------------------------------------------- +// +// "Copyright Centre National d'Etudes Spatiales" +// "Copyright Centre for Remote Imaging, Sensing and Processing" +// +// License: LGPL +// +// See LICENSE.txt file in the top level directory for more details. +// +//---------------------------------------------------------------------------- +// $Id$ + +#include <AlosSarDataFileDescriptor.h> + + +namespace ossimplugins +{ + +AlosSarDataFileDescriptor::AlosSarDataFileDescriptor() : AlosSarRecord("sar_desc_rec") +{ +} + +AlosSarDataFileDescriptor::~AlosSarDataFileDescriptor() +{ +} + +std::ostream& operator<<(std::ostream& os, const AlosSarDataFileDescriptor& data) +{ + os<<"_num_lines:"<<data._num_lines<<std::endl; + os<<"_num_lines:"<<data._num_lines<<std::endl; + return os; +} + +std::istream& operator>>(std::istream& is, AlosSarDataFileDescriptor& data) +{ + char buf6[7]; + buf6[6] = '\0'; + + char buf180[181]; + buf180[180] = '\0'; + + is.read(buf180,180); + + is.read(buf6,6); + data._num_lines = atoi(buf6); + + is.read(buf6,6); + data._num_pix_in_line = atoi(buf6); + + char buf528[528]; + buf528[528] = '\0'; + + is.read(buf528,528); + return is; +} + +AlosSarDataFileDescriptor::AlosSarDataFileDescriptor(const AlosSarDataFileDescriptor& rhs): + AlosSarRecord(rhs), + _num_lines(rhs._num_lines), + _num_pix_in_line(rhs._num_pix_in_line) +{ +} + +AlosSarDataFileDescriptor& AlosSarDataFileDescriptor::operator=(const AlosSarDataFileDescriptor& rhs) +{ + _num_lines = rhs._num_lines; + _num_pix_in_line = rhs._num_pix_in_line; + return *this; +} +} diff --git a/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarDataFileDescriptor.h b/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarDataFileDescriptor.h new file mode 100644 index 0000000000000000000000000000000000000000..84254d7dce8a4f4bdd0066a38ad8269226458ebc --- /dev/null +++ b/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarDataFileDescriptor.h @@ -0,0 +1,118 @@ +//---------------------------------------------------------------------------- +// +// "Copyright Centre National d'Etudes Spatiales" +// "Copyright Centre for Remote Imaging, Sensing and Processing" +// +// License: LGPL +// +// See LICENSE.txt file in the top level directory for more details. +// +//---------------------------------------------------------------------------- +// $Id$ + +#ifndef AlosSarDataFileDescriptor_h +#define AlosSarDataFileDescriptor_h + + +#include<iostream> +#include <cstdlib> +#include <AlosSarRecordHeader.h> +#include <AlosSarRecord.h> + +namespace ossimplugins +{ + +/** + * @ingroup SARLeaderAlosSarDataFileDescriptorRecord + * @brief This class is able to read the SAR leader file descriptor record of the leader file + */ +class AlosSarDataFileDescriptor : public AlosSarRecord +{ +public: + /** + * @brief Constructor + */ + AlosSarDataFileDescriptor(); + /** + * @brief Destructor + */ + ~AlosSarDataFileDescriptor(); + + /** + * @brief This function write the AlosSarDataFileDescriptor in a stream + */ + friend std::ostream& operator<<(std::ostream& os, const AlosSarDataFileDescriptor& data); + + /** + * @brief This function read a AlosSarDataFileDescriptor from a stream + */ + friend std::istream& operator>>(std::istream& is, AlosSarDataFileDescriptor& data); + + /** + * @brief Copy constructor + */ + AlosSarDataFileDescriptor(const AlosSarDataFileDescriptor& rhs); + + /** + * @brief Copy operator + */ + AlosSarDataFileDescriptor& operator=(const AlosSarDataFileDescriptor& rhs); + + /** + * @brief This function is able to create a new instance of the class + */ + AlosSarRecord* Instanciate() + { + return new AlosSarDataFileDescriptor(); + }; + + /** + * @brief This function is able to create a new instance of the class initialised with the data of the calling instance + */ + AlosSarRecord* Clone() + { + return new AlosSarDataFileDescriptor(*this); + }; + + /** + * @brief Read the class data from a stream + */ + void Read(std::istream& is) + { + is>>*this; + }; + + /** + * @brief Write the class to a stream + */ + void Write(std::ostream& os) + { + os<<*this; + }; + + + int get_num_pix_in_line() + { + return _num_pix_in_line; + }; + + int get_num_lines() + { + return _num_lines; + }; + +protected: + /** + * @brief num_pix_in_line + */ + int _num_pix_in_line; + /** + * @brief num_lines + */ + int _num_lines; + + +private: +}; +} +#endif diff --git a/Utilities/otbossimplugins/ossim/ossimAlosPalsarModel.cpp b/Utilities/otbossimplugins/ossim/ossimAlosPalsarModel.cpp index 6274ce998be506b54ce0c7705247e7d34dfb224f..4583ce93918b57727088d786427086799489a0d2 100644 --- a/Utilities/otbossimplugins/ossim/ossimAlosPalsarModel.cpp +++ b/Utilities/otbossimplugins/ossim/ossimAlosPalsarModel.cpp @@ -21,6 +21,7 @@ #include <ossim/base/ossimTrace.h> #include <otb/RefPoint.h> #include <AlosPalsar/AlosSarLeader.h> +#include <AlosPalsar/AlosSarData.h> #include <otb/SensorParams.h> #include <otb/PlatformPosition.h> #include <ossim/base/ossimKeywordNames.h> @@ -692,4 +693,14 @@ ossimFilename ossimAlosPalsarModel::findAlosPalsarLeader(const ossimFilename& fi return file; } +bool ossimAlosPalsarModel::isAlosPalsarData(const ossimFilename& file) const +{ + //FIXME +} + +ossimFilename ossimAlosPalsarModel::findAlosPalsarData(const ossimFilename& file) const +{ + //FIXME +} + } // namespace ossimplugins diff --git a/Utilities/otbossimplugins/ossim/ossimAlosPalsarModel.h b/Utilities/otbossimplugins/ossim/ossimAlosPalsarModel.h index 6ffb02d8e781359eed02023bdb0f6c623e0ae825..0b9375bc74854a7bbe01141f0d37d3d1a5090105 100644 --- a/Utilities/otbossimplugins/ossim/ossimAlosPalsarModel.h +++ b/Utilities/otbossimplugins/ossim/ossimAlosPalsarModel.h @@ -31,6 +31,8 @@ class PlatformPosition; class SensorParams; class RefPoint; class AlosSarLeader; +class AlosSarData; + /** * @brief This class is able to direct localisation and indirect localisation using the AlosPalsar sensor model * @@ -116,11 +118,17 @@ private: */ AlosSarLeader *theAlosSarLeader; - + /** + * @brief List of metadata contained in the Data file + */ + AlosSarData *theAlosSarData; virtual bool isAlosPalsarLeader(const ossimFilename& file) const; virtual ossimFilename findAlosPalsarLeader(const ossimFilename& file) const; + virtual bool isAlosPalsarData(const ossimFilename& file) const; + virtual ossimFilename findAlosPalsarData(const ossimFilename& file) const; + TYPE_DATA };