diff --git a/Modules/Adapters/OSSIMAdapters/include/otbSarSensorModelAdapter.h b/Modules/Adapters/OSSIMAdapters/include/otbSarSensorModelAdapter.h index 4b26ef8c33a57648ab951281907b86f9b29f48ec..3c1321e04a0de9af05693b0c78a7252be5b33303 100644 --- a/Modules/Adapters/OSSIMAdapters/include/otbSarSensorModelAdapter.h +++ b/Modules/Adapters/OSSIMAdapters/include/otbSarSensorModelAdapter.h @@ -95,6 +95,10 @@ public: /** Transform world point (lat,lon,hgt) to satellite position (x,y,z) and satellite velocity */ bool WorldToSatPositionAndVelocity(const Point3DType & inGeoPoint, Point3DType & satellitePosition, Point3DType & satelliteVelocity) const; + + /** Transform line index to satellite position (x,y,z) and satellite velocity */ + bool LineToSatPositionAndVelocity(const double line, Point3DType & satellitePosition, + Point3DType & satelliteVelocity) const; /** Transform world point (lat,lon,hgt) to cartesian point (x,y,z) */ static bool WorldToCartesian(const Point3DType & inGeoPoint, Point3DType & outCartesianPoint); @@ -104,6 +108,7 @@ public: static void DeburstLineToImageLine(const std::vector<std::pair<unsigned long,unsigned long> >& lines, unsigned long deburstLine, unsigned long & imageLine); + protected: SarSensorModelAdapter(); virtual ~SarSensorModelAdapter() override; diff --git a/Modules/Adapters/OSSIMAdapters/src/otbSarSensorModelAdapter.cxx b/Modules/Adapters/OSSIMAdapters/src/otbSarSensorModelAdapter.cxx index 61d7f20e774e70a7fe744f0cca42247d88eb3fa7..5e351bea4b17591fcb9a55966878836dabf46c2e 100644 --- a/Modules/Adapters/OSSIMAdapters/src/otbSarSensorModelAdapter.cxx +++ b/Modules/Adapters/OSSIMAdapters/src/otbSarSensorModelAdapter.cxx @@ -216,5 +216,34 @@ bool SarSensorModelAdapter::WorldToSatPositionAndVelocity(const Point3DType & in return true; } +bool SarSensorModelAdapter::LineToSatPositionAndVelocity(const double line, Point3DType & satellitePosition, + Point3DType & satelliteVelocity) const +{ + if(!m_SensorModel.get()) + { + return false; + } + + ossimplugins::ossimSarSensorModel::TimeType azimuthTime; + ossimEcefPoint sensorPos; + ossimEcefVector sensorVel; + + m_SensorModel->lineToAzimuthTime(line, azimuthTime); + m_SensorModel->interpolateSensorPosVel(azimuthTime, sensorPos, sensorVel); + + if(sensorPos.isNan() || sensorVel.isNan()) + return false; + + satellitePosition[0] = sensorPos.x(); + satellitePosition[1] = sensorPos.y(); + satellitePosition[2] = sensorPos.z(); + + satelliteVelocity[0] = sensorVel.x(); + satelliteVelocity[1] = sensorVel.y(); + satelliteVelocity[2] = sensorVel.z(); + + return true; +} + } // namespace otb diff --git a/Modules/Adapters/OSSIMAdapters/test/otbSarSensorModelAdapterTest.cxx b/Modules/Adapters/OSSIMAdapters/test/otbSarSensorModelAdapterTest.cxx index d48f10066193796158002b55aba127b464814ccc..6f29a60ef2f2c5d19f41e5683ecbf4faff8a7484 100644 --- a/Modules/Adapters/OSSIMAdapters/test/otbSarSensorModelAdapterTest.cxx +++ b/Modules/Adapters/OSSIMAdapters/test/otbSarSensorModelAdapterTest.cxx @@ -62,7 +62,7 @@ int otbSarSensorModelAdapterTest(int itkNotUsed(argc), char* argv[]) otb::SarSensorModelAdapter::Point2DType out1,out2; - otb::SarSensorModelAdapter::Point3DType in, out3, out4, out5; + otb::SarSensorModelAdapter::Point3DType in, out3, out4, out5, out6, out7; // GCP 99 from input geom file //support_data.geom.gcp[99].world_pt.hgt: 2.238244926818182e+02 @@ -78,7 +78,9 @@ int otbSarSensorModelAdapterTest(int itkNotUsed(argc), char* argv[]) sensorModel->WorldToCartesian(in, out5); sensorModel->WorldToSatPositionAndVelocity(in,out3, out4); - + + unsigned int ind_Line = 2; + sensorModel->LineToSatPositionAndVelocity(ind_Line, out6, out7); return EXIT_SUCCESS; }