24 #ifdef OSSIM_ID_ENABLED 25 static const char OSSIM_ID[] =
"$Id: ossimPositionQualityEvaluator.cpp";
32 {1.644854,1.645623,1.647912,1.651786,1.657313,
33 1.664580,1.673829,1.685227,1.699183,1.716257,
34 1.737080,1.762122,1.791522,1.825112,1.862530,
35 1.903349,1.947158,1.993595,2.042360,2.093214,2.145966};
39 {1.0, 0.6745, 1.6449, 1.96};
43 {1.0, 1.1774, 2.1460, 2.4477};
47 {0.46598, 0.54865, 1.0, 1.14059};
61 <<
"\nossimPositionQualityEvaluator::ossimPositionQualityEvaluator DEBUG:" << std::endl;
62 #ifdef OSSIM_ID_ENABLED 64 <<
"OSSIM_ID: " << OSSIM_ID << std::endl;
85 <<
"\nossimPositionQualityEvaluator::ossimPositionQualityEvaluator DEBUG:" << std::endl;
86 #ifdef OSSIM_ID_ENABLED 88 <<
"OSSIM_ID: " << OSSIM_ID << std::endl;
123 const NEWMAT::Matrix& surfCovMat)
128 <<
"\nossimPositionQualityEvaluator::ossimPositionQualityEvaluator DEBUG:" << std::endl;
129 #ifdef OSSIM_ID_ENABLED 131 <<
"OSSIM_ID: " << OSSIM_ID << std::endl;
146 (errBiasLOS, errRandLOS, elevAngleLOS, azimAngleLOS, surfN, surfCovMat))
170 const NEWMAT::Matrix& surfCovMat)
175 <<
"\nossimPositionQualityEvaluator::ossimPositionQualityEvaluator DEBUG:" << std::endl;
176 #ifdef OSSIM_ID_ENABLED 178 <<
"OSSIM_ID: " << OSSIM_ID << std::endl;
200 (errBiasLOS, errRandLOS, elevAngleLOS, azimAngleLOS, surfN, surfCovMat))
219 <<
"DEBUG: ~ossimPositionQualityEvaluator(): returning..." << std::endl;
232 out <<
"\nPositionQualityEvaluator Summary..."<<std::endl;
233 out <<
" theEvaluatorValid: ";
235 out<<
"True"<<std::endl;
237 out<<
"False"<<std::endl;
238 out <<
" thePtG: "<<
thePtG<<std::endl;
240 out << fixed << setprecision(1);
243 <<
" [m, 1 sigma] at ";
276 bool matrixOK = (covMat.Nrows()==3) && (covMat.Nrows()==3);
299 NEWMAT::Matrix covMat(3,3);
316 bool matrixOK = (covMat.Nrows()==3) && (covMat.Nrows()==3);
339 NEWMAT::Matrix covMat(3,3);
409 bool computeImageEllipse =
true;
412 computeImageEllipse =
false;
422 int numSteps = 360/(int)angularIncrement;
430 for (
int j = 0; j<=numSteps; ++j)
434 double ang =
TWO_PI*j/numSteps;
435 double sang = sin(ang);
436 double cang = cos(ang);
437 double x = dxMaj*cang + dxMin*sang;
438 double y = dyMaj*cang + dyMin*sang;
444 double lat = cpG.
latd();
445 double lon = cpG.
lond();
446 double hgt = cpG.
height();
482 ellImage.push_back(img);
503 NEWMAT::SymmetricMatrix S(2);
505 NEWMAT::DiagonalMatrix D;
516 if (cos2theta == 0.0)
523 double rotAngle =
atan3(sin2theta, cos2theta)/2.0;
546 const NEWMAT::Matrix& surfCovMat)
548 bool constructOK =
true;
552 ossim_float64 eTot = sqrt(errBiasLOS*errBiasLOS + errRandLOS*errRandLOS);
557 double elC = elevAngleLOS;
558 double azC = azimAngleLOS;
567 <<
" LOS: "<<LOS<<endl;
569 <<
" eTot: "<<eTot<<endl;
590 pMinU = pMinAxis.
unit();
609 double elevAngTerr = acos(pMaxU.
dot(LOS));
616 if (elevAngTerr > 0.0)
621 double planeErrorL = eTot/sin(elevAngTerr);
644 <<
" Projected horizontal/vertical components...."<<endl
645 <<
" pL: "<<pL<<
" magL: "<<magL<<endl
646 <<
" pN: "<<pN<<
" magN: "<<magN<<endl
647 <<
" pV: "<<pV<<
" magV: "<<magV<<endl;
658 double tSlope = acos(tSlopeN.
dot(lsrNorm));
661 double surfSigV = sqrt(surfCovMat(3,3));
662 double surfSigH = sqrt((surfCovMat(1,1)+surfCovMat(2,2))/2.0);
663 double surfSigV_h = surfSigH * tan(tSlope);
667 double vSigTot = sqrt(surfSigV*surfSigV + surfSigV_h*surfSigV_h);
677 s_surfN = s_surfN * vSigTot;
681 double sigVl = sigTn/sin(elevAngTerr);
691 <<
" s_surfN: "<<s_surfN
692 <<
"\n vSigHvec: "<<vSigHvec
693 <<
"\n vSigVvec: "<<vSigVvec<<endl;
713 magL = sqrt(magL*magL + vSigH*vSigH);
726 theta =
atan3(pL[1],pL[0]);
732 theta =
atan3(pN[1],pN[0]);
739 NEWMAT::Matrix Cov(2,2);
740 NEWMAT::Matrix Vcomp(2,2);
741 NEWMAT::DiagonalMatrix Dcomp(2);
743 Dcomp(1,1) = pMax*pMax;
744 Dcomp(2,2) = pMin*pMin;
745 Vcomp(1,1) = cos(theta);
746 Vcomp(2,1) = sin(theta);
747 Vcomp(1,2) =-Vcomp(2,1);
748 Vcomp(2,2) = Vcomp(1,1);
749 Cov = Vcomp*Dcomp*Vcomp.t();
752 NEWMAT::Matrix covMat(3,3);
753 covMat(1,1) = Cov(1,1);
754 covMat(1,2) = Cov(1,2);
756 covMat(2,1) = Cov(2,1);
757 covMat(2,2) = Cov(2,2);
759 covMat(3,1) = covMat(1,3);
760 covMat(3,2) = covMat(2,3);
761 covMat(3,3) = magV*magV + vSigV*vSigV;
771 <<
"WARNING: ossimPositionQualityEvaluator::constructMatrix(): " 772 <<
"\n terrain-referenced elev ang: "<<elevAngTerr*
DEG_PER_RAD 790 NEWMAT::Matrix& covMat)
const 793 covMat(1,1) = CE/2.146;
794 covMat(2,2) = CE/2.146;
795 covMat(3,3) = LE/1.6449;
796 covMat(1,1) *= covMat(1,1);
797 covMat(2,2) *= covMat(2,2);
798 covMat(3,3) *= covMat(3,3);
888 double dU_dLat = (Qu*dPu_dLat - Pu*dQu_dLat)/(Qu*Qu);
889 double dU_dLon = (Qu*dPu_dLon - Pu*dQu_dLon)/(Qu*Qu);
890 double dU_dHgt = (Qu*dPu_dHgt - Pu*dQu_dHgt)/(Qu*Qu);
891 double dV_dLat = (Qv*dPv_dLat - Pv*dQv_dLat)/(Qv*Qv);
892 double dV_dLon = (Qv*dPv_dLon - Pv*dQv_dLon)/(Qv*Qv);
893 double dV_dHgt = (Qv*dPv_dHgt - Pv*dQv_dHgt)/(Qv*Qv);
912 NEWMAT::Matrix jMat(3,3);
918 pWRTx.
u = dU_dLat*jMat(1,1)+dU_dLon*jMat(2,1)+dU_dHgt*jMat(3,1);
919 pWRTy.
u = dU_dLat*jMat(1,2)+dU_dLon*jMat(2,2)+dU_dHgt*jMat(3,2);
920 pWRTz.
u = dU_dLat*jMat(1,3)+dU_dLon*jMat(2,3)+dU_dHgt*jMat(3,3);
922 pWRTx.
v = dV_dLat*jMat(1,1)+dV_dLon*jMat(2,1)+dV_dHgt*jMat(3,1);
923 pWRTy.
v = dV_dLat*jMat(1,2)+dV_dLon*jMat(2,2)+dV_dHgt*jMat(3,2);
924 pWRTz.
v = dV_dLat*jMat(1,3)+dV_dLon*jMat(2,3)+dV_dHgt*jMat(3,3);
927 NEWMAT::Matrix jECF(3,2);
934 NEWMAT::Matrix jLSR(3,2);
936 double dU_dx = jLSR(1,1);
937 double dU_dy = jLSR(2,1);
938 double dU_dz = jLSR(3,1);
939 double dV_dx = jLSR(1,2);
940 double dV_dy = jLSR(2,2);
941 double dV_dz = jLSR(3,2);
944 double den = dU_dy*dV_dx - dV_dy*dU_dx;
945 double dY = dU_dx*dV_dz - dV_dx*dU_dz;
946 double dX = dV_dy*dU_dz - dU_dy*dV_dz;
947 double dy_dH = dY / den;
948 double dx_dH = dX / den;
950 azimAngleLOS = atan2(dx_dH, dy_dH);
951 elevAngleLOS = atan2(1.0, sqrt(dy_dH*dy_dH+dx_dH*dx_dH));
974 double scale = v1.
dot(v2)/v2.
dot(v2);
990 const double x)
const 992 double u,v,pih=0.5*
M_PI,result;
1034 const double* c)
const 1040 r = c[ 0] + c[ 1]*L + c[ 2]*P + c[ 3]*H +
1041 c[ 4]*L*P + c[ 5]*L*H + c[ 6]*P*H + c[ 7]*L*P*H +
1042 c[ 8]*L*L + c[ 9]*P*P + c[10]*H*H + c[11]*L*L*L +
1043 c[12]*L*L*P + c[13]*L*L*H + c[14]*L*P*P + c[15]*P*P*P +
1044 c[16]*P*P*H + c[17]*L*H*H + c[18]*P*H*H + c[19]*H*H*H;
1048 r = c[ 0] + c[ 1]*L + c[ 2]*P + c[ 3]*H +
1049 c[ 4]*L*P + c[ 5]*L*H + c[ 6]*P*H + c[ 7]*L*L +
1050 c[ 8]*P*P + c[ 9]*H*H + c[10]*L*P*H + c[11]*L*L*L +
1051 c[12]*L*P*P + c[13]*L*H*H + c[14]*L*L*P + c[15]*P*P*P +
1052 c[16]*P*H*H + c[17]*L*L*H + c[18]*P*P*H + c[19]*H*H*H;
1069 const double* c)
const 1075 dr = c[2] + c[4]*L + c[6]*H + c[7]*L*H + 2*c[9]*P + c[12]*L*L +
1076 2*c[14]*L*P + 3*c[15]*P*P +2*c[16]*P*H + c[18]*H*H;
1080 dr = c[2] + c[4]*L + c[6]*H + 2*c[8]*P + c[10]*L*H + 2*c[12]*L*P +
1081 c[14]*L*L + 3*c[15]*P*P + c[16]*H*H + 2*c[18]*P*H;
1098 const double* c)
const 1104 dr = c[1] + c[4]*P + c[5]*H + c[7]*P*H + 2*c[8]*L + 3*c[11]*L*L +
1105 2*c[12]*L*P + 2*c[13]*L*H + c[14]*P*P + c[17]*H*H;
1109 dr = c[1] + c[4]*P + c[5]*H + 2*c[7]*L + c[10]*P*H + 3*c[11]*L*L +
1110 c[12]*P*P + c[13]*H*H + 2*c[14]*P*L + 2*c[17]*L*H;
1126 const double* c)
const 1132 dr = c[3] + c[5]*L + c[6]*P + c[7]*L*P + 2*c[10]*H + c[13]*L*L +
1133 c[16]*P*P + 2*c[17]*L*H + 2*c[18]*P*H + 3*c[19]*H*H;
1137 dr = c[3] + c[5]*L + c[6]*P + 2*c[9]*H + c[10]*L*P + 2*c[13]*L*H +
1138 2*c[16]*P*H + c[17]*L*L + c[18]*P*P + 3*c[19]*H*H;
double dPoly_dHgt(const double &nlat, const double &nlon, const double &nhgt, const double *coeffs) const
ossimLsrSpace theLocalFrame
ossimColumnVector3d cross(const ossimColumnVector3d &rhs) const
bool subtractContributingCovariance(NEWMAT::Matrix &covMat)
Subtract contributing covariance matrix.
std::vector< ossimDpt > pqeImageErrorEllipse_t
const ossim_uint32 nTableEntries
bool getCovMatrix(NEWMAT::Matrix &covMat) const
Covariance matrix access.
const ossim_float64 table90[nTableEntries]
NEWMAT::Matrix theEigenvectors
bool addContributingCE_LE(const ossim_float64 &cCE, const ossim_float64 &cLE)
Add contributing CE/LE.
const ossim_float64 Fac1D[NUM_PROB_LEVELS]
double lond() const
Will convert the radian measure to degrees.
double dot(const ossimColumnVector3d &rhs) const
pqeErrorEllipse theEllipse
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 theLineNumCoef[20]
bool computeElevAzim(const pqeRPCModel rpc, ossim_float64 &elevAngleLOS, ossim_float64 &azimAngleLOS) const
ossimColumnVector3d vperp(const ossimColumnVector3d &v1, const ossimColumnVector3d &v2) const
ossimColumnVector3d unit() const
ossim_float64 hgt
Height in meters above the ellipsiod.
~ossimPositionQualityEvaluator()
virtual destructor
bool addContributingCovariance(NEWMAT::Matrix &covMat)
Add contributing covariance matrix.
double latd() const
Will convert the radian measure to degrees.
const ossim_float64 Fac2D[NUM_PROB_LEVELS]
bool formCovMatrixFromCE_LE(const ossim_float64 &CE, const ossim_float64 &LE, NEWMAT::Matrix &covMat) const
const ossimDatum * datum() const
datum().
const ossim_uint32 nMultiplier
ossimPositionQualityEvaluator()
default constructor
const NEWMAT::Matrix & lsrToEcefRotMatrix() const
unsigned int ossim_uint32
virtual const ossimEllipsoid * ellipsoid() const
double compute90PCE() const
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)
NEWMAT::Matrix ecefToLsrRotMatrix() const
bool subtractContributingCE_LE(const ossim_float64 &cCE, const ossim_float64 &cLE)
Subtract contributing CE/LE.
double atan3(const ossim_float64 y, const ossim_float64 x) const
double dPoly_dLon(const double &nlat, const double &nlon, const double &nhgt, const double *coeffs) const
void jacobianWrtEcef(const ossimEcefPoint &location, NEWMAT::Matrix &jMat) const
std::ostream & print(std::ostream &out) const
Print method.
double theSampNumCoef[20]
const ossim_float64 Fac2D90[NUM_PROB_LEVELS]
void Jacobi(const SymmetricMatrix &, DiagonalMatrix &)
bool computeCE_LE(const pqeProbLev_t pLev, ossim_float64 &CE, ossim_float64 &LE) const
Compute circular/linear error (CE/LE).
double theLineDenCoef[20]
bool extractErrorEllipse(const pqeProbLev_t pLev, pqeErrorEllipse &ellipse)
Extract error ellipse parameters.
OSSIMDLLEXPORT std::ostream & ossimNotify(ossimNotifyLevel level=ossimNotifyLevel_WARN)
double theSampDenCoef[20]
std::basic_ostream< char > ostream
Base class for char output streams.
bool isnan(const float &v)
isnan Test for floating point Not A Number (NAN) value.