diff --git a/Utilities/otbossimplugins/ossim/ossimAlosPalsarModel.cpp b/Utilities/otbossimplugins/ossim/ossimAlosPalsarModel.cpp index f6d45e3412fa16be1259d74477a8d9599f742f71..4787ed174dd17f95f712903311df71adcd815b92 100644 --- a/Utilities/otbossimplugins/ossim/ossimAlosPalsarModel.cpp +++ b/Utilities/otbossimplugins/ossim/ossimAlosPalsarModel.cpp @@ -100,6 +100,11 @@ bool ossimAlosPalsarModel::InitSensorParams(const ossimKeywordlist &kwl, const c const char* dopcen_str = kwl.find(prefix, "alt_dopcen[0]"); double dopcen = atof(dopcen_str); + const char* dopcenLinear_str = kwl.find(prefix, "alt_dopcen[1]"); + double dopcenLinear; + if (dopcenLinear_str != NULL) { + dopcenLinear = atof(dopcenLinear_str); + } if (_sensor != NULL) { @@ -149,6 +154,7 @@ bool ossimAlosPalsarModel::InitSensorParams(const ossimKeywordlist &kwl, const c _sensor->set_semiMinorAxis(ellip_min) ; _sensor->set_dopcen(dopcen); + _sensor->set_dopcenLinear(dopcenLinear); return true; } diff --git a/Utilities/otbossimplugins/ossim/otb/SarSensor.cpp b/Utilities/otbossimplugins/ossim/otb/SarSensor.cpp index e1e64e9d5dd020bdb45c4c73479154af72a88c2f..8f6e7aab8785bf822c3b7fad4ce8942b3647f605 100644 --- a/Utilities/otbossimplugins/ossim/otb/SarSensor.cpp +++ b/Utilities/otbossimplugins/ossim/otb/SarSensor.cpp @@ -21,6 +21,10 @@ #include <otb/GeodesicCoordinate.h> #include <complex> +// FIXME +#include <iostream> +// Just for testing + namespace ossimplugins { @@ -52,6 +56,28 @@ int SarSensor::ImageToWorld(double distance, JSDDateTime time, double height, do RectangularCoordinate cart; double dopplerCentroid = _params->get_dopcen(); + double dopcenLinear = _params->get_dopcenLinear(); + if (dopcenLinear != 0.0) + { + const double C = 2.99792458e+8 ; + + double prf = _params->get_prf(); + double sf = _params->get_sf(); + double range0 = _params->get_rangeToFirstData(); + + int rangePix = (distance - range0) * 2 * sf / C; + + dopplerCentroid += dopcenLinear * rangePix; + + //FIXME nrangelooks? + std::cout << "dopcenLinear = " << dopcenLinear << std::endl; + std::cout << "prf = " << prf << std::endl; + std::cout << "sf = " << sf << std::endl; + std::cout << "range0 = " << range0 << std::endl; + std::cout << "rangePix = " << rangePix << std::endl; + std::cout << "dopplerCentroid = " << dopplerCentroid << std::endl; + //Testing + } // note : the Doppler frequency is set to zero int etatLoc = localisationSAR(*geoEph, lambda, distance, dopplerCentroid, sensVisee, semiMajorAxis , semiMinorAxis , height, &cart); diff --git a/Utilities/otbossimplugins/ossim/otb/SensorParams.cpp b/Utilities/otbossimplugins/ossim/otb/SensorParams.cpp index c1ef719f9ec4c38633f54191819e86912c23ffff..a5a93f97c6451478ad6df612ee28d39931540ced 100644 --- a/Utilities/otbossimplugins/ossim/otb/SensorParams.cpp +++ b/Utilities/otbossimplugins/ossim/otb/SensorParams.cpp @@ -29,6 +29,8 @@ static const char SEMI_MINOR_AXIS_KW[] = "semi_minor_axis"; static const char NUM_AZIMUTH_LOOKS_KW[] = "number_azimuth_looks"; static const char NUM_RANGE_LOOKS_KW[] = "number_range_looks"; static const char DOPCEN_KW[] = "doppler_centroid"; +static const char DOPCENLINEAR_KW[] = "doppler_centroid_linear_term"; +static const char RANGETOFIRSTDATA_KW[] = "range_to_first_data_sample"; SensorParams::SensorParams(): _prf(0.0), @@ -41,7 +43,9 @@ SensorParams::SensorParams(): _semiMinorAxis(6356752.3141), _nAzimuthLook(1), _nRangeLook(1), - _dopcen(0.0) + _dopcen(0.0), + _dopcenLinear(0.0), + _rangeToFirstData(0.0) { } @@ -60,7 +64,9 @@ SensorParams::SensorParams(const SensorParams& rhs): _semiMinorAxis(rhs._semiMinorAxis), _nAzimuthLook(rhs._nAzimuthLook), _nRangeLook(rhs._nRangeLook), - _dopcen(rhs._dopcen) + _dopcen(rhs._dopcen), + _dopcenLinear(rhs._dopcenLinear), + _rangeToFirstData(rhs._rangeToFirstData) { } @@ -79,6 +85,8 @@ SensorParams& SensorParams::operator=(const SensorParams& rhs) _semiMajorAxis = rhs._semiMajorAxis; _semiMinorAxis = rhs._semiMinorAxis; _dopcen = rhs._dopcen; + _dopcenLinear = rhs._dopcenLinear; + _rangeToFirstData = rhs._rangeToFirstData; return *this; } @@ -102,6 +110,8 @@ bool SensorParams::saveState(ossimKeywordlist& kwl, const char* prefix) const kwl.add(pfx.c_str(), NUM_AZIMUTH_LOOKS_KW, _nAzimuthLook); kwl.add(pfx.c_str(), NUM_RANGE_LOOKS_KW, _nRangeLook); kwl.add(pfx.c_str(), DOPCEN_KW, _dopcen); + kwl.add(pfx.c_str(), DOPCENLINEAR_KW, _dopcenLinear); + kwl.add(pfx.c_str(), RANGETOFIRSTDATA_KW, _rangeToFirstData); return true; } @@ -247,5 +257,31 @@ bool SensorParams::loadState(const ossimKeywordlist& kwl, const char* prefix) result = false; } return result; + + lookup = kwl.find(pfx.c_str(), DOPCENLINEAR_KW); + if (lookup) + { + s = lookup; + _dopcenLinear = s.toDouble(); + } + else + { + result = false; + } + return result; + + lookup = kwl.find(pfx.c_str(), RANGETOFIRSTDATA_KW); + if (lookup) + { + s = lookup; + _rangeToFirstData = s.toDouble(); + } + else + { + result = false; + } + return result; + } + } diff --git a/Utilities/otbossimplugins/ossim/otb/SensorParams.h b/Utilities/otbossimplugins/ossim/otb/SensorParams.h index 3335e7407212344e49458434fbf7bfd374058408..f4c487efada4296769af0413c0f42b8aae41ed0e 100644 --- a/Utilities/otbossimplugins/ossim/otb/SensorParams.h +++ b/Utilities/otbossimplugins/ossim/otb/SensorParams.h @@ -163,10 +163,32 @@ public: return _dopcen; } + double get_dopcenLinear() const + { + return _dopcenLinear; + } + void set_dopcen(double value) { _dopcen = value; } + + void set_dopcenLinear(double value) + { + _dopcenLinear = value; + } + + double get_rangeToFirstData() const + { + return _rangeToFirstData; + } + + void set_rangeToFirstData(double value) + { + _rangeToFirstData = value; + } + + /** * @brief Method to save object state to a keyword list. * @param kwl Keyword list to save to. @@ -240,6 +262,17 @@ protected: */ double _dopcen; + /** + * @brief Doppler centroid linear term (wrt range pixel) + */ + double _dopcenLinear; + + /** + * @brief Slant range to first data sample + */ + double _rangeToFirstData; + + private: }; }