From 0b1582385a59f94c5e44dfade861f093ef193536 Mon Sep 17 00:00:00 2001 From: Thomas Feuvrier <thomas.feuvrier@c-s.fr> Date: Fri, 18 Sep 2009 18:30:27 +0200 Subject: [PATCH] ENH: Improve reading TerraSarX keywordlist --- Testing/Code/IO/CMakeLists.txt | 56 +++- Testing/Code/IO/otbImageKeywordlist.cxx | 59 +++- .../ossim/ossimTerraSarModel.cpp | 217 +++++++++++++- .../ossim/ossimTerraSarModel.h | 64 ++++ .../ossim/ossimTerraSarProductDoc.cpp | 216 +++++++++++++- .../ossim/ossimTerraSarProductDoc.h | 37 +++ .../otbossimplugins/ossim/otb/ImageNoise.cpp | 281 ++++++++++++++++++ .../otbossimplugins/ossim/otb/ImageNoise.h | 124 ++++++++ Utilities/otbossimplugins/ossim/otb/Noise.cpp | 136 +++++++++ Utilities/otbossimplugins/ossim/otb/Noise.h | 95 ++++++ 10 files changed, 1261 insertions(+), 24 deletions(-) create mode 100644 Utilities/otbossimplugins/ossim/otb/ImageNoise.cpp create mode 100644 Utilities/otbossimplugins/ossim/otb/ImageNoise.h create mode 100644 Utilities/otbossimplugins/ossim/otb/Noise.cpp create mode 100644 Utilities/otbossimplugins/ossim/otb/Noise.h diff --git a/Testing/Code/IO/CMakeLists.txt b/Testing/Code/IO/CMakeLists.txt index 9eb0a44ea7..5de06e836a 100755 --- a/Testing/Code/IO/CMakeLists.txt +++ b/Testing/Code/IO/CMakeLists.txt @@ -1982,102 +1982,135 @@ ADD_TEST(ioTvTerraSarImageMetadataInterface ${IO_TESTS18} ADD_TEST(ioTvImageKeywordlistSpot5 ${IO_TESTS18} - --compare-ascii ${NOTOL} + --compare-n-ascii ${NOTOL} 2 ${BASELINE_FILES}/ioTvImageKeywordlistSpot5.txt ${TEMP}/ioTvImageKeywordlistSpot5.txt + ${BASELINE_FILES}/ioTvImageKeywordlistSpot5.txt + ${TEMP}/ioTvImageKeywordlistSpot5_saveState_loadState.txt --ignore-lines-with 1 support_data.metadata_file otbImageKeywordlist ${LARGEDATA}/SPOT5/TEHERAN/IMAGERY.TIF ${TEMP}/ioTvImageKeywordlistSpot5.txt + ${TEMP}/ioTvImageKeywordlistSpot5_saveState_loadState.txt ) ADD_TEST(ioTvImageKeywordlistQuickbird ${IO_TESTS18} - --compare-ascii ${NOTOL} + --compare-n-ascii ${NOTOL} 2 ${BASELINE_FILES}/ioTvImageKeywordlistQuickbird.txt ${TEMP}/ioTvImageKeywordlistQuickbird.txt + ${BASELINE_FILES}/ioTvImageKeywordlistQuickbird.txt + ${TEMP}/ioTvImageKeywordlistQuickbird_saveState_loadState.txt otbImageKeywordlist ${LARGEDATA}/QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF ${TEMP}/ioTvImageKeywordlistQuickbird.txt + ${TEMP}/ioTvImageKeywordlistQuickbird_saveState_loadState.txt ) ADD_TEST(ioTvImageKeywordlistIkonos ${IO_TESTS18} - --compare-ascii ${NOTOL} + --compare-n-ascii ${NOTOL} 2 ${BASELINE_FILES}/ioTvImageKeywordlistIkonos.txt ${TEMP}/ioTvImageKeywordlistIkonos.txt + ${BASELINE_FILES}/ioTvImageKeywordlistIkonos.txt + ${TEMP}/ioTvImageKeywordlistIkonos_saveState_loadState.txt otbImageKeywordlist ${LARGEDATA}/IKONOS/BLOSSEVILLE/po_2619900_pan_0000000.tif ${TEMP}/ioTvImageKeywordlistIkonos.txt + ${TEMP}/ioTvImageKeywordlistIkonos_saveState_loadState.txt ) ADD_TEST(ioTvImageKeywordlistRapidEye ${IO_TESTS18} - --compare-ascii ${NOTOL} + --compare-n-ascii ${NOTOL} 2 ${BASELINE_FILES}/ioTvImageKeywordlistRapidEye.txt ${TEMP}/ioTvImageKeywordlistRapidEye.txt + ${BASELINE_FILES}/ioTvImageKeywordlistRapidEye.txt + ${TEMP}/ioTvImageKeywordlistRapidEye_saveState_loadState.txt otbImageKeywordlist ${LARGEDATA}/RAPIDEYE/level1B/2008-12-25T005918_RE3_1B-NAC_397971_12345_band3.ntf ${TEMP}/ioTvImageKeywordlistRapidEye.txt + ${TEMP}/ioTvImageKeywordlistRapidEye_saveState_loadState.txt ) ADD_TEST(ioTvImageKeywordlistEnvisatAsar ${IO_TESTS18} - --compare-ascii ${NOTOL} + --compare-n-ascii ${NOTOL} 2 ${BASELINE_FILES}/ioTvImageKeywordlistEnvisatAsar.txt ${TEMP}/ioTvImageKeywordlistEnvisatAsar.txt + ${BASELINE_FILES}/ioTvImageKeywordlistEnvisatAsar.txt + ${TEMP}/ioTvImageKeywordlistEnvisatAsar_saveState_loadState.txt otbImageKeywordlist ${LARGEDATA}/ENVISAT_ASAR_SCENE01/ASA_APS_1PNDPA20030821_7713.N1 ${TEMP}/ioTvImageKeywordlistEnvisatAsar.txt + ${TEMP}/ioTvImageKeywordlistEnvisatAsar_saveState_loadState.txt ) ADD_TEST(ioTvImageKeywordlistAlosPalsar ${IO_TESTS18} - --compare-ascii ${NOTOL} + --compare-n-ascii ${NOTOL} 2 ${BASELINE_FILES}/ioTvImageKeywordlistAlosPalsar.txt ${TEMP}/ioTvImageKeywordlistAlosPalsar.txt + ${BASELINE_FILES}/ioTvImageKeywordlistAlosPalsar.txt + ${TEMP}/ioTvImageKeywordlistAlosPalsar_saveState_loadState.txt otbImageKeywordlist ${LARGEDATA}/PALSAR/200801280007/l1data/VOL-ALPSRP037120700-H1.1__A ${TEMP}/ioTvImageKeywordlistAlosPalsar.txt + ${TEMP}/ioTvImageKeywordlistAlosPalsar_saveState_loadState.txt ) ADD_TEST(ioTvImageKeywordlistRadarSat1 ${IO_TESTS18} - --compare-ascii ${NOTOL} + --compare-n-ascii ${NOTOL} 2 ${BASELINE_FILES}/ioTvImageKeywordlistRadarSat1.txt ${TEMP}/ioTvImageKeywordlistRadarSat1.txt + ${BASELINE_FILES}/ioTvImageKeywordlistRadarSat1.txt + ${TEMP}/ioTvImageKeywordlistRadarSat1_saveState_loadState.txt otbImageKeywordlist ${LARGEDATA}/RADARSAT1/GOMA/SCENE01/DAT_01.001 ${TEMP}/ioTvImageKeywordlistRadarSat1.txt + ${TEMP}/ioTvImageKeywordlistRadarSat1_saveState_loadState.txt ) ADD_TEST(ioTvImageKeywordlistRadarSat2 ${IO_TESTS18} - --compare-ascii ${NOTOL} + --compare-n-ascii ${NOTOL} 2 ${BASELINE_FILES}/ioTvImageKeywordlistRadarSat2.txt ${TEMP}/ioTvImageKeywordlistRadarSat2.txt + ${BASELINE_FILES}/ioTvImageKeywordlistRadarSat2.txt + ${TEMP}/ioTvImageKeywordlistRadarSat2_saveState_loadState.txt otbImageKeywordlist ${LARGEDATA}/RADARSAT2/ALTONA/Fine_Quad-Pol_Dataset/PK6621_DK406_FQ9_20080405_124900_HH_VV_HV_VH_SLC_Altona/product.xml ${TEMP}/ioTvImageKeywordlistRadarSat2.txt + ${TEMP}/ioTvImageKeywordlistRadarSat2_saveState_loadState.txt ) ADD_TEST(ioTvImageKeywordlistTerraSarX ${IO_TESTS18} - --compare-ascii ${NOTOL} + --compare-n-ascii ${NOTOL} 2 ${BASELINE_FILES}/ioTvImageKeywordlistTerraSarX.txt ${TEMP}/ioTvImageKeywordlistTerraSarX.txt + ${BASELINE_FILES}/ioTvImageKeywordlistTerraSarX.txt + ${TEMP}/ioTvImageKeywordlistTerraSarX_saveState_loadState.txt otbImageKeywordlist ${LARGEDATA}/TERRASARX/dims/TSX-1.SAR.L1B/TSX1_SAR__SSC/TSX1_SAR__SSC.xml ${TEMP}/ioTvImageKeywordlistTerraSarX.txt + ${TEMP}/ioTvImageKeywordlistTerraSarX_saveState_loadState.txt ) ADD_TEST(ioTvImageKeywordlistTerraSarX_Upsala ${IO_TESTS18} - --compare-ascii ${NOTOL} + --compare-n-ascii ${NOTOL} 2 ${BASELINE_FILES}/ioTvImageKeywordlistTerraSarX_Upsala.txt ${TEMP}/ioTvImageKeywordlistTerraSarX_Upsala.txt + ${BASELINE_FILES}/ioTvImageKeywordlistTerraSarX_Upsala.txt + ${TEMP}/ioTvImageKeywordlistTerraSarX_Upsala_saveState_loadState.txt otbImageKeywordlist ${LARGEDATA}/TERRASARX/UPSALA_GLACIER/TSX1_SAR__MGD/TSX1_SAR__MGD.xml ${TEMP}/ioTvImageKeywordlistTerraSarX_Upsala.txt + ${TEMP}/ioTvImageKeywordlistTerraSarX_Upsala_saveState_loadState.txt ) ADD_TEST(ioTvImageKeywordlistTerraSarX_Toronto ${IO_TESTS18} - --compare-ascii ${NOTOL} + --compare-n-ascii ${NOTOL} 2 ${BASELINE_FILES}/ioTvImageKeywordlistTerraSarX_Toronto.txt ${TEMP}/ioTvImageKeywordlistTerraSarX_Toronto.txt + ${BASELINE_FILES}/ioTvImageKeywordlistTerraSarX_Toronto.txt + ${TEMP}/ioTvImageKeywordlistTerraSarX_Toronto_saveState_loadState.txt otbImageKeywordlist ${LARGEDATA}/TERRASARX/TORONTO/TSX1_SAR__SSC/TSX1_SAR__SSC.xml ${TEMP}/ioTvImageKeywordlistTerraSarX_Toronto.txt + ${TEMP}/ioTvImageKeywordlistTerraSarX_Toronto_saveState_loadState.txt ) ADD_TEST(ioTvImageKeywordlistErs ${IO_TESTS18} @@ -2087,6 +2120,7 @@ ADD_TEST(ioTvImageKeywordlistErs ${IO_TESTS18} otbImageKeywordlist ${LARGEDATA}/SAR_ERS2_SLCI_SCENE1/DAT_01.001 ${TEMP}/ioTvImageKeywordlistErs.txt + ${TEMP}/ioTvImageKeywordlistErs_saveState_loadState.txt ) ENDIF(OTB_DATA_USE_LARGEINPUT) diff --git a/Testing/Code/IO/otbImageKeywordlist.cxx b/Testing/Code/IO/otbImageKeywordlist.cxx index bed32d9594..2afa51f9d2 100644 --- a/Testing/Code/IO/otbImageKeywordlist.cxx +++ b/Testing/Code/IO/otbImageKeywordlist.cxx @@ -20,14 +20,22 @@ PURPOSE. See the above copyright notices for more information. #endif #include <iostream> -#include "otbVectorImage.h" -#include "otbImageFileReader.h" -# +#include <iomanip> +#include <fstream> +#include "otbMacro.h" +#include "otbImageKeywordlist.h" + +#include "base/ossimKeywordlist.h" +#include "projection/ossimProjection.h" +#include "projection/ossimProjectionFactoryRegistry.h" +#include "ossim/ossimPluginProjectionFactory.h" + + int otbImageKeywordlist( int argc, char* argv[] ) { - if (argc!=3) + if (argc!=4) { - std::cout << argv[0] <<" <input filename> <output filename>" + std::cout << argv[0] <<" <input filename> <output filename> <output filename2>" << std::endl; return EXIT_FAILURE; @@ -35,21 +43,50 @@ int otbImageKeywordlist( int argc, char* argv[] ) char * filename = argv[1]; char * outFilename = argv[2]; + char * outFilename2 = argv[3]; std::ofstream file; file.open(outFilename); file << std::setprecision(15); + std::ofstream file2; + file2.open(outFilename2); + file2 << std::setprecision(15); + + bool hasMetaData = false; + ossimKeywordlist geom_kwl, geom_kwl2, geom_kwl3; + + ossimProjectionFactoryRegistry::instance()->registerFactory(ossimplugins::ossimPluginProjectionFactory::instance()); + ossimProjection * projection = ossimProjectionFactoryRegistry::instance() + ->createProjection(ossimFilename(filename),0); + if (!projection) + { + otbMsgDevMacro( <<"OSSIM Instanciate projection FAILED ! "); + return EXIT_FAILURE; + } + hasMetaData = projection->saveState(geom_kwl); +std::cout << "geom_kwl:"<<geom_kwl<<std::endl; + otb::ImageKeywordlist otb_kwl; + otb_kwl.SetKeywordlist( geom_kwl ); - typedef otb::VectorImage<double, 2> ImageType; - typedef otb::ImageFileReader<ImageType> ReaderType; - ReaderType::Pointer reader = ReaderType::New(); - reader->SetFileName(filename); - reader->UpdateOutputInformation(); + otb_kwl.convertToOSSIMKeywordlist( geom_kwl2 ); +std::cout << "geom_kwl2:"<<geom_kwl2<<std::endl; + + hasMetaData = projection->loadState(geom_kwl2); + hasMetaData = projection->saveState(geom_kwl3); + otb::ImageKeywordlist otb_kwl2; + otb_kwl2.SetKeywordlist( geom_kwl3 ); +std::cout << "geom_kwl3:"<<geom_kwl3<<std::endl; file << "*** KEYWORD LIST ***\n"; - file << reader->GetOutput()->GetImageKeywordlist(); + file << otb_kwl; + file2 << "*** KEYWORD LIST ***\n"; + file2 << otb_kwl2; + file.close(); + file2.close(); + + return EXIT_SUCCESS; } diff --git a/Utilities/otbossimplugins/ossim/ossimTerraSarModel.cpp b/Utilities/otbossimplugins/ossim/ossimTerraSarModel.cpp index 66c6cc30a5..5af80985e7 100644 --- a/Utilities/otbossimplugins/ossim/ossimTerraSarModel.cpp +++ b/Utilities/otbossimplugins/ossim/ossimTerraSarModel.cpp @@ -37,6 +37,18 @@ static const char SR_GR_SF_KW[] = "sc_gr_sf"; static const char ALT_SR_GR_COEFFICIENT0_KW[] = "alt_sr_gr_coeff0"; static const char ALT_SR_GR_COEFFICIENT1_KW[] = "alt_sr_gr_coeff1"; static const char ALT_SR_GR_COEFFICIENT2_KW[] = "alt_sr_gr_coeff2"; +static const char PRODUCT_TYPE[] = "product_type"; +static const char RADIOMETRIC_CORRECTION[] = "radiometricCorrection"; + +static const char ACQUISITION_INFO[] = "acquisitionInfo."; +static const char IMAGING_MODE[] = "imagingMode"; +static const char SENSOR[] = "sensor"; +static const char LOOK_DIRECTION[] = "lookDirection"; +static const char POLARISATION_MODE[] = "polarisationMode"; +static const char POL_LAYER[] = "polLayer"; + + +static const char CALIBRATION_CALFACTOR[] = "calibration.calibrationConstant.calFactor"; using ::ossimString; using ::ossimXmlDocument; @@ -59,6 +71,15 @@ ossimplugins::ossimTerraSarModel::ossimTerraSarModel() _sceneCenterRangeTime(0.0), _SrToGr_scaling_factor(0.0), _alt_srgr_coefset(3), + _productType(), + _radiometricCorrection(), + _imagingMode(), + _acquisitionSensor(), + _lookDirection(), + _polarisationMode(), + _polLayer(), + _noise(0), + _calFactor(0.), theProductXmlFile() { } @@ -72,12 +93,26 @@ ossimplugins::ossimTerraSarModel::ossimTerraSarModel( _sceneCenterRangeTime(rhs._sceneCenterRangeTime), _SrToGr_scaling_factor(rhs._SrToGr_scaling_factor), _alt_srgr_coefset(rhs._alt_srgr_coefset), + _productType(rhs._productType), + _radiometricCorrection(rhs._radiometricCorrection), + _imagingMode(rhs._imagingMode), + _acquisitionSensor(rhs._acquisitionSensor), + _lookDirection(rhs._lookDirection), + _polarisationMode(rhs._polarisationMode), + _polLayer(rhs._polLayer), + _noise(rhs._noise), + _calFactor(rhs._calFactor), theProductXmlFile(rhs.theProductXmlFile) { } ossimplugins::ossimTerraSarModel::~ossimTerraSarModel() { + if (_noise != 0) + { + delete _noise; + } + } ossimString ossimplugins::ossimTerraSarModel::getClassName() const @@ -184,11 +219,39 @@ bool ossimplugins::ossimTerraSarModel::open(const ossimFilename& file) if (result) { result = initRefPoint(xdoc, tsDoc); + + if (result) + { + result = tsDoc.getProductType(xdoc, _productType); + + if (result) + { + result = tsDoc.getRadiometricCorrection(xdoc, _radiometricCorrection); + if (result) + { + result = initAcquisitionInfo(xdoc, tsDoc); + if (result) + { + result = initNoise(xdoc, tsDoc); + if (result) + { + ossimString s; + result = tsDoc.getCalFactor(xdoc, s); + _calFactor = s.toFloat64(); + } + } + } + } + + } + + } } } } } + } // matches: if ( xdoc->openFile(file) ) @@ -282,7 +345,26 @@ bool ossimplugins::ossimTerraSarModel::saveState(ossimKeywordlist& kwl, { // kwl.add(prefix, LOAD_FROM_PRODUCT_FILE_KW, "true"); } - + + kwl.add(prefix, PRODUCT_TYPE, _productType.c_str()); + kwl.add(prefix, RADIOMETRIC_CORRECTION, _radiometricCorrection.c_str()); + + ossimString kw = ACQUISITION_INFO; + ossimString kw2 = kw + IMAGING_MODE; + kwl.add(prefix, kw2, _imagingMode.c_str()); + kw2 = kw + SENSOR; + kwl.add(prefix, kw2, _acquisitionSensor.c_str()); + kw2 = kw + LOOK_DIRECTION; + kwl.add(prefix, kw2, _lookDirection.c_str()); + kw2 = kw + POLARISATION_MODE; + kwl.add(prefix, kw2, _polarisationMode.c_str()); + kw2 = kw + POL_LAYER; + kwl.add(prefix, kw2, _polLayer.c_str()); + + + _noise->saveState(kwl,prefix); + + kwl.add(prefix, CALIBRATION_CALFACTOR, ossimString::toString(_calFactor).c_str()); if (traceDebug()) { ossimNotify(ossimNotifyLevel_DEBUG) @@ -554,6 +636,40 @@ bool ossimplugins::ossimTerraSarModel::loadState (const ossimKeywordlist &kwl, } // matches: if (result) + // Load the base class. + if ( !_noise) + { + _noise = new Noise(); + } + if ( _noise->loadState(kwl, prefix) == false ) + { + if (traceDebug()) + { + ossimNotify(ossimNotifyLevel_WARN) + << MODULE + << "\n_noise->loadState failed!\n"; + } + result = false; + } + lookup = kwl.find(prefix, CALIBRATION_CALFACTOR); + if (lookup) + { + s = lookup; + _calFactor = s.toDouble(); + } + else + { + if (traceDebug()) + { + ossimNotify(ossimNotifyLevel_WARN) + << MODULE + << "\nRequired keyword not found: " + << CALIBRATION_CALFACTOR << "\n"; + } + result = false; + } + + if (traceDebug()) { ossimNotify(ossimNotifyLevel_DEBUG) @@ -566,6 +682,7 @@ bool ossimplugins::ossimTerraSarModel::loadState (const ossimKeywordlist &kwl, std::ostream& ossimplugins::ossimTerraSarModel::print(std::ostream& out) const { + static const char MODULE[] = "ossimplugins::ossimTerraSarModel::print"; // Capture the original flags. std::ios_base::fmtflags f = out.flags(); @@ -604,7 +721,34 @@ std::ostream& ossimplugins::ossimTerraSarModel::print(std::ostream& out) const ossimGeometricSarSensorModel::print(out); + if ( _noise->print(out) == false ) + { + if (traceDebug()) + { + ossimNotify(ossimNotifyLevel_WARN) + << MODULE + << "\n_noise->print failed!\n"; + } + } + + out << CALIBRATION_CALFACTOR << ": " << _calFactor << "\n"; // Reset flags. + + + ossimString kw = ACQUISITION_INFO; + ossimString kw2 = kw + IMAGING_MODE; + out << kw2 << ": " << _imagingMode.c_str()<< "\n"; + kw2 = kw + SENSOR; + out << kw2<< ": " << _acquisitionSensor.c_str()<< "\n"; + kw2 = kw + LOOK_DIRECTION; + out << kw2<< ": " << _lookDirection.c_str()<< "\n"; + kw2 = kw + POLARISATION_MODE; + out << kw2<< ": " << _polarisationMode.c_str()<< "\n"; + kw2 = kw + POL_LAYER; + out << kw2<< ": " << _polLayer.c_str()<< "\n"; + + + out.setf(f); return out; @@ -1407,5 +1551,76 @@ bool ossimplugins::ossimTerraSarModel::initRefPoint( return true; } +bool ossimplugins::ossimTerraSarModel::initAcquisitionInfo( + const ossimXmlDocument* xdoc, const ossimTerraSarProductDoc& tsDoc) +{ + static const char MODULE[] = "ossimplugins::ossimTerraSarModel::initAcquisitionInfo"; + + if (traceDebug()) + { + ossimNotify(ossimNotifyLevel_DEBUG)<< MODULE << " entered...\n"; + } + bool result = tsDoc.getImagingMode(xdoc, _imagingMode); + + if( result ) + { + result = tsDoc.getAcquisitionSensor(xdoc, _acquisitionSensor); + if( result ) + { + result = tsDoc.getLookDirection(xdoc, _lookDirection); + if( result ) + { + result = tsDoc.getPolarisationMode(xdoc, _polarisationMode); + if( result ) + { + result = tsDoc.getPolLayer(xdoc, _polLayer); + } + } + } + } + + + if (traceDebug()) + { + ossimNotify(ossimNotifyLevel_DEBUG) + << MODULE << " exit status = " << (result?"true":"false\n") + << std::endl; + } + + return result; +} + +bool ossimplugins::ossimTerraSarModel::initNoise( + const ossimXmlDocument* xdoc, const ossimTerraSarProductDoc& tsDoc) +{ + static const char MODULE[] = "ossimplugins::ossimTerraSarModel::initNoise"; + + if (traceDebug()) + { + ossimNotify(ossimNotifyLevel_DEBUG)<< MODULE << " entered...\n"; + } + + // Initialize the platform position interpolator. + if (_noise) + { + delete _noise; + } + + _noise = new Noise(); + + bool result = tsDoc.initNoise(xdoc, _noise); + + if (traceDebug()) + { + ossimNotify(ossimNotifyLevel_DEBUG) + << MODULE << " exit status = " << (result?"true":"false\n") + << std::endl; + } + + return result; +} + + + diff --git a/Utilities/otbossimplugins/ossim/ossimTerraSarModel.h b/Utilities/otbossimplugins/ossim/ossimTerraSarModel.h index 49d8a992fb..b6ad8b6af7 100644 --- a/Utilities/otbossimplugins/ossim/ossimTerraSarModel.h +++ b/Utilities/otbossimplugins/ossim/ossimTerraSarModel.h @@ -24,6 +24,7 @@ #include <list> #include <otb/CivilDateTime.h> +#include <otb/Noise.h> // Forward class declarations outside of namespace ossimplugins. class ossimXmlDocument; @@ -137,6 +138,24 @@ namespace ossimplugins */ bool initRefPoint(const ossimXmlDocument* xdoc, const ossimTerraSarProductDoc& rsDoc); + /** + * @brief Method to initialize AcquisitionInfo parameters from + * TerraSAR product xml file. + * @param xdoc Opened product xml file. + * @return true on success, false on error. + */ + bool initAcquisitionInfo( const ossimXmlDocument* xdoc, + const ossimTerraSarProductDoc& tsDoc); + + /** + * @brief Method to initialize ImageNoise parameters from + * TerraSAR product xml file. + * @param xdoc Opened product xml file. + * @return true on success, false on error. + */ + bool initNoise( + const ossimXmlDocument* xdoc, const ossimTerraSarProductDoc& tsDoc); + /** * @brief Slant Range TO Ground Range Projection reference point @@ -167,6 +186,51 @@ namespace ossimplugins */ std::vector<double> _alt_srgr_coefset; + /** + * @brief ProductType. + */ + ossimString _productType; + + /** + * @brief RadiometricCorrection. + */ + ossimString _radiometricCorrection; + + /** + * @brief ImagingMode (AcquisitionInfo node). + */ + ossimString _imagingMode; + + /** + * @brief Sensor (AcquisitionInfo node). + */ + ossimString _acquisitionSensor; + + /** + * @brief LookDirection (AcquisitionInfo node). + */ + ossimString _lookDirection; + + /** + * @brief PolarisationMode (AcquisitionInfo node). + */ + ossimString _polarisationMode; + + /** + * @brief PolLayer (AcquisitionInfo node). + */ + ossimString _polLayer; + + /** + * @brief Noise (Noise node). + */ + Noise *_noise; + + /** + * @brief CalFactor (Calibration node). + */ + double _calFactor; + ossimFilename theProductXmlFile; TYPE_DATA diff --git a/Utilities/otbossimplugins/ossim/ossimTerraSarProductDoc.cpp b/Utilities/otbossimplugins/ossim/ossimTerraSarProductDoc.cpp index eba3cd8c07..ccec450c49 100644 --- a/Utilities/otbossimplugins/ossim/ossimTerraSarProductDoc.cpp +++ b/Utilities/otbossimplugins/ossim/ossimTerraSarProductDoc.cpp @@ -14,14 +14,16 @@ #include <ossimTerraSarProductDoc.h> #include <ossimPluginCommon.h> -#include <otb/CivilDateTime.h> #include <otb/Ephemeris.h> #include <otb/GeographicEphemeris.h> #include <otb/JSDDateTime.h> +#include <otb/CivilDateTime.h> #include <otb/PlatformPosition.h> #include <otb/SarSensor.h> #include <otb/SensorParams.h> #include <otb/RefPoint.h> +#include <otb/Noise.h> +#include <otb/ImageNoise.h> #include <ossim/base/ossimDpt.h> #include <ossim/base/ossimFilename.h> #include <ossim/base/ossimGpt.h> @@ -704,6 +706,20 @@ bool ossimplugins::ossimTerraSarProductDoc::getProjection( return ossim::getPath(path, xdoc, s); } +bool ossimplugins::ossimTerraSarProductDoc::getProductType( + const ossimXmlDocument* xdoc, ossimString& s) const +{ + ossimString path = "/level1Product/productInfo/productVariantInfo/productType"; + return ossim::getPath(path, xdoc, s); +} +bool ossimplugins::ossimTerraSarProductDoc::getRadiometricCorrection( + const ossimXmlDocument* xdoc, ossimString& s) const +{ + ossimString path = "/level1Product/productInfo/productVariantInfo/radiometricCorrection"; + return ossim::getPath(path, xdoc, s); +} + + bool ossimplugins::ossimTerraSarProductDoc::getReferencePoint( const ossimXmlDocument* xdoc, ossimString& s) const { @@ -893,3 +909,201 @@ bool ossimplugins::ossimTerraSarProductDoc::getRowSpacing( "/level1Product/productInfo/imageDataInfo/imageRaster/rowSpacing"; return ossim::getPath(path, xdoc, s); } + +bool ossimplugins::ossimTerraSarProductDoc::getImagingMode( + const ossimXmlDocument* xdoc, ossimString& s) const +{ + ossimString path = + "/level1Product/productInfo/acquisitionInfo/imagingMode"; + return ossim::getPath(path, xdoc, s); +} +bool ossimplugins::ossimTerraSarProductDoc::getAcquisitionSensor( + const ossimXmlDocument* xdoc, ossimString& s) const +{ + ossimString path = + "/level1Product/productInfo/acquisitionInfo/sensor"; + return ossim::getPath(path, xdoc, s); +} +bool ossimplugins::ossimTerraSarProductDoc::getPolarisationMode( + const ossimXmlDocument* xdoc, ossimString& s) const +{ + ossimString path = + "/level1Product/productInfo/acquisitionInfo/polarisationMode"; + return ossim::getPath(path, xdoc, s); +} +bool ossimplugins::ossimTerraSarProductDoc::getPolLayer( + const ossimXmlDocument* xdoc, ossimString& s) const +{ + ossimString path = + "/level1Product/productInfo/acquisitionInfo/polarisationList/polLayer"; + return ossim::getPath(path, xdoc, s); +} +bool ossimplugins::ossimTerraSarProductDoc::getCalFactor( + const ossimXmlDocument* xdoc, ossimString& s) const +{ + ossimString path = + "/level1Product/calibration/calibrationConstant/calFactor"; + return ossim::getPath(path, xdoc, s); +} + +bool ossimplugins::ossimTerraSarProductDoc::initNoise( + const ossimXmlDocument* xdoc, ossimplugins::Noise* noise) const +{ + static const char MODULE[] = + "ossimplugins::ossimTerraSarProductDoc::initImageNoise"; + if (traceDebug()) + { + ossimNotify(ossimNotifyLevel_DEBUG)<< MODULE << " entered...\n"; + } + + bool result = true; + + if ( xdoc && noise ) + { + ossimString path = + "/level1Product/noise/numberOfNoiseRecords"; + ossimString s; + ossim::getPath(path, xdoc, s); + std::vector<ImageNoise> tabImageNoise; + tabImageNoise.clear(); + noise->set_numberOfNoiseRecords(s.toInt32()); + + // Get all the stateVector nodes. + path = + "/level1Product/noise/imageNoise"; + std::vector<ossimRefPtr<ossimXmlNode> > xnodes; + xdoc->findNodes(path, xnodes); + if ( xnodes.size() ) + { + const std::vector<ossimRefPtr<ossimXmlNode> >::size_type COUNT = + xnodes.size(); +// ossim::iso8601TimeStringToCivilDate( + + int nbrData = 0; // to keep track of good stateVector count. + + ossimRefPtr<ossimXmlNode> svNode = 0; // stateVector node + + for (ossim_uint32 i = 0 ; i < COUNT; ++i) + { + ImageNoise ev; + svNode = xnodes[i]; + if ( !svNode ) + { + result = false; + break; + } + + ossimString s; + + path = "timeUTC"; + result = ossim::findFirstNode(path, svNode, s); + if (result) + { + ev.set_timeUTC(s); + } + else + { + result = false; + ossimNotify(ossimNotifyLevel_WARN) + << MODULE << " ERROR:\nNode not found: " << path + << std::endl; + break; + } + + path = "noiseEstimate/validityRangeMin"; + result = ossim::findFirstNode(path, svNode, s); + if (result) + { + ev.set_validityRangeMin( s.toDouble() ); + } + else + { + result = false; + ossimNotify(ossimNotifyLevel_WARN) + << MODULE << " ERROR:\nNode not found: " << path + << std::endl; + break; + } + path = "noiseEstimate/validityRangeMax"; + result = ossim::findFirstNode(path, svNode, s); + if (result) + { + ev.set_validityRangeMax( s.toDouble() ); + } + else + { + result = false; + ossimNotify(ossimNotifyLevel_WARN) + << MODULE << " ERROR:\nNode not found: " << path + << std::endl; + break; + } + path = "noiseEstimate/referencePoint"; + result = ossim::findFirstNode(path, svNode, s); + if (result) + { + ev.set_referencePoint( s.toDouble() ); + } + else + { + result = false; + ossimNotify(ossimNotifyLevel_WARN) + << MODULE << " ERROR:\nNode not found: " << path + << std::endl; + break; + } + path = "noiseEstimate/polynomialDegree"; + result = ossim::findFirstNode(path, svNode, s); + if (result) + { + ev.set_polynomialDegree( s.toInt32() ); + } + else + { + result = false; + ossimNotify(ossimNotifyLevel_WARN) + << MODULE << " ERROR:\nNode not found: " << path + << std::endl; + break; + } + //Read Coefficient + + ossimXmlNode::ChildListType nodelist; + svNode->findChildNodes("noiseEstimate/coefficient",nodelist); + + ossimXmlNode::ChildListType::const_iterator child_iter = nodelist.begin(); + std::vector<double> polynomialCoefficients; + while(child_iter != nodelist.end()) + { + double coefficient = ((*child_iter)->getText()).toDouble() ; + polynomialCoefficients.push_back(coefficient); + ++child_iter; + } + ev.set_polynomialCoefficients( polynomialCoefficients ); + + tabImageNoise.push_back(ev); + ++nbrData; + + + } // matches: for (ossim_uint32 i = 0 ; i < COUNT; ++i) + + noise->set_imageNoise(tabImageNoise); + + } // matches: if ( xnodes.size() ) + + } // matches: if (xdoc && pos) + else + { + result = false; + } + + if (traceDebug()) + { + ossimNotify(ossimNotifyLevel_DEBUG) + << MODULE << " exit status = " << (result?"true\n":"false\n"); + } + + return result; +} + + diff --git a/Utilities/otbossimplugins/ossim/ossimTerraSarProductDoc.h b/Utilities/otbossimplugins/ossim/ossimTerraSarProductDoc.h index dd36e6aa41..8beecec796 100644 --- a/Utilities/otbossimplugins/ossim/ossimTerraSarProductDoc.h +++ b/Utilities/otbossimplugins/ossim/ossimTerraSarProductDoc.h @@ -35,6 +35,7 @@ namespace ossimplugins class PlatformPosition; class RefPoint; class SensorParams; + class Noise; /** @brief Class to encapsulate parsing TerraSAR product xml file. */ class ossimTerraSarProductDoc @@ -201,6 +202,42 @@ namespace ossimplugins bool getGeodeticTerrainHeight(const ossimXmlDocument* xdoc, ossimString& s) const; + + bool getProductType(const ossimXmlDocument* xdoc, + ossimString& s) const; + + bool getRadiometricCorrection(const ossimXmlDocument* xdoc, + ossimString& s) const; + bool getImagingMode(const ossimXmlDocument* xdoc, + ossimString& s) const; + bool getAcquisitionSensor(const ossimXmlDocument* xdoc, + ossimString& s) const; + bool getPolarisationMode(const ossimXmlDocument* xdoc, + ossimString& s) const; + bool getPolLayer(const ossimXmlDocument* xdoc, + ossimString& s) const; + bool getCalFactor(const ossimXmlDocument* xdoc, + ossimString& s) const; + + /** + * @brief Method to initialize Noise object from + * TerraSAR product xml file. + * @param xdoc Opened product xml file. + * @param pos Pointer to PlatformPosition object. + * @return true on success, false on error. + */ + bool initNoise(const ossimXmlDocument* xdoc, + Noise* pos) const; + +/* + bool getImageNoiseTimeUTC(const ossimXmlDocument* xdoc, ossimString& s) const; + bool getImageNoiseValidityRangeMin(const ossimXmlDocument* xdoc, ossimString& s) const; + bool getImageNoiseValidityRangeMax(const ossimXmlDocument* xdoc, ossimString& s) const; + bool getImageNoiseReferencePoint(const ossimXmlDocument* xdoc, ossimString& s) const; + bool getImageNoisePolynomialCoefficient( const ossimXmlDocument* xdoc, std::vector<double>& polynomialCoefficient) const; + +*/ + }; } // End: namespace ossimplugins diff --git a/Utilities/otbossimplugins/ossim/otb/ImageNoise.cpp b/Utilities/otbossimplugins/ossim/otb/ImageNoise.cpp new file mode 100644 index 0000000000..b4cfd6a6dc --- /dev/null +++ b/Utilities/otbossimplugins/ossim/otb/ImageNoise.cpp @@ -0,0 +1,281 @@ +//---------------------------------------------------------------------------- +// +// "Copyright Centre National d'Etudes Spatiales" +// +// License: LGPL +// +// See LICENSE.txt file in the top level directory for more details. +// +//---------------------------------------------------------------------------- +// $Id$ + +#include <ImageNoise.h> +#include <ossim/base/ossimDpt3d.h> +#include <ossim/base/ossimKeywordlist.h> +#include <ossim/base/ossimNotify.h> +#include <ossim/base/ossimString.h> + +namespace ossimplugins +{ + + +static const char PREFIX[] = "imageNoise."; +static const char TIME_UTC[] = "timeUTC"; +static const char NOISE_ESTIMATE[] = "noiseEstimate."; +static const char REFERENCE_POINT[] = "referencePoint"; +static const char VALIDITY_RANGE_MIN[] = "validityRangeMin"; +static const char VALIDITY_RANGE_MAX[] = "validityRangeMax"; +static const char POLYNOMIAL_DEGREE[] = "polynomialDegree"; +static const char COEFFICIENT[] = "coefficient"; +static const char NOISE_ESTIMATE_CONFIDENCE[] = "noiseEstimateConfidence"; + +ImageNoise::ImageNoise(): + _timeUTC(), + _validityRangeMin(0.), + _validityRangeMax(0.), + _referencePoint(0.), + _polynomialDegree(0), + _polynomialCoefficients(0) +{ +} + +ImageNoise::~ImageNoise() +{ +} + + +ImageNoise::ImageNoise(const ImageNoise& rhs): + _timeUTC(rhs._timeUTC), + _validityRangeMin(rhs._validityRangeMin), + _validityRangeMax(rhs._validityRangeMax), + _referencePoint(rhs._referencePoint), + _polynomialDegree(rhs._polynomialDegree), + _polynomialCoefficients(rhs._polynomialCoefficients) +{ +} + +ImageNoise& ImageNoise::operator=(const ImageNoise& rhs) +{ + _timeUTC = rhs._timeUTC; + _validityRangeMin = rhs._validityRangeMin; + _validityRangeMax = rhs._validityRangeMax; + _referencePoint = rhs._referencePoint; + _polynomialDegree = rhs._polynomialDegree; + _polynomialCoefficients = rhs._polynomialCoefficients; + return *this; +} + +bool ImageNoise::saveState(ossimKeywordlist& kwl, const char* prefix) const +{ + std::string pfx; + std::string pfx2; + if (prefix) + { + pfx = prefix; + } + pfx += PREFIX; + kwl.add(pfx.c_str(), TIME_UTC, _timeUTC); + + pfx2 = pfx + NOISE_ESTIMATE; + kwl.add(pfx2.c_str(), VALIDITY_RANGE_MIN, _validityRangeMin); + kwl.add(pfx2.c_str(), VALIDITY_RANGE_MAX, _validityRangeMax); + kwl.add(pfx2.c_str(), REFERENCE_POINT, _referencePoint); + kwl.add(pfx2.c_str(), POLYNOMIAL_DEGREE, _polynomialDegree); + + for(unsigned int i=0 ; i<_polynomialCoefficients.size();i++) + { + ossimString iStr = ossimString::toString(i); + ossimString kw = ossimString(COEFFICIENT) + "["+iStr+ "]"; + kwl.add(pfx2.c_str(), kw.c_str(), _polynomialCoefficients[i]); + } + + return true; +} + +bool ImageNoise::loadState(const ossimKeywordlist& kwl, const char* prefix) +{ + static const char MODULE[] = "ImageNoise::loadState"; + bool result = true; + std::string pfx; + std::string pfx2; + if (prefix) + { + pfx = prefix; + } + ossimString s; + const char* lookup = 0; + + pfx += PREFIX; + lookup = kwl.find(pfx.c_str(), TIME_UTC); + if (lookup) + { + s = lookup; + _timeUTC = s; + } + else + { + ossimNotify(ossimNotifyLevel_WARN) + << MODULE << " Keyword not found: " << TIME_UTC << " in "<<pfx.c_str()<<" path.\n"; + result = false; + } + pfx2 = pfx + NOISE_ESTIMATE; + lookup = kwl.find(pfx2.c_str(), VALIDITY_RANGE_MIN); + if (lookup) + { + s = lookup; + _validityRangeMin = s.toDouble(); + } + else + { + ossimNotify(ossimNotifyLevel_WARN) + << MODULE << " Keyword not found: " << VALIDITY_RANGE_MIN << " in "<<pfx2.c_str()<<" path.\n"; + result = false; + } + lookup = kwl.find(pfx2.c_str(), VALIDITY_RANGE_MAX); + if (lookup) + { + s = lookup; + _validityRangeMax = s.toDouble(); + } + else + { + ossimNotify(ossimNotifyLevel_WARN) + << MODULE << " Keyword not found: " << VALIDITY_RANGE_MAX << " in "<<pfx2.c_str()<<" path\n"; + result = false; + } + lookup = kwl.find(pfx2.c_str(), REFERENCE_POINT); + if (lookup) + { + s = lookup; + _referencePoint = s.toDouble(); + } + else + { + ossimNotify(ossimNotifyLevel_WARN) + << MODULE << " Keyword not found: " << REFERENCE_POINT << " in "<<pfx2.c_str()<<" path\n"; + result = false; + } + lookup = kwl.find(pfx2.c_str(), POLYNOMIAL_DEGREE); + if (lookup) + { + s = lookup; + _polynomialDegree = s.toInt32(); + } + else + { + ossimNotify(ossimNotifyLevel_WARN) + << MODULE << " Keyword not found: " << POLYNOMIAL_DEGREE << " in "<<pfx2.c_str()<<" path\n"; + result = false; + } + + for(unsigned int i=0 ; i<_polynomialDegree+1;i++) + { + ossimString iStr = ossimString::toString(i); + ossimString kw = ossimString(COEFFICIENT) + "["+iStr+ "]"; + lookup = kwl.find(pfx2.c_str(), kw.c_str()); + if (lookup) + { + s = lookup; + _polynomialCoefficients.push_back( s.toDouble() ); + } + else + { + ossimNotify(ossimNotifyLevel_WARN) + << MODULE << " Keyword not found: " << kw.c_str() << " in "<<pfx2.c_str()<<" path\n"; + result = false; + } + } + + +/* + pfx += "ImageNoise."; + + const char* lookup = 0; + ossimString s; + double d; + + lookup = kwl.find(pfx.c_str(), DATE_JULIAN_KW); + if (lookup) + { + s = lookup; + d = s.toDouble(); + JulianDate jd(d); + _date.set_day0hTU(jd); + } + else + { + ossimNotify(ossimNotifyLevel_WARN) + << MODULE << " Keyword not found: " << DATE_JULIAN_KW << "\n"; + + result = false; + } + + lookup = kwl.find(pfx.c_str(), DATE_SECOND_KW); + if (lookup) + { + s = lookup; + d = s.toDouble(); + _date.set_second(d); + } + else + { + ossimNotify(ossimNotifyLevel_WARN) + << MODULE << " Keyword not found: " << DATE_SECOND_KW << "\n"; + result = false; + } + + lookup = kwl.find(pfx.c_str(), DATE_DECIMAL_KW); + if (lookup) + { + s = lookup; + d = s.toDouble(); + _date.set_decimal(d); + } + else + { + ossimNotify(ossimNotifyLevel_WARN) + << MODULE << " Keyword not found: " << DATE_DECIMAL_KW << "\n"; + result = false; + } + + lookup = kwl.find(pfx.c_str(), POSITION_KW); + if (lookup) + { + std::string ps = lookup; + + ossimDpt3d pt; + pt.toPoint(ps); + + _position[0] = pt.x; + _position[1] = pt.y; + _position[2] = pt.z; + } + else + { + ossimNotify(ossimNotifyLevel_WARN) + << MODULE << " Keyword not found: " << POSITION_KW << "\n"; + result = false; + } + + lookup = kwl.find(pfx.c_str(), VELOCITY_KW); + if (lookup) + { + std::string ps = lookup; + + ossimDpt3d pt; + pt.toPoint(ps); + + _vitesse[0] = pt.x; + _vitesse[1] = pt.y; + _vitesse[2] = pt.z; + } + else + { + ossimNotify(ossimNotifyLevel_WARN) + << MODULE << " Keyword not found: " << VELOCITY_KW << "\n"; + result = false; + } +*/ + return result; +} +} diff --git a/Utilities/otbossimplugins/ossim/otb/ImageNoise.h b/Utilities/otbossimplugins/ossim/otb/ImageNoise.h new file mode 100644 index 0000000000..29729a8c89 --- /dev/null +++ b/Utilities/otbossimplugins/ossim/otb/ImageNoise.h @@ -0,0 +1,124 @@ +//---------------------------------------------------------------------------- +// +// "Copyright Centre National d'Etudes Spatiales" +// +// License: LGPL +// +// See LICENSE.txt file in the top level directory for more details. +// +//---------------------------------------------------------------------------- +// $Id$ + +#ifndef ImageNoise_h +#define ImageNoise_h + +#include <vector> +#include <ossim/base/ossimString.h> + +class ossimKeywordlist; + +namespace ossimplugins +{ + + +/** + * @ingroup ImageNoise + * @brief This class represents an ImageNoise + */ +class ImageNoise +{ +public: + /** + * @brief Constructor + */ + ImageNoise(); + + /** + * @brief Destructor + */ + virtual ~ImageNoise(); + + /** + * @brief Copy constructor + */ + ImageNoise(const ImageNoise& rhs); + + /** + * @brief Affectation operator + */ + ImageNoise& operator=(const ImageNoise& rhs); + + /** + * @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. + */ + bool saveState(ossimKeywordlist& kwl, const char* prefix=0) const; + + /** + * @brief Method to the load (recreate) the state of the object from a + * keyword list. Return true if ok or false on error. + * @return true if load OK, false on error + */ + bool loadState (const ossimKeywordlist &kwl, const char *prefix=0); + + void set_timeUTC(const ossimString& value) + { + _timeUTC = value; + } + void set_validityRangeMin(double value) + { + _validityRangeMin = value; + } + void set_validityRangeMax(double value) + { + _validityRangeMax = value; + } + void set_referencePoint(double value) + { + _referencePoint = value; + } + void set_polynomialDegree(unsigned int value) + { + _polynomialDegree = value; + } + void set_polynomialCoefficients(const std::vector<double>& value) + { + _polynomialCoefficients = value; + } + +protected: + + /** + * @brief TimeUTC (Noise/ImageNoise node). + */ + ossimString _timeUTC; + + /** + * @brief ValidityRangeMin (Noise/ImageNoise node). + */ + double _validityRangeMin; + /** + * @brief ValidityRangeMax (Noise/ImageNoise node). + */ + double _validityRangeMax; + /** + * @brief Reference point (Noise/ImageNoise node). + */ + double _referencePoint; + + /** + * @brief Polynomial degree (Noise/ImageNoise node). + */ + unsigned int _polynomialDegree; + /** + * @brief Polynomial coefficients (Noise/ImageNoise node). + */ + std::vector<double> _polynomialCoefficients; + +private: +}; +} + +#endif diff --git a/Utilities/otbossimplugins/ossim/otb/Noise.cpp b/Utilities/otbossimplugins/ossim/otb/Noise.cpp new file mode 100644 index 0000000000..ea12fa0d26 --- /dev/null +++ b/Utilities/otbossimplugins/ossim/otb/Noise.cpp @@ -0,0 +1,136 @@ +//---------------------------------------------------------------------------- +// +// "Copyright Centre National d'Etudes Spatiales" +// +// License: LGPL +// +// See LICENSE.txt file in the top level directory for more details. +// +//---------------------------------------------------------------------------- +// $Id$ + +#include <Noise.h> +#include <ossim/base/ossimDpt3d.h> +#include <ossim/base/ossimKeywordlist.h> +#include <ossim/base/ossimNotify.h> +#include <ossim/base/ossimString.h> + + +namespace ossimplugins +{ +static const char NOISE[] = "noise"; +static const char NUMBER_OF_NOISE_RECORDS_KW[] = "numberOfNoiseRecords"; + +Noise::Noise(): + _numberOfNoiseRecords(0), + _tabImageNoise() +{ +} + +Noise::~Noise() +{ +} + + +Noise::Noise(const Noise& rhs): + _numberOfNoiseRecords(rhs._numberOfNoiseRecords), + _tabImageNoise(rhs._tabImageNoise) +{ +} + +Noise& Noise::operator=(const Noise& rhs) +{ + _numberOfNoiseRecords = rhs._numberOfNoiseRecords; + _tabImageNoise = rhs._tabImageNoise; + return *this; +} + +bool Noise::saveState(ossimKeywordlist& kwl, const char* prefix) const +{ + std::string pfx; + if (prefix) + { + pfx = prefix; + } + pfx += NOISE; + std::string s = pfx + "." + NUMBER_OF_NOISE_RECORDS_KW; + kwl.add(prefix, s.c_str(), _numberOfNoiseRecords); + for (unsigned int i = 0; i < _tabImageNoise.size(); ++i) + { + std::string s2 = pfx + "[" + ossimString::toString(i) + "]"; + _tabImageNoise[i].saveState(kwl, s2.c_str()); + } + + return true; +} + +bool Noise::loadState(const ossimKeywordlist& kwl, const char* prefix) +{ + static const char MODULE[] = "Noise::loadState"; + + bool result = true; + + std::string pfx(""); + if (prefix) + { + pfx = prefix; + } + pfx += NOISE; + + ossimString s; + const char* lookup = 0; + std::string s1 = pfx + "."; + + lookup = kwl.find(s1.c_str(), NUMBER_OF_NOISE_RECORDS_KW); + if (lookup) + { + s = lookup; + _numberOfNoiseRecords = s.toUInt32(); + } + else + { + ossimNotify(ossimNotifyLevel_WARN) + << MODULE << " Keyword not found: " << NUMBER_OF_NOISE_RECORDS_KW << "\n"; + result = false; + } + + _tabImageNoise.clear(); + for (unsigned int i = 0; i < _numberOfNoiseRecords; ++i) + { + std::string s2 = pfx + "[" + ossimString::toString(i) + "]"; + ImageNoise in; + result = in.loadState(kwl, s2.c_str()); + _tabImageNoise.push_back(in); + } + if( _numberOfNoiseRecords != _tabImageNoise.size() ) + { + ossimNotify(ossimNotifyLevel_WARN) + << MODULE << " Keyword " << NUMBER_OF_NOISE_RECORDS_KW << " is different with the number of ImageNoise nodes \n"; + } + return result; +} + + +std::ostream& Noise::print(std::ostream& out) const +{ + out << setprecision(15) << setiosflags(ios::fixed) + << "\n Noise class data members:\n"; + + const char* prefix = 0; + ossimKeywordlist kwl; + ossimString pfx; + pfx += NOISE; + std::string s = pfx + "." + NUMBER_OF_NOISE_RECORDS_KW; + kwl.add(prefix, s.c_str(), _numberOfNoiseRecords); + for (unsigned int i = 0; i < _tabImageNoise.size(); ++i) + { + std::string s2 = pfx + "[" + ossimString::toString(i) + "]"; + _tabImageNoise[i].saveState(kwl, s2.c_str()); + } + + out << kwl; + + return out; +} + +} diff --git a/Utilities/otbossimplugins/ossim/otb/Noise.h b/Utilities/otbossimplugins/ossim/otb/Noise.h new file mode 100644 index 0000000000..ddedea5c06 --- /dev/null +++ b/Utilities/otbossimplugins/ossim/otb/Noise.h @@ -0,0 +1,95 @@ +//---------------------------------------------------------------------------- +// +// "Copyright Centre National d'Etudes Spatiales" +// +// License: LGPL +// +// See LICENSE.txt file in the top level directory for more details. +// +//---------------------------------------------------------------------------- +// $Id$ + +#ifndef Noise_h +#define Noise_h + +#include <JSDDateTime.h> +#include <otb/ImageNoise.h> +#include <ossim/base/ossimConstants.h> + +class ossimKeywordlist; + +namespace ossimplugins +{ + +/** + * @ingroup Noise + * @brief This class represents an Noise + */ +class Noise +{ +public: + /** + * @brief Constructor + */ + Noise(); + + /** + * @brief Destructor + */ + virtual ~Noise(); + + /** + * @brief Copy constructor + */ + Noise(const Noise& rhs); + + /** + * @brief Affectation operator + */ + Noise& operator=(const Noise& rhs); + + /** + * @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. + */ + bool saveState(ossimKeywordlist& kwl, const char* prefix=0) const; + + /** + * @brief Method to the load (recreate) the state of the object from a + * keyword list. Return true if ok or false on error. + * @return true if load OK, false on error + */ + bool loadState (const ossimKeywordlist &kwl, const char *prefix=0); + /*! + * METHOD: print() + * Fulfills base-class pure virtual. Dumps contents of object to ostream. + */ + virtual std::ostream& print(std::ostream& out) const; + + void set_numberOfNoiseRecords(const ossim_int32& numberOfNoiseRecords) + { + _numberOfNoiseRecords = numberOfNoiseRecords; + } + void set_imageNoise(const std::vector<ImageNoise>& image_noise) + { + _tabImageNoise = image_noise; + } + +protected: + + /** + * @brief Image Noise. + */ + ossim_uint32 _numberOfNoiseRecords; + /** + * @brief Image Noise. + */ + std::vector<ImageNoise> _tabImageNoise; + +private: +}; +} + +#endif -- GitLab