From ee88a6df17ce1d9452f7d031e5aa56ec653e6d85 Mon Sep 17 00:00:00 2001 From: Chia Aik Song <crscas@nus.edu.sg> Date: Thu, 5 Nov 2009 15:11:33 +0800 Subject: [PATCH] Finish add reading of parameter values from data file --- .../ossim/AlosPalsar/AlosSarData.cpp | 40 +++++++ .../ossim/AlosPalsar/AlosSarData.h | 3 + .../ossim/AlosPalsar/AlosSarRecordHeader.cpp | 2 +- .../ossim/AlosPalsar/AlosSarSignalData.cpp | 110 ++++++++++++------ .../ossim/AlosPalsar/AlosSarSignalData.h | 15 ++- 5 files changed, 134 insertions(+), 36 deletions(-) diff --git a/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarData.cpp b/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarData.cpp index 662844be30..58ad3a6544 100644 --- a/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarData.cpp +++ b/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarData.cpp @@ -14,6 +14,7 @@ #include <AlosSarRecordHeader.h> #include <AlosSarDataFileDescriptor.h> +#include <AlosSarSignalData.h> #include <ossim/base/ossimTrace.h> #include <ossim/base/ossimKeywordlist.h> @@ -26,6 +27,7 @@ namespace ossimplugins { const int AlosSarData::AlosSarDataFileDescriptorID = 1; +const int AlosSarData::AlosSarSignalDataID = 2; AlosSarData::AlosSarData() { @@ -70,6 +72,24 @@ std::istream& operator>>(std::istream& is, AlosSarData& data) is.read(buff, header.get_length()-12); delete buff; } + + std::streampos filePosition; + + filePosition = is.tellg(); + is>>header; + + record = new AlosSarSignalData; + + if (record != NULL) + { + record->Read(is); + data._records[header.get_rec_seq()] = record; + std::cout << "Record sequence number = " << header.get_rec_seq() << std::endl; + } + is.seekg(filePosition); // Rewind file pointer to start of record + // Then, advance pointer to next record + is.seekg(static_cast<std::streamoff>(header.get_length()), std::ios::cur); + return is; } @@ -140,6 +160,21 @@ bool AlosSarData::saveState(ossimKeywordlist& kwl, result = false; } + const AlosSarSignalData *signalData = get_AlosSarSignalData(); + if (datafiledesc != NULL) + { + kwl.add(prefix, "pulse_repetition_frequency", signalData->get_pulse_repetition_frequency(),true); + kwl.add(prefix, "slant_range_to_1st_data_sample", signalData->get_slant_range_to_1st_data_sample(),true); + // FIXME debug + std::cout << std::endl << "pulse_repetition_frequency = " << signalData->get_pulse_repetition_frequency() << std::endl; + std::cout << std::endl << "slant_range_to_1st_data_sample = " << signalData->get_slant_range_to_1st_data_sample() << std::endl; + } + else + { + result = false; + } + + return result; } @@ -149,4 +184,9 @@ const AlosSarDataFileDescriptor * AlosSarData::get_AlosSarDataFileDescriptor() c return dynamic_cast<const AlosSarDataFileDescriptor*>(_records.find(AlosSarDataFileDescriptorID)->second); } +const AlosSarSignalData * AlosSarData::get_AlosSarSignalData() const +{ + return dynamic_cast<const AlosSarSignalData*>(_records.find(AlosSarSignalDataID)->second); +} + } diff --git a/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarData.h b/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarData.h index ac045c740c..5ae319c614 100644 --- a/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarData.h +++ b/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarData.h @@ -15,6 +15,7 @@ #include <iostream> #include "AlosSarDataFileDescriptor.h" +#include "AlosSarSignalData.h" #include <map> class ossimKeywordlist; @@ -82,6 +83,7 @@ public: const AlosSarDataFileDescriptor * get_AlosSarDataFileDescriptor() const; + const AlosSarSignalData * get_AlosSarSignalData() const; protected: typedef std::map<int, AlosSarRecord*> RecordType; @@ -89,6 +91,7 @@ protected: static const int AlosSarDataFileDescriptorID; + static const int AlosSarSignalDataID; private: }; diff --git a/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarRecordHeader.cpp b/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarRecordHeader.cpp index c71a8c6c6b..74113366bf 100644 --- a/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarRecordHeader.cpp +++ b/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarRecordHeader.cpp @@ -37,7 +37,7 @@ std::ostream& operator<<(std::ostream& os, const AlosSarRecordHeader& data) std::istream& operator>>(std::istream& is, AlosSarRecordHeader& data) { - is.read((char*)&(data._rec_seq),4); + is.read((char*)&(data._rec_seq),4); // TODO Change dangerous C-style cast to static cast. data.SwitchEndian(data._rec_seq); is.read((char*)&(data._rec_sub1),1); is.read((char*)&(data._rec_type),1); diff --git a/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarSignalData.cpp b/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarSignalData.cpp index ac0cc6a86e..2b7b566602 100644 --- a/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarSignalData.cpp +++ b/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarSignalData.cpp @@ -11,6 +11,8 @@ // $Id$ #include <AlosSarSignalData.h> +#include <ossim/base/ossimConstants.h> +#include <ossim/base/ossimEndian.h> namespace ossimplugins @@ -34,64 +36,106 @@ std::ostream& operator<<(std::ostream& os, const AlosSarSignalData& data) std::istream& operator>>(std::istream& is, AlosSarSignalData& data) { - int tmpint; + ossim_uint16 tmpuint16; + ossim_uint32 tmpuint32; + ossimEndian oe; - char buf4[5]; - buf4[4] = '\0'; + std::cout << std::endl << "File pointer location = " << is.tellg() << std::endl; + std::cout << std::endl; - is.read(buf4,4); - tmpint = buf4; - std::cout << 'Line number = ' << tmpint; + is.read(reinterpret_cast<char*>(&tmpuint32), 4); + if (oe.getSystemEndianType() == OSSIM_LITTLE_ENDIAN) {oe.swap(tmpuint32);} + std::cout << "Data line number = " << tmpuint32 << std::endl; - is.read(buf4,4); - tmpint = buf4; - std::cout << 'SAR image data record index = ' << tmpint; + is.read(reinterpret_cast<char*>(&tmpuint32), 4); + if (oe.getSystemEndianType() == OSSIM_LITTLE_ENDIAN) {oe.swap(tmpuint32);} + std::cout << "Data record index = " << tmpuint32 << std::endl; -// TODO Complete modification below + is.read(reinterpret_cast<char*>(&tmpuint32), 4); + if (oe.getSystemEndianType() == OSSIM_LITTLE_ENDIAN) {oe.swap(tmpuint32);} + std::cout << "Actual count of left-fill pixels = " << tmpuint32 << std::endl; + is.read(reinterpret_cast<char*>(&tmpuint32), 4); + if (oe.getSystemEndianType() == OSSIM_LITTLE_ENDIAN) {oe.swap(tmpuint32);} + std::cout << "Actual count of data pixels = " << tmpuint32 << std::endl; - char buf6[7]; - buf6[6] = '\0'; + is.read(reinterpret_cast<char*>(&tmpuint32), 4); + if (oe.getSystemEndianType() == OSSIM_LITTLE_ENDIAN) {oe.swap(tmpuint32);} + std::cout << "Actual count of right-fill pixels = " << tmpuint32 << std::endl; - char buf168[169]; - buf168[168] = '\0'; + is.read(reinterpret_cast<char*>(&tmpuint32), 4); + if (oe.getSystemEndianType() == OSSIM_LITTLE_ENDIAN) {oe.swap(tmpuint32);} + std::cout << "Sensor parameters update flag = " << tmpuint32 << std::endl; - char buf94[95]; - buf94[94] = '\0'; + is.read(reinterpret_cast<char*>(&tmpuint32), 4); + if (oe.getSystemEndianType() == OSSIM_LITTLE_ENDIAN) {oe.swap(tmpuint32);} + std::cout << "Scene start year = " << tmpuint32 << std::endl; - char buf8[9]; - buf8[8] = '\0'; + is.read(reinterpret_cast<char*>(&tmpuint32), 4); + if (oe.getSystemEndianType() == OSSIM_LITTLE_ENDIAN) {oe.swap(tmpuint32);} + std::cout << "Scene start day of year = " << tmpuint32 << std::endl; - is.read(buf168,168); + is.read(reinterpret_cast<char*>(&tmpuint32), 4); + if (oe.getSystemEndianType() == OSSIM_LITTLE_ENDIAN) {oe.swap(tmpuint32);} + std::cout << "Sensor acquisition milliseconds of day = " << tmpuint32 << std::endl; - is.read(buf6,6); - data._num_lines = atoi(buf6); + is.read(reinterpret_cast<char*>(&tmpuint16), 2); + if (oe.getSystemEndianType() == OSSIM_LITTLE_ENDIAN) {oe.swap(tmpuint16);} + std::cout << "SAR channel indicator = " << tmpuint16 << std::endl; - is.read(buf94,94); + is.read(reinterpret_cast<char*>(&tmpuint16), 2); + if (oe.getSystemEndianType() == OSSIM_LITTLE_ENDIAN) {oe.swap(tmpuint16);} + std::cout << "SAR channel code = " << tmpuint16 << std::endl; - int tmpval; - is.read(buf8,8); - tmpval = atoi(buf8); - data._num_pix_in_line = tmpval/8; // Assume data always in 8-byte complex format + is.read(reinterpret_cast<char*>(&tmpuint16), 2); + if (oe.getSystemEndianType() == OSSIM_LITTLE_ENDIAN) {oe.swap(tmpuint16);} + std::cout << "Transmitted polarization = " << tmpuint16 << std::endl; - char buf432[433]; - buf432[432] = '\0'; + is.read(reinterpret_cast<char*>(&tmpuint16), 2); + if (oe.getSystemEndianType() == OSSIM_LITTLE_ENDIAN) {oe.swap(tmpuint16);} + std::cout << "Received polarization = " << tmpuint16 << std::endl; + + is.read(reinterpret_cast<char*>(&tmpuint32), 4); + if (oe.getSystemEndianType() == OSSIM_LITTLE_ENDIAN) {oe.swap(tmpuint32);} + std::cout << "PRF (mHz) = " << tmpuint32 << std::endl; + data._pulse_repetition_frequency = static_cast<int>(tmpuint32); + + is.read(reinterpret_cast<char*>(&tmpuint32), 4); + if (oe.getSystemEndianType() == OSSIM_LITTLE_ENDIAN) {oe.swap(tmpuint32);} + std::cout << "Scan ID for SCAN SAR mode = " << tmpuint32 << std::endl; + + is.read(reinterpret_cast<char*>(&tmpuint16), 2); + if (oe.getSystemEndianType() == OSSIM_LITTLE_ENDIAN) {oe.swap(tmpuint16);} + std::cout << "Onboard range compressed flag = " << tmpuint16 << std::endl; + + is.seekg(50, std::ios_base::cur); + + is.read(reinterpret_cast<char*>(&tmpuint32), 4); + if (oe.getSystemEndianType() == OSSIM_LITTLE_ENDIAN) {oe.swap(tmpuint32);} + std::cout << "Slant range to 1st data sample (m) = " << tmpuint32 << std::endl; + data._slant_range_to_1st_data_sample = static_cast<int>(tmpuint32); + + is.read(reinterpret_cast<char*>(&tmpuint32), 4); + if (oe.getSystemEndianType() == OSSIM_LITTLE_ENDIAN) {oe.swap(tmpuint32);} + std::cout << "Data record window position = " << tmpuint32 << std::endl; + + std::cout << std::endl << "File pointer location = " << is.tellg() << std::endl; + std::cout << std::endl; - is.read(buf432,432); return is; } AlosSarSignalData::AlosSarSignalData(const AlosSarSignalData& rhs): AlosSarRecord(rhs), - _num_lines(rhs._num_lines), - _num_pix_in_line(rhs._num_pix_in_line) + _pulse_repetition_frequency(rhs._pulse_repetition_frequency), + _slant_range_to_1st_data_sample(rhs._slant_range_to_1st_data_sample) { } AlosSarSignalData& AlosSarSignalData::operator=(const AlosSarSignalData& rhs) { - _num_lines = rhs._num_lines; - _num_pix_in_line = rhs._num_pix_in_line; + _pulse_repetition_frequency = rhs._pulse_repetition_frequency; + _slant_range_to_1st_data_sample = rhs._slant_range_to_1st_data_sample; return *this; } } diff --git a/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarSignalData.h b/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarSignalData.h index 7650429be7..e9aeeffa6e 100644 --- a/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarSignalData.h +++ b/Utilities/otbossimplugins/ossim/AlosPalsar/AlosSarSignalData.h @@ -91,17 +91,28 @@ public: }; - int slant_range_to_1st_data_sample() const + int get_pulse_repetition_frequency() const + { + return _pulse_repetition_frequency; + }; + + int get_slant_range_to_1st_data_sample() const { return _slant_range_to_1st_data_sample; }; protected: + + /** + * @brief pulse_repetition_frequency + */ + int _pulse_repetition_frequency; + /** * @brief slant_range_to_1st_data_sample */ - int _slant_range_to_1st_data_sample; + int _slant_range_to_1st_data_sample; private: }; -- GitLab