diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1SarSensorModel.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1SarSensorModel.cpp deleted file mode 100644 index e7c46c34030de013816e6d164608d23d6979d250..0000000000000000000000000000000000000000 --- a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1SarSensorModel.cpp +++ /dev/null @@ -1,377 +0,0 @@ -/* - * Copyright (C) 2005-2019 by Centre National d'Etudes Spatiales (CNES) - * - * This file is licensed under MIT license: - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - - -#include <ossimSentinel1SarSensorModel.h> -#include <ossim/base/ossimXmlDocument.h> -#include "ossim/ossimXmlTools.h" - -namespace {// Anonymous namespace - const ossimString attAzimuthTime = "azimuthTime"; - const ossimString attFirstValidSample = "firstValidSample"; - const ossimString attLastValidSample = "lastValidSample"; - const ossimString attGr0 = "gr0"; - const ossimString attGrsrCoefficients = "grsrCoefficients"; - const ossimString attHeight = "height"; - const ossimString attLatitude = "latitude"; - const ossimString attLine = "line"; - const ossimString attLongitude = "longitude"; - const ossimString attPixel = "pixel"; - const ossimString attPosition = "position"; - const ossimString attSlantRangeTime = "slantRangeTime"; - const ossimString attSr0 = "sr0"; - const ossimString attSrgrCoefficients = "srgrCoefficients"; - const ossimString attTime = "time"; - const ossimString attVelocity = "velocity"; - const ossimString attX = "x"; - const ossimString attY = "y"; - const ossimString attZ = "z"; -}// Anonymous namespace - -#if defined(USE_BOOST_TIME) - using boost::posix_time::microseconds; - using boost::posix_time::seconds; -#else - using ossimplugins::time::microseconds; - using ossimplugins::time::seconds; -#endif -void ossimplugins::ossimSentinel1SarSensorModel::readCoordinates( - ossimXmlDocument const& xmlDoc, ossimString const& xpath, - ossimString const& rg0_xpath, ossimString const& coeffs_xpath, - std::vector<CoordinateConversionRecordType> & outputRecords) -{ - std::vector<ossimRefPtr<ossimXmlNode> > xnodes; - xmlDoc.findNodes(xpath, xnodes); - - for(std::vector<ossimRefPtr<ossimXmlNode> >::iterator itNode = xnodes.begin(); itNode!=xnodes.end();++itNode) - { - CoordinateConversionRecordType coordRecord; - - coordRecord.azimuthTime = getTimeFromFirstNode(**itNode, attAzimuthTime); - - coordRecord.rg0 = getDoubleFromFirstNode(**itNode, rg0_xpath);; - - ossimString const& s = getTextFromFirstNode(**itNode, coeffs_xpath); - std::vector<ossimString> ssplit = s.split(" "); - - if (ssplit.empty()) - { - throw std::runtime_error(("The "+rg0_xpath+" record has an empty coef vector").string()); - } - for (std::vector<ossimString>::const_iterator cIt = ssplit.begin(), e = ssplit.end() - ; cIt != e - ; ++cIt - ) - { - coordRecord.coefs.push_back(cIt->toDouble()); - } - assert(!coordRecord.coefs.empty()&&"The rg0 record has empty coefs vector."); - - outputRecords.push_back(coordRecord); - } -} - -namespace ossimplugins -{ -void ossimSentinel1SarSensorModel::readAnnotationFile(const std::string & annotationXml) -{ - ossimRefPtr<ossimXmlDocument> xmlDoc = new ossimXmlDocument(annotationXml); - const ossimXmlNode & xmlRoot = *xmlDoc->getRoot(); - - //Parse specific metadata for Sentinel1 - //TODO add as members to the Sentinel1SarSensorModel - const std::string & product_type = getTextFromFirstNode(xmlRoot, "adsHeader/productType"); - const std::string & mode = getTextFromFirstNode(xmlRoot, "adsHeader/mode"); - const std::string & swath = getTextFromFirstNode(xmlRoot, "adsHeader/swath"); - const std::string & polarisation = getTextFromFirstNode(xmlRoot, "adsHeader/polarisation"); - - theProductType = ProductType(product_type); - - // First, lookup position/velocity records - std::vector<ossimRefPtr<ossimXmlNode> > xnodes; - xmlDoc->findNodes("/product/generalAnnotation/orbitList/orbit",xnodes); - - //TODO uncomment and adapt following code from s1_inverse to fill - //SarSensorModel structure - - for(std::vector<ossimRefPtr<ossimXmlNode> >::iterator itNode = xnodes.begin(); itNode!=xnodes.end();++itNode) - { - OrbitRecordType orbitRecord; - - // Retrieve acquisition time - orbitRecord.azimuthTime = getTimeFromFirstNode(**itNode, attTime); - - // Retrieve ECEF position - ossimXmlNode const& positionNode = getExpectedFirstNode(**itNode, attPosition); - orbitRecord.position[0] = getDoubleFromFirstNode(positionNode, attX); - orbitRecord.position[1] = getDoubleFromFirstNode(positionNode, attY); - orbitRecord.position[2] = getDoubleFromFirstNode(positionNode, attZ); - - // Retrieve ECEF velocity - ossimXmlNode const& velocityNode = getExpectedFirstNode(**itNode, attVelocity); - orbitRecord.velocity[0] = getDoubleFromFirstNode(velocityNode, attX); - orbitRecord.velocity[1] = getDoubleFromFirstNode(velocityNode, attY); - orbitRecord.velocity[2] = getDoubleFromFirstNode(velocityNode, attZ); - - //Add one orbits record - theOrbitRecords.push_back(orbitRecord); - } - - //Parse the near range time (in seconds) - theNearRangeTime = getDoubleFromFirstNode(xmlRoot, "imageAnnotation/imageInformation/slantRangeTime"); - - //Parse the range sampling rate - theRangeSamplingRate = getDoubleFromFirstNode(xmlRoot, "generalAnnotation/productInformation/rangeSamplingRate"); - - //Parse the range resolution - theRangeResolution = getDoubleFromFirstNode(xmlRoot, "imageAnnotation/imageInformation/rangePixelSpacing"); - - //Parse the radar frequency - theRadarFrequency = getDoubleFromFirstNode(xmlRoot, "generalAnnotation/productInformation/radarFrequency"); - - //Parse azimuth time interval - const double azimuthTimeInterval = getDoubleFromFirstNode(xmlRoot, "imageAnnotation/imageInformation/azimuthTimeInterval"); -#if defined(USE_BOOST_TIME) - theAzimuthTimeInterval = boost::posix_time::precise_duration(azimuthTimeInterval * 1000000.); -#else - theAzimuthTimeInterval = seconds(azimuthTimeInterval); -#endif - ossimNotify(ossimNotifyLevel_DEBUG) << "theAzimuthTimeInterval " << theAzimuthTimeInterval.total_microseconds() << "us\n"; - - - // Now read burst records as well - xnodes.clear(); - xmlDoc->findNodes("/product/swathTiming/burstList/burst",xnodes); - - if(xnodes.empty()) - { - BurstRecordType burstRecord; - - burstRecord.startLine = 0; - burstRecord.azimuthStartTime = getTimeFromFirstNode(xmlRoot,"imageAnnotation/imageInformation/productFirstLineUtcTime"); - - ossimNotify(ossimNotifyLevel_DEBUG)<< burstRecord.azimuthStartTime<<'\n'; - - burstRecord.azimuthStopTime = getTimeFromFirstNode(xmlRoot,"imageAnnotation/imageInformation/productLastLineUtcTime"); - burstRecord.endLine = getTextFromFirstNode(xmlRoot, "imageAnnotation/imageInformation/numberOfLines").toUInt16()-1; - - burstRecord.startSample = 0; - burstRecord.endSample = getTextFromFirstNode(xmlRoot, "imageAnnotation/imageInformation/numberOfSamples").toUInt16()-1;; - - theBurstRecords.push_back(burstRecord); - } - else - { - const unsigned int linesPerBurst = xmlRoot.findFirstNode("swathTiming/linesPerBurst")->getText().toUInt16(); - const unsigned int samplesPerBurst = xmlRoot.findFirstNode("swathTiming/samplesPerBurst")->getText().toUInt16(); - - unsigned int burstId(0); - - for(std::vector<ossimRefPtr<ossimXmlNode> >::iterator itNode = xnodes.begin(); itNode!=xnodes.end();++itNode,++burstId) - { - BurstRecordType burstRecord; - - const ossimSarSensorModel::TimeType azTime = getTimeFromFirstNode(**itNode, attAzimuthTime); - - // Scan firstValidSample to define the first valid sample and valid lines - ossimString const& s = getTextFromFirstNode(**itNode, attFirstValidSample); - - long first_valid(0), last_valid(0); - bool begin_found(false), end_found(false); - long first_sample_valid(0), last_sample_valid(samplesPerBurst-1); - - std::vector<ossimString> ssp = s.split(" "); - - for (std::vector<ossimString>::const_iterator sIt = ssp.begin(), e = ssp.end() - ; sIt != e && !end_found - ; ++sIt - ) - { - // Find valid lines - if(!begin_found) - { - if(*sIt!="-1") - { - begin_found = true; - } - else - { - ++first_valid; - } - ++last_valid; - } - else - { - if(!end_found && *sIt=="-1") - { - end_found = true; - --last_valid; - } - else - { - ++last_valid; - } - } - - // Find first valid samples - if(*sIt!="-1") - { - int Fvs = samplesPerBurst; - try - { - Fvs = std::stoi(*sIt); - } - catch( ... ) - { - // Throw an execption - throw std::runtime_error("Failed to convert firstValidSample value."); - } - if (Fvs > first_sample_valid && Fvs < samplesPerBurst) - { - first_sample_valid = Fvs; - } - } - } - - // Scan lastValidSample to define the last valid sample - ossimString const& sLast = getTextFromFirstNode(**itNode, attLastValidSample); - std::vector<ossimString> sspLast = sLast.split(" "); - - for (auto const& token : sspLast) - { - // Last first valid samples - if(token != "-1") - { - int Lvs = 0; - try - { - Lvs = std::stoi(token); - } - catch( ... ) - { - // Throw an execption - throw std::runtime_error("Failed to convert lastValidSample value."); - } - - if (Lvs < last_sample_valid && Lvs > 0) - { - last_sample_valid = Lvs; - } - } - } - - burstRecord.startLine = burstId*linesPerBurst + first_valid; - burstRecord.endLine = burstId*linesPerBurst + last_valid; - - burstRecord.azimuthStartTime = azTime + (first_valid*theAzimuthTimeInterval); - burstRecord.azimuthStopTime = azTime + (last_valid*theAzimuthTimeInterval); - - burstRecord.startSample = first_sample_valid; - burstRecord.endSample = last_sample_valid; - - theBurstRecords.push_back(burstRecord); - } - } - - if(isGRD()) - { - readCoordinates(*xmlDoc, - "/product/coordinateConversion/coordinateConversionList/coordinateConversion", - attSr0, attSrgrCoefficients, - theSlantRangeToGroundRangeRecords); - - readCoordinates(*xmlDoc, - "/product/coordinateConversion/coordinateConversionList/coordinateConversion", - attGr0, attGrsrCoefficients, - theGroundRangeToSlantRangeRecords); - } - - xnodes.clear(); - xmlDoc->findNodes("/product/geolocationGrid/geolocationGridPointList/geolocationGridPoint",xnodes); - - for(std::vector<ossimRefPtr<ossimXmlNode> >::iterator itNode = xnodes.begin(); itNode!=xnodes.end();++itNode) - { - GCPRecordType gcpRecord; - - // Retrieve acquisition time - gcpRecord.azimuthTime = getTimeFromFirstNode(**itNode, attAzimuthTime); - - gcpRecord.slantRangeTime = getDoubleFromFirstNode(**itNode, attSlantRangeTime); - - gcpRecord.imPt.x = getDoubleFromFirstNode(**itNode, attPixel); - - // In TOPSAR products, GCPs are weird (they fall in black lines - // between burst. This code allows moving them to a valid area of - // the image. - if(theBurstRecords.size()>2) - { - ossimSarSensorModel::TimeType acqStart; - bool burstFound(false); - unsigned long acqStartLine(0); - - for(std::vector<BurstRecordType>::reverse_iterator bIt = theBurstRecords.rbegin();bIt!=theBurstRecords.rend() && !burstFound;++bIt) - { - if(gcpRecord.azimuthTime >= bIt->azimuthStartTime && gcpRecord.azimuthTime < bIt->azimuthStopTime) - { - burstFound = true; - acqStart = bIt->azimuthStartTime; - acqStartLine = bIt->startLine; - } - } - - if(!burstFound) - { - if(gcpRecord.azimuthTime < theBurstRecords.front().azimuthStartTime) - { - acqStart = theBurstRecords.front().azimuthStartTime; - acqStartLine = theBurstRecords.front().startLine; - } - else if (gcpRecord.azimuthTime >= theBurstRecords.front().azimuthStopTime) - { - acqStart = theBurstRecords.back().azimuthStartTime; - acqStartLine = theBurstRecords.back().startLine; - } - } - const DurationType timeSinceStart = gcpRecord.azimuthTime - acqStart; - - gcpRecord.imPt.y= timeSinceStart/theAzimuthTimeInterval + acqStartLine; - ossimNotify(ossimNotifyLevel_DEBUG) << "timeSinceStart: " << timeSinceStart << " = " << gcpRecord.azimuthTime << " - " << acqStart << " (azTime-acqStart)"<< "\n"; - ossimNotify(ossimNotifyLevel_DEBUG) << "imPt_y: " << gcpRecord.imPt.y << " = " << timeSinceStart.total_microseconds() << "/" << theAzimuthTimeInterval.total_microseconds() << "+" << acqStartLine << "\n"; - } - else - { - gcpRecord.imPt.y = getDoubleFromFirstNode(**itNode, attLine);; - } - ossimGpt geoPoint; - gcpRecord.worldPt.lat = getDoubleFromFirstNode(**itNode, attLatitude); - gcpRecord.worldPt.lon = getDoubleFromFirstNode(**itNode, attLongitude); - gcpRecord.worldPt.hgt = getDoubleFromFirstNode(**itNode, attHeight); - - theGCPRecords.push_back(gcpRecord); - } - - this->optimizeTimeOffsetsFromGcps(); -} - -} // namespace ossimplugins diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1SarSensorModel.h b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1SarSensorModel.h deleted file mode 100644 index ef1270a8259b5d84201834ace7ec927520358a4f..0000000000000000000000000000000000000000 --- a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1SarSensorModel.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2005-2019 by Centre National d'Etudes Spatiales (CNES) - * - * This file is licensed under MIT license: - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - - -#ifndef ossimSentinel1SarSensorModel_HEADER -#define ossimSentinel1SarSensorModel_HEADER - -#include <boost/config.hpp> -#include "ossim/ossimSarSensorModel.h" -#include <string> - -class ossimXmlDocument; -class ossimString; - -namespace ossimplugins -{ - -class OSSIM_PLUGINS_DLL ossimSentinel1SarSensorModel : public ossimSarSensorModel -{ -public: - -#if ! (defined(BOOST_NO_DEFAULTED_FUNCTIONS) || defined(BOOST_NO_CXX1_DEFAULTED_FUNCTIONS)) - /** Constructor */ - ossimSentinel1SarSensorModel()=default; - - /** Copy constructor */ - ossimSentinel1SarSensorModel(ossimSentinel1SarSensorModel const& m)=default; - /** Move constructor */ - ossimSentinel1SarSensorModel(ossimSentinel1SarSensorModel && m)=default; - - /** Destructor */ - virtual ~ossimSentinel1SarSensorModel()=default; -#endif - - void readAnnotationFile(const std::string & annotationXml); - -private: - void readCoordinates( - ossimXmlDocument const& xmlDoc, ossimString const& xpath, - ossimString const& rg0_xpath, ossimString const& coeffs_xpath, - std::vector<CoordinateConversionRecordType> & outputRecords - ); - - -protected: - /* - std::string theProductType; - std::string theMode; - std::string theSwath; - std::string thePolarisation; - */ -}; - -} // end namespace - -#endif