30 static const char PRODUCT_GEOREFERENCED_FLAG_KW[] =
"product_georeferenced_flag";
31 static const char OPTIMIZATION_FACTOR_X_KW[] =
"optimization_factor_x";
32 static const char OPTIMIZATION_FACTOR_Y_KW[] =
"optimization_factor_y";
33 static const char OPTIMIZATION_BIAS_X_KW[] =
"optimization_bias_x";
34 static const char OPTIMIZATION_BIAS_Y_KW[] =
"optimization_bias_y";
40 static ossimTrace traceDebug(
"ossimGeometricSarSensorModel:debug");
49 _isProductGeoreferenced(false),
50 _optimizationFactorX(0.0),
51 _optimizationFactorY(0.0),
52 _optimizationBiasX(0.0),
53 _optimizationBiasY(0.0)
61 _platformPosition(rhs._platformPosition?rhs._platformPosition->Clone():(
PlatformPosition*)0),
62 _sensor(rhs._sensor?rhs._sensor->Clone():(
SensorParams*)0),
63 _refPoint(rhs._refPoint?rhs._refPoint->Clone():(
RefPoint *)0),
64 _isProductGeoreferenced(rhs._isProductGeoreferenced),
65 _optimizationFactorX(rhs._optimizationFactorX),
66 _optimizationFactorY(rhs._optimizationFactorY),
67 _optimizationBiasX(rhs._optimizationBiasX),
68 _optimizationBiasY(rhs._optimizationBiasY),
69 _imageFilename(rhs._imageFilename),
70 _productXmlFile(rhs._productXmlFile)
104 const double CLUM = 2.99792458e+8 ;
130 const double& heightEllipsoid,
180 worldPoint.
lat = lat;
181 worldPoint.
lon = lon;
182 worldPoint.
hgt = heightEllipsoid ;
200 if (groundCoordinates.size() != imageCoordinates.size())
return false ;
213 if (groundCoordinates.size() == 0)
return true ;
217 std::list<ossimDpt> inverseLocResults ;
222 inverseLocResults.push_back(itLoc) ;
228 double xErrorMean = 0.0, yErrorMean = 0.0, xActualPow = 0.0, yActualPow = 0.0, xActualMean = 0.0, yActualMean = 0.0,
229 xErrorByActualMean = 0.0, yErrorByActualMean = 0.0 ;
230 double xLocalError, yLocalError ;
233 std::list<ossimDpt>::iterator itEstimatedCoords = inverseLocResults.begin() ;
235 xLocalError = itActualCoords->x - itEstimatedCoords->x ;
236 yLocalError = itActualCoords->y - itEstimatedCoords->y ;
238 xErrorMean += xLocalError ;
239 yErrorMean += yLocalError ;
240 xActualMean += itActualCoords->x ;
241 yActualMean += itActualCoords->y ;
242 xActualPow += itActualCoords->x * itActualCoords->x ;
243 yActualPow += itActualCoords->y * itActualCoords->y ;
244 xErrorByActualMean += xLocalError * itActualCoords->x ;
245 yErrorByActualMean += yLocalError * itActualCoords->y ;
251 xErrorMean /= nbPoints ;
252 yErrorMean /= nbPoints ;
253 xActualMean /= nbPoints ;
254 yActualMean /= nbPoints ;
255 xActualPow /= nbPoints ;
256 yActualPow /= nbPoints ;
257 xErrorByActualMean /= nbPoints ;
258 yErrorByActualMean /= nbPoints ;
261 if (fabs(xActualPow - xActualMean*xActualMean) >
FLT_EPSILON)
262 _optimizationFactorX = (xErrorByActualMean - xErrorMean * xActualMean) / (xActualPow - xActualMean*xActualMean) ;
263 if (fabs(yActualPow - yActualMean*yActualMean) >
FLT_EPSILON)
264 _optimizationFactorY = (yErrorByActualMean - yErrorMean * yActualMean) / (yActualPow - yActualMean*yActualMean) ;
296 const char* prefix)
const 299 static const char MODULE[] =
"ossimGeometricSarSensorModel::saveState";
319 PRODUCT_GEOREFERENCED_FLAG_KW,
322 OPTIMIZATION_FACTOR_X_KW,
325 OPTIMIZATION_FACTOR_Y_KW,
328 OPTIMIZATION_BIAS_X_KW,
331 OPTIMIZATION_BIAS_Y_KW,
343 << MODULE <<
" exit status = " << (result?
"true":
"false\n")
353 static const char MODULE[] =
"ossimGeometricSarSensorModel::loadState";
369 <<
"\nossimSensorModel::loadState failed!\n";
385 <<
"\n_platformPosition->loadState failed!\n";
401 <<
"\n_sensor->loadState failed!\n";
419 <<
"\n_refPoint->loadState failed!\n";
424 const char* lookup = 0;
427 lookup = kwl.
find(prefix, PRODUCT_GEOREFERENCED_FLAG_KW);
439 <<
"\nRequired keyword not found: " 440 << PRODUCT_GEOREFERENCED_FLAG_KW <<
"\n";
445 lookup = kwl.
find(prefix, OPTIMIZATION_FACTOR_X_KW);
457 <<
"\nRequired keyword not found: " 458 << OPTIMIZATION_FACTOR_X_KW <<
"\n";
463 lookup = kwl.
find(prefix, OPTIMIZATION_FACTOR_Y_KW);
475 <<
"\nRequired keyword not found: " 476 << OPTIMIZATION_FACTOR_Y_KW <<
"\n";
481 lookup = kwl.
find(prefix,OPTIMIZATION_BIAS_X_KW);
493 <<
"\nRequired keyword not found: " 494 << OPTIMIZATION_BIAS_X_KW <<
"\n";
499 lookup = kwl.
find(prefix,OPTIMIZATION_BIAS_Y_KW);
511 <<
"\nRequired keyword not found: " 512 << OPTIMIZATION_BIAS_X_KW <<
"\n";
533 << MODULE <<
" exit status = " << (result?
"true":
"false\n")
541 if(!InitSRGR(kwl, prefix))
545 if(!InitPlatformPosition(kwl, prefix))
549 if(!InitSensorParams(kwl, prefix))
553 if(!InitRefPoint(kwl, prefix))
563 out << setprecision(15) << setiosflags(ios::fixed)
564 <<
"\nossimGeometricSarSensorModel class data members:\n";
566 const char* prefix = 0;
568 if (_platformPosition)
570 _platformPosition->saveState(kwl, prefix);
574 _sensor->saveState(kwl, prefix);
578 _refPoint->saveState(kwl, prefix);
582 PRODUCT_GEOREFERENCED_FLAG_KW,
583 (_isProductGeoreferenced?
"true":
"false"));
585 OPTIMIZATION_FACTOR_X_KW,
586 _optimizationFactorX);
588 OPTIMIZATION_FACTOR_Y_KW,
589 _optimizationFactorY);
591 OPTIMIZATION_BIAS_X_KW,
594 OPTIMIZATION_BIAS_Y_KW,
606 bool ossimGeometricSarSensorModel::createReplacementOCG()
616 _replacementOcgModel->setMinGridSpacing(50);
622 _replacementOcgModel->buildGrid(theImageClipRect,
this, 500.00,
true,
false);
625 bool status = _replacementOcgModel->saveCoarseGrid(_imageFilename);
637 void ossimGeometricSarSensorModel::lineSampleToWorld(
const ossimDpt& image_point,
651 if (!insideImage(image_point)&&(!theExtrapolateImageFlag))
653 gpt = extrapolate(image_point);
665 static const double LON_LAT_THRESHOLD = .00001;
666 static const int MAX_NUM_ITERATIONS = 30;
667 static const double LON_LAT_STEP = .00001;
674 gpt.
lond(theRefGndPt.lond());
675 gpt.
latd(theRefGndPt.latd());
682 double du_dlat, du_dlon, dv_dlat, dv_dlon;
683 double delta_lat, delta_lon, delta_u, delta_v;
695 gpt_dlat.
latd(gpt.
latd() + LON_LAT_STEP);
699 gpt_dlon.
lond(gpt.
lond() + LON_LAT_STEP);
705 worldToLineSample(gpt, ip);
706 worldToLineSample(gpt_dlat, ip_dlat);
707 worldToLineSample(gpt_dlon, ip_dlon);
715 du_dlat = (ip_dlat.
u - ip.
u) / LON_LAT_STEP;
716 du_dlon = (ip_dlon.
u - ip.
u) / LON_LAT_STEP;
717 dv_dlat = (ip_dlat.
v - ip.
v) / LON_LAT_STEP;
718 dv_dlon = (ip_dlon.
v - ip.
v) / LON_LAT_STEP;
723 delta_u = image_point.
u - ip.
u;
724 delta_v = image_point.
v - ip.
v;
729 inverse_norm = du_dlon*dv_dlat - dv_dlon*du_dlat;
733 delta_lon = (delta_u*dv_dlat - delta_v*du_dlat)/inverse_norm;
734 delta_lat = (delta_v*du_dlon - delta_u*dv_dlon)/inverse_norm;
744 done = ((fabs(delta_lon) < LON_LAT_THRESHOLD) && (fabs(delta_lat) < LON_LAT_THRESHOLD));
746 }
while ((!done) && (iters < MAX_NUM_ITERATIONS));
748 if (traceDebug() || debug)
760 void ossimGeometricSarSensorModel::set_platformPosition(
PlatformPosition* platformPosition)
762 if(_platformPosition != 0)
764 delete _platformPosition;
765 _platformPosition = 0;
767 _platformPosition = platformPosition->
Clone();
770 void ossimGeometricSarSensorModel::set_sensorParams(
SensorParams* sensorParams)
777 _sensor = sensorParams->
Clone();
780 void ossimGeometricSarSensorModel::set_refPoint(
RefPoint* refPoint)
787 _refPoint = refPoint->
Clone();
793 return _platformPosition;
803 RefPoint* ossimGeometricSarSensorModel::get_refPoint()
const
std::list< ossimGpt > _optimizationGCPsGroundCoordinates
List Ground Control Points used by the optimization.
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
virtual void lineSampleHeightToWorld(const ossimDpt &image_point, const double &heightEllipsoid, ossimGpt &worldPoint) const
This function is able to convert image coordinates into world coordinates the geometric model of SAR ...
bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
Method to save object state to a keyword list.
double lond() const
Will convert the radian measure to degrees.
bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
Method to the load (recreate) the state of the object from a keyword list.
RTTI_DEF1(ossimAlosPalsarModel, "ossimAlosPalsarModel", ossimGeometricSarSensorModel)
Represents serializable keyword/value map.
Ephemeris * get_ephemeris()
const char * find(const char *key) const
bool almostEqual(T x, T y, T tolerance=FLT_EPSILON)
This class handles the referential point.
double get_distance() const
virtual int ImageToWorld(double distance, JSDDateTime time, double height, double &lon, double &lat) const
This function is able to convert image coordinates into geodetic world coordinates using a geometric ...
virtual bool getPlatformPositionAtLine(double line, vector< double > &position, vector< double > &speed)
This function associates an image line number to a platform position and speed.
double _optimizationBiasX
ossim_float64 hgt
Height in meters above the ellipsiod.
double get_nRangeLook() const
static ossimElevManager * instance()
METHOD: instance() Implements singelton pattern.
std::ostream & print(H5::H5File *file, std::ostream &out)
Print method.
This class handles the sensor parameters.
virtual void clearGCPlist()
Clears _optimizationGCPsGroundCoordinates and _optimizationGCPsImageCoordinates attributes Updates th...
This class provides basic location services for SAR sensors.
virtual JSDDateTime getTime(double line) const
This function associates an image line number to an azimuth time.
double latd() const
Will convert the radian measure to degrees.
bool _isProductGeoreferenced
True iff the product is ground range.
int get_lin_direction() const
This class allows for direct localisation and indirect localisation using the geometric model of SAR ...
bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
Method to the load (recreate) the state of the object from a keyword list.
void set_second(double second)
void add(const char *prefix, const ossimKeywordlist &kwl, bool overwrite=true)
double get_nAzimuthLook() const
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
Method to the load (recreate) the state of the object from a keyword list.
bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
Method to save object state to a keyword list.
static void setInterpolationError(double error=.1)
This is used when building a grid from a projector.
bool toBool() const
String to numeric methods.
virtual void getGCPlist(std::list< ossimGpt > &groundCoordinates, std::list< ossimDpt > &imageCoordinates)
Returns _optimizationGCPsGroundCoordinates and _optimizationGCPsImageCoordinates attributes.
virtual ~ossimGeometricSarSensorModel()
Destructor.
double get_second() const
double _optimizationFactorY
double get_pix_col() const
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
virtual std::ostream & print(std::ostream &out) const
virtual SensorParams * Clone()
static ossimPreferences * instance()
double get_pix_line() const
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
Method to save object state to a keyword list.
virtual void worldToLineSample(const ossimGpt &world_point, ossimDpt &image_point) const
int get_col_direction() const
double _optimizationBiasY
PlatformPosition * _platformPosition
Handle the position of the platform.
JSDDateTime get_date() const
ossimGeometricSarSensorModel()
default constructor
static const char * CREATE_OCG_PREF_KW
virtual double getSlantRangeFromGeoreferenced(double col) const =0
This function associates an image column number to a slant range when the image is georeferenced (gro...
double _optimizationFactorX
Optimization result : linear error correction in both dimensions.
std::list< ossimDpt > _optimizationGCPsImageCoordinates
virtual bool optimizeModel(const std::list< ossimGpt > &groundCoordinates, const std::list< ossimDpt > &imageCoordinates)
This function optimizes the model according to a list of Ground Control Points.
This class represents a date.
virtual double getSlantRange(double col) const
This function associates an image column number to a slant range.
OSSIMDLLEXPORT std::ostream & ossimNotify(ossimNotifyLevel level=ossimNotifyLevel_WARN)
std::basic_ostream< char > ostream
Base class for char output streams.