From 82a3b3be0519d75fd0da200ac5a10e2bce5961d1 Mon Sep 17 00:00:00 2001
From: Patrick Imbo <patrick.imbo@c-s.fr>
Date: Thu, 8 Mar 2012 19:46:52 +0100
Subject: [PATCH] ENH: add GetPlatformPositionAtTime() method

---
 .../otbPlatformPositionAdapter.cxx            |  8 ++++++++
 .../otbPlatformPositionAdapter.h              |  6 ++++++
 .../ossim/otb/PlatformPosition.cpp            | 20 ++++++++++++++++++-
 .../ossim/otb/PlatformPosition.h              |  9 +++++++++
 4 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/Code/UtilitiesAdapters/OssimAdapters/otbPlatformPositionAdapter.cxx b/Code/UtilitiesAdapters/OssimAdapters/otbPlatformPositionAdapter.cxx
index 734a92940d..0cd55e7845 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 337a997c2e..19a91f0dd8 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 74a55f5e59..abc273567a 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 ea6bf78c8d..dbec894a11 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);
-- 
GitLab