diff --git a/Code/UtilitiesAdapters/OssimAdapters/otbPlatformPositionAdapter.cxx b/Code/UtilitiesAdapters/OssimAdapters/otbPlatformPositionAdapter.cxx index 734a92940df9c39ed99fd9a5b37ca4c6b3093b85..0cd55e7845b579f9b13764ac41828a31cff4717d 100644 --- a/Code/UtilitiesAdapters/OssimAdapters/otbPlatformPositionAdapter.cxx +++ b/Code/UtilitiesAdapters/OssimAdapters/otbPlatformPositionAdapter.cxx @@ -22,9 +22,11 @@ #include "otbImageKeywordlist.h" #include "ossimGeometricSarSensorModel.h" +#include "otb/PlatformPosition.h" #include "projection/ossimProjection.h" #include "ossim/ossimPluginProjectionFactory.h" + namespace otb { PlatformPositionAdapter::PlatformPositionAdapter(): @@ -65,4 +67,10 @@ void PlatformPositionAdapter::GetPlatformPosition( m_SensorModel->getPlatformPositionAtLine(line, position, speed); } +void PlatformPositionAdapter::GetPlatformPositionAtTime( + ossimplugins::JSDDateTime time, std::vector<double>& position, std::vector<double>& speed) +{ + m_SensorModel->get_platformPosition()->getPlatformPositionAtTime(time, position, speed); +} + } // namespace otb diff --git a/Code/UtilitiesAdapters/OssimAdapters/otbPlatformPositionAdapter.h b/Code/UtilitiesAdapters/OssimAdapters/otbPlatformPositionAdapter.h index 337a997c2e977917c387bec96dfdd011971cf80e..19a91f0dd8cda94b0e849515829ac47e8085ef36 100644 --- a/Code/UtilitiesAdapters/OssimAdapters/otbPlatformPositionAdapter.h +++ b/Code/UtilitiesAdapters/OssimAdapters/otbPlatformPositionAdapter.h @@ -26,6 +26,7 @@ namespace ossimplugins { class ossimGeometricSarSensorModel; +class JSDDateTime; } namespace otb @@ -60,9 +61,14 @@ public: void CreateSensorModel(const ImageKeywordlist& image_kwl); + /** Get the platform position and speed for a given line. */ void GetPlatformPosition( double line, std::vector<double>& position, std::vector<double>& speed); + /** Get the platform position at a given date and time. */ + void GetPlatformPositionAtTime( + ossimplugins::JSDDateTime time, std::vector<double>& position, std::vector<double>& speed); + protected: PlatformPositionAdapter(); virtual ~PlatformPositionAdapter(); diff --git a/Utilities/otbossimplugins/ossim/otb/PlatformPosition.cpp b/Utilities/otbossimplugins/ossim/otb/PlatformPosition.cpp index 74a55f5e59102675ebbe032d22b7fc243bfa556a..abc273567a84b22a313a2ddef090d0ce8d3673bc 100644 --- a/Utilities/otbossimplugins/ossim/otb/PlatformPosition.cpp +++ b/Utilities/otbossimplugins/ossim/otb/PlatformPosition.cpp @@ -13,7 +13,8 @@ #include <string> #include <cmath> #include <iomanip> - +#include <vector> + #include <otb/PlatformPosition.h> #include <otb/Ephemeris.h> #include <otb/HermiteInterpolator.h> @@ -170,6 +171,23 @@ Ephemeris* PlatformPosition::Interpolate(JSDDateTime date) const return ephem; } +bool PlatformPosition::getPlatformPositionAtTime(JSDDateTime time, std::vector<double>& position, std::vector<double>& speed) +{ + Ephemeris* ephemeris = this->Interpolate(time); + double* position_ptr = ephemeris->get_position(); + double* speed_ptr = ephemeris->get_speed(); + if (position.size() != 3) position.resize(3); + if (speed.size() != 3) speed.resize(3); + position[0] = position_ptr[0]; + position[1] = position_ptr[1]; + position[2] = position_ptr[2]; + speed[0] = speed_ptr[0]; + speed[1] = speed_ptr[1]; + speed[2] = speed_ptr[2]; + return true; +} + + void PlatformPosition::setData(Ephemeris** data, int nbrData) { Clear(); diff --git a/Utilities/otbossimplugins/ossim/otb/PlatformPosition.h b/Utilities/otbossimplugins/ossim/otb/PlatformPosition.h index ea6bf78c8d8a2d0fc0dd852f561620ffa336fdcc..dbec894a11f8a2dbb90b8694f722f04cc8094960 100644 --- a/Utilities/otbossimplugins/ossim/otb/PlatformPosition.h +++ b/Utilities/otbossimplugins/ossim/otb/PlatformPosition.h @@ -12,6 +12,7 @@ #ifndef PlatformPosition_h #define PlatformPosition_h +#include <vector> #include <ossimPluginConstants.h> #include <otb/JSDDateTime.h> @@ -67,6 +68,14 @@ public: */ Ephemeris* Interpolate(JSDDateTime date) const; + + /** + * @brief This function interpolates its ephemeris to create and extract platform's position and speed + * @param date Date and time at wich the interpolation have to be done + * @return true, or false if an error occurs + */ + bool getPlatformPositionAtTime(JSDDateTime time, std::vector<double>& position, std::vector<double>& speed); + PlatformPosition* Clone() const { return new PlatformPosition(*this);