diff --git a/Utilities/otbossim/include/ossim/projection/ossimPositionQualityEvaluator.h b/Utilities/otbossim/include/ossim/projection/ossimPositionQualityEvaluator.h new file mode 100755 index 0000000000000000000000000000000000000000..3d37b0a96d6bf33ab0c70c4676183e73e175dff4 --- /dev/null +++ b/Utilities/otbossim/include/ossim/projection/ossimPositionQualityEvaluator.h @@ -0,0 +1,313 @@ +//---------------------------------------------------------------------------- +// +// License: See top level LICENSE.txt file. +// +// Author: David Hicks +// +// Description: Base class for position quality evaluation operations. +//---------------------------------------------------------------------------- +#ifndef ossimPositionQualityEvaluator_HEADER +#define ossimPositionQualityEvaluator_HEADER + +#include <ossim/base/ossimDpt.h> +#include <ossim/base/ossimEcefPoint.h> +#include <ossim/base/ossimGpt.h> +#include <ossim/base/ossimLsrVector.h> +#include <ossim/base/ossimColumnVector3d.h> +#include <ossim/base/ossimMatrix3x3.h> +#include <ossim/matrix/newmat.h> +#include <ossim/matrix/newmatap.h> +#include <ossim/matrix/newmatio.h> + + +// Probability level specifiers +typedef enum pqeProbLev_t +{ + ONE_SIGMA = 0, + P50, + P90, + P95, + NUM_PROB_LEVELS +}; + +// Ground space ellipse +struct pqeErrorEllipse +{ + double theSemiMinorAxis; + double theSemiMajorAxis; + double theAzimAngle; + ossimGpt theCenter; +}; + +// RPC model parameters +struct pqeRPCModel +{ + double theLineScale; + double theSampScale; + double theLatScale; + double theLonScale; + double theHgtScale; + double theLineOffset; + double theSampOffset; + double theLatOffset; + double theLonOffset; + double theHgtOffset; + double theLineNumCoef[20]; + double theLineDenCoef[20]; + double theSampNumCoef[20]; + double theSampDenCoef[20]; + char theType; // A or B +}; + +// Image space ellipse point set +typedef std::vector<ossimDpt> pqeImageErrorEllipse_t; + + + +class OSSIM_DLL ossimPositionQualityEvaluator +{ +public: + + /** @brief default constructor */ + ossimPositionQualityEvaluator(); + + /** @brief covariance matrix-based constructor + * + * @param pt Current ECF ground estimate. + * @param covMat 3X3 ECF covariance matrix. + */ + ossimPositionQualityEvaluator( + const ossimEcefPoint& pt, + const NEWMAT::Matrix& covMat); + + /** @brief LOS error/geometry-based constructor + * + * @param pt Current ECF ground estimate. + * @param errBiasLOS 0.68p LOS bias component. + * @param errRandLOS 0.68p LOS random component. + * @param elevAngleLOS target elevation angle. + * @param azimAngleLOS target azimuth angle. + * @param surfN surface normal unit vector (defaults to unit Z). + * @param surfCovMat surface ENU 3X3 covariance matrix (defaults to zero). + */ + ossimPositionQualityEvaluator( + const ossimEcefPoint& pt, + const ossim_float64& errBiasLOS, + const ossim_float64& errRandLOS, + const ossim_float64& elevAngleLOS, + const ossim_float64& azimAngleLOS, + const ossimColumnVector3d& surfN = ossimColumnVector3d(0,0,1), + const NEWMAT::Matrix& surfCovMat = ossimMatrix3x3::createZero()); + + /** @brief LOS error/coefficient-based constructor + * + * @param pt Current ECF ground estimate. + * @param errBiasLOS 0.68p LOS bias component. + * @param errRandLOS 0.68p LOS random component. + * @param rpc RPC coefficients. + * @param surfN surface normal unit vector (defaults to unit Z). + * @param surfCovMat surface ENU 3X3 covariance matrix (defaults to zero). + */ + ossimPositionQualityEvaluator( + const ossimEcefPoint& pt, + const ossim_float64& errBiasLOS, + const ossim_float64& errRandLOS, + const pqeRPCModel& rpc, + const ossimColumnVector3d& surfN = ossimColumnVector3d(0,0,1), + const NEWMAT::Matrix& surfCovMat = ossimMatrix3x3::createZero()); + + /** @brief virtual destructor */ + ~ossimPositionQualityEvaluator(); + + /** + * @brief Add contributing covariance matrix + * + * @param covMat 3X3 covariance matrix. + * + * @return true on success, false on error. + */ + bool addContributingCovariance( + NEWMAT::Matrix& covMat); + + /** + * @brief Add contributing CE/LE + * + * @param cCE contributing 90% circular error (m). + * @param cLE contributing 90% linear error (m). + * + * @return true on success, false on error. + */ + bool addContributingCE_LE( + const ossim_float64& cCE, + const ossim_float64& cLE); + + /** + * @brief Subtract contributing covariance matrix + * + * @param covMat 3X3 covariance matrix. + * + * @return true on success, false on error. + */ + bool subtractContributingCovariance( + NEWMAT::Matrix& covMat); + + /** + * @brief Subtract contributing CE/LE + * + * @param cCE contributing 90% circular error (m). + * @param cLE contributing 90% linear error (m). + * + * @return true on success, false on error. + */ + bool subtractContributingCE_LE( + const ossim_float64& cCE, + const ossim_float64& cLE); + + /** + * @brief Covariance matrix access + * + * @param covMat 3X3 covariance matrix. + * + * @return true on success, false on error. + */ + bool getCovMatrix( + NEWMAT::Matrix& covMat) const; + + /** + * @brief Compute circular/linear error (CE/LE). + * + * @param pLev Probability level. + * @param CE pLev% circular error (m). + * @param LE pLev% linear error (m). + * + * @return true on success, false on error. + */ + bool computeCE_LE( + const pqeProbLev_t pLev, + ossim_float64& CE, + ossim_float64& LE) const; + + + /** + * @brief Extract error ellipse parameters + * + * @param pLev Probability level. + * @param ellipse pLev% error ellipse. + * + * @return true on success, false on error. + */ + bool extractErrorEllipse( + const pqeProbLev_t pLev, + pqeErrorEllipse& ellipse); + + + /** + * @brief Extract error ellipse parameters; valid only with RPC parameters + * + * @param pLev Probability level. + * @param angularIncrement Angular increment for ellipse point spacing (deg) + * @param ellipse pLev% error ellipse. + * @param ellImage pLev% image space error ellipse. + * + * @return true on success, false on error. + */ + bool extractErrorEllipse( + const pqeProbLev_t pLev, + const ossim_float64& angularIncrement, + pqeErrorEllipse& ellipse, + pqeImageErrorEllipse_t& ellImage); + + + /** + * @brief State accessor. + */ + inline bool isValid() const { return theEvaluatorValid; } + + + /** + * @brief Print method. + */ + std::ostream& print(std::ostream& out) const; + +protected: + +private: + //*** + // Members + //*** + bool theEvaluatorValid; + ossimGpt thePtG; + NEWMAT::Matrix theCovMat; //local ENU frame + ossimLsrSpace theLocalFrame; + pqeErrorEllipse theEllipse; + NEWMAT::Matrix theEigenvectors; + pqeRPCModel theRpcModel; + + //*** + // Method for eigenvector decomposition of covariance matrix + //*** + bool decomposeMatrix(); + + //*** + // Method for covariance matrix formation from 1-sigma LOS + // error componenents and imaging geometry + //*** + bool constructMatrix(const ossim_float64& errBiasLOS, + const ossim_float64& errRandLOS, + const ossim_float64& elevAngleLOS, + const ossim_float64& azimAngleLOS, + const ossimColumnVector3d& surfN, + const NEWMAT::Matrix& surfCovMat); + + //*** + // Method for forming 3X3 ENU covariance matrix from CE/LE + //*** + bool formCovMatrixFromCE_LE(const ossim_float64& CE, + const ossim_float64& LE, + NEWMAT::Matrix& covMat) const; + + //*** + // Method for computing 90% CE using interpolating function + //*** + double compute90PCE() const; + + //*** + // Method for computing acquisition angles from RPC coefficients + //*** + bool computeElevAzim(const pqeRPCModel rpc, + ossim_float64& elevAngleLOS, + ossim_float64& azimAngleLOS) const; + + //*** + // Methods for computing RPC polynomial and its derivatives + //*** + double polynomial(const double& nlat, + const double& nlon, + const double& nhgt, + const double* coeffs) const; + double dPoly_dLat(const double& nlat, + const double& nlon, + const double& nhgt, + const double* coeffs) const; + double dPoly_dLon(const double& nlat, + const double& nlon, + const double& nhgt, + const double* coeffs) const; + double dPoly_dHgt(const double& nlat, + const double& nlon, + const double& nhgt, + const double* coeffs) const; + + + + //*** + // Utility methods + //*** + ossimColumnVector3d vperp(const ossimColumnVector3d& v1, + const ossimColumnVector3d& v2) const; + + double atan3(const ossim_float64 y, const ossim_float64 x) const; + +}; + +#endif /* #ifndef ossimPositionQualityEvaluator_HEADER */