digiKam Developer Documentation
Professional Photo Management with the Power of Open Source
Loading...
Searching...
No Matches
Digikam::GeodeticCalculator Class Reference

Public Member Functions

 GeodeticCalculator (const Ellipsoid &e=Ellipsoid::WGS84())
 Performs geodetic calculations on an ellipsoid.
 
double azimuth ()
 Returns the azimuth.
 
bool checkOrthodromicDistance ()
 Computes the orthodromic distance using the algorithm implemented in the Geotools's ellipsoid class (if available), and check if the error is smaller than some tolerance error.
 
bool computeDestinationPoint ()
 Computes the destination point from the starting point, the azimuth and the orthodromic distance.
 
bool computeDirection ()
 Computes the azimuth and orthodromic distance from the startingGeographicPoint starting point and the destinationGeographicPoint destination point.
 
QPointF destinationGeographicPoint ()
 
bool destinationGeographicPoint (double *longitude, double *latitude)
 Returns the destination point.
 
Ellipsoid ellipsoid () const
 Returns the referenced ellipsoid.
 
double meridianArcLength (double latitude1, double latitude2)
 Calculates the meridian arc length between two points in the same meridian in the referenced ellipsoid.
 
double meridianArcLengthRadians (double P1, double P2)
 Calculates the meridian arc length between two points in the same meridian in the referenced ellipsoid.
 
double orthodromicDistance ()
 Returns the orthodromic distance.
 
void setDestinationGeographicPoint (double longitude, double latitude)
 Set the destination point in geographic coordinates.
 
void setDirection (double azimuth, double distance)
 Set the azimuth and the distance from the startingGeographicPoint starting point.
 
void setStartingGeographicPoint (double longitude, double latitude)
 Set the starting point in geographic coordinates.
 

Protected Member Functions

double castToAngleRange (const double alpha)
 
bool checkAzimuth (double *azimuth)
 Checks the azimuth validity.
 
bool checkLatitude (double *latitude)
 Checks the latitude validity.
 
bool checkLongitude (double *longitude)
 Checks the longitude validity.
 
bool checkOrthodromicDistance (const double distance)
 Checks the orthodromic distance validity.
 

Protected Attributes

double a01 = 0.0
 Parameters computed from the ellipsoid.
 
double a02 = 0.0
 
double a03 = 0.0
 
double a21 = 0.0
 
double a22 = 0.0
 
double a23 = 0.0
 
double a42 = 0.0
 
double a43 = 0.0
 
double a63 = 0.0
 
double f = 0.0
 
double f2 = 0.0
 
double f3 = 0.0
 
double f4 = 0.0
 
double fo = 0.0
 GPNHRI parameters computed from the ellipsoid.
 
double m_A = 0.0
 GPNARC parameters computed from the ellipsoid.
 
double m_azimuth = 0.0
 
double m_B = 0.0
 
double m_C = 0.0
 
double m_D = 0.0
 
bool m_destinationValid = false
 Tell if the destination point is valid.
 
bool m_directionValid = false
 Tell if the azimuth and the distance are valids.
 
double m_distance = 0.0
 The distance and azimuth (in radians) from the starting point (long1, lat1) to the destination point (long2, lat2).
 
double m_E = 0.0
 
double m_eccentricitySquared = 0.0
 The eccentricity squared of the referenced ellipsoid.
 
Ellipsoid m_ellipsoid
 The encapsulated ellipsoid.
 
double m_F = 0.0
 
double m_lat1 = 0.0
 The (latitude, longitude) coordinate of the first point in radians.
 
double m_lat2 = 0.0
 The (latitude, longitude) coordinate of the destination point in radians.
 
double m_long1 = 0.0
 
double m_long2 = 0.0
 
double m_maxOrthodromicDistance = 0.0
 The maximum orthodromic distance that could be calculated onto the referenced ellipsoid.
 
double m_semiMajorAxis = 0.0
 The semi major axis of the referenced ellipsoid.
 
double m_semiMinorAxis = 0.0
 The semi minor axis of the referenced ellipsoid.
 
double m_TOLERANCE_0 = 5.0e-15
 Tolerance factors from the strictest (TOLERANCE_0) to the most relax one (TOLERANCE_3).
 
double m_TOLERANCE_1 = 5.0e-14
 
double m_TOLERANCE_2 = 5.0e-13
 
double m_TOLERANCE_3 = 7.0e-3
 
double m_TOLERANCE_CHECK = 1E-8
 Tolerance factor for assertions.
 
double T1 = 1.0
 Parameters computed from the ellipsoid.
 
double T2 = 0.0
 
double T4 = 0.0
 
double T6 = 0.0
 

Constructor & Destructor Documentation

◆ GeodeticCalculator()

Digikam::GeodeticCalculator::GeodeticCalculator ( const Ellipsoid e = Ellipsoid::WGS84())
explicit

This class encapsulates a generic ellipsoid and calculates the following properties:

Distance and azimuth between two points. Point located at a given distance and azimuth from an other point.

The calculation use the following information:

The starting position (setStartingPosition), which is always considered valid. It is initially set at (0,0) and can only be changed to another legitimate value. Only one of the following:

  The destination position (setDestinationPosition), or
  An azimuth and distance (setDirection).

The latest one set overrides the other and determines what will be calculated.

Member Function Documentation

◆ azimuth()

double Digikam::GeodeticCalculator::azimuth ( )

This method returns the value set by the last call to setDirection(double,double) setDirection(azimuth,distance), except if setDestinationGeographicPoint(double,double) setDestinationGeographicPoint(...) has been invoked after. In this later case, the azimuth will be computed from the startingGeographicPoint starting point to the destination point.

Returns
The azimuth, in decimal degrees from -180° to +180°.

◆ checkAzimuth()

bool Digikam::GeodeticCalculator::checkAzimuth ( double *  azimuth)
protected

The argument azimuth should be greater or equal than -180 degrees and lower or equals than +180 degrees. As a convenience, this method converts the azimuth to radians.

Parameters
azimuthThe azimuth value in decimal degrees.

◆ checkLatitude()

bool Digikam::GeodeticCalculator::checkLatitude ( double *  latitude)
protected

The argument latitude should be greater or equal than -90 degrees and lower or equals than +90 degrees. As a convenience, this method converts the latitude to radians.

Parameters
latitudeThe latitude value in decimal degrees.

◆ checkLongitude()

bool Digikam::GeodeticCalculator::checkLongitude ( double *  longitude)
protected

The argument longitude should be greater or equal than -180 degrees and lower or equals than +180 degrees. As a convenience, this method converts the longitude to radians.

Parameters
longitudeThe longitude value in decimal degrees.

◆ checkOrthodromicDistance()

bool Digikam::GeodeticCalculator::checkOrthodromicDistance ( const double  distance)
protected

Arguments orthodromicDistance should be greater or equal than 0 and lower or equals than the maximum orthodromic distance.

Parameters
distanceThe orthodromic distance value.

◆ computeDirection()

bool Digikam::GeodeticCalculator::computeDirection ( )

Computes the azimuth and orthodromic distance from the startingGeographicPoint() and the destinationGeographicPoint().

◆ destinationGeographicPoint()

bool Digikam::GeodeticCalculator::destinationGeographicPoint ( double *  longitude,
double *  latitude 
)

This method returns the point set by the last call to a setDestinationGeographicPoint(...) method, except if setDirection(...) has been invoked after. In this later case, the destination point will be computed from the starting point to the azimuth and distance specified. Coordinates positive North and East.

Returns
The destination point. The x and y coordinates are the longitude and latitude in decimal degrees, respectively.

◆ meridianArcLength()

double Digikam::GeodeticCalculator::meridianArcLength ( double  latitude1,
double  latitude2 
)
Parameters
latitude1The latitude of the first point (in decimal degrees).
latitude2The latitude of the second point (in decimal degrees).
Returns
Returned the meridian arc length between latitude1 and latitude2

◆ meridianArcLengthRadians()

double Digikam::GeodeticCalculator::meridianArcLengthRadians ( double  P1,
double  P2 
)
Parameters
P1The latitude of the first point (in radians).
P2The latitude of the second point (in radians).
Returns
Returned the meridian arc length between P1 and P2

◆ orthodromicDistance()

double Digikam::GeodeticCalculator::orthodromicDistance ( )

This method returns the value set by the last call to setDirection(double,double) setDirection(azimuth,distance), except if setDestinationGeographicPoint(double,double) setDestinationGeographicPoint(...) has been invoked after. In this later case, the distance will be computed from the startingGeographicPoint starting point to the destination point.

Returns
The orthodromic distance, in the same units as the getEllipsoid ellipsoid axis.

◆ setDestinationGeographicPoint()

void Digikam::GeodeticCalculator::setDestinationGeographicPoint ( double  longitude,
double  latitude 
)

The azimuth and distance values will be updated as a side effect of this call. They will be recomputed the next time getAzimuth() or getOrthodromicDistance() are invoked. Coordinates positive North and East.

Parameters
longitudeThe longitude in decimal degrees between -180 and +180°
latitudeThe latitude in decimal degrees between -90 and +90°

◆ setDirection()

void Digikam::GeodeticCalculator::setDirection ( double  azimuth,
double  distance 
)

The destination point will be updated as a side effect of this call. It will be recomputed the next time destinationGeographicPoint() is invoked. Azimuth 0° North.

Parameters
azimuthThe azimuth in decimal degrees from -180° to 180°.
distanceThe orthodromic distance in the same units as the ellipsoid axis.

◆ setStartingGeographicPoint()

void Digikam::GeodeticCalculator::setStartingGeographicPoint ( double  longitude,
double  latitude 
)

The azimuth, the orthodromic distance and the destination point are discarded. They will need to be specified again. Coordinates positive North and East.

Parameters
longitudeThe longitude in decimal degrees between -180 and +180°
latitudeThe latitude in decimal degrees between -90 and +90°

Member Data Documentation

◆ fo

double Digikam::GeodeticCalculator::fo = 0.0
protected

f if the flattening of the referenced ellipsoid. f2, f3 and f4 are f2, f3 and f4 respectively.

◆ m_destinationValid

bool Digikam::GeodeticCalculator::m_destinationValid = false
protected

false if long2 and lat2 need to be computed.

◆ m_directionValid

bool Digikam::GeodeticCalculator::m_directionValid = false
protected

false if distance and azimuth need to be computed.

◆ m_lat1

double Digikam::GeodeticCalculator::m_lat1 = 0.0
protected

This point is set by setStartingGeographicPoint.

◆ m_lat2

double Digikam::GeodeticCalculator::m_lat2 = 0.0
protected

This point is set by setDestinationGeographicPoint.

◆ m_TOLERANCE_CHECK

double Digikam::GeodeticCalculator::m_TOLERANCE_CHECK = 1E-8
protected

It has no impact on computed values.