[mrpt-topography]
Topographic functions, geoid transformations.
Library mrpt-topography
This C++ library is part of MRPT and can be installed in Debian-based systems with:
sudo apt install libmrpt-topography-dev
Read also how to import MRPT into your CMake scripts.
Conversion and useful data structures to handle topographic data, perform geoid transformations, geocentric coordinates, etc…
See mrpt::topography
Library contents
// typedefs typedef mrpt::math::TPoint3D mrpt::topography::TUTMCoords; typedef mrpt::math::TPoint3D mrpt::topography::TGeocentricCoords; // structs struct mrpt::topography::TCoords; struct mrpt::topography::TDatum10Params; struct mrpt::topography::TDatum1DTransf; struct mrpt::topography::TDatum7Params; struct mrpt::topography::TDatum7Params_TOPCON; struct mrpt::topography::TDatumHelmert2D; struct mrpt::topography::TDatumHelmert2D_TOPCON; struct mrpt::topography::TDatumHelmert3D; struct mrpt::topography::TDatumHelmert3D_TOPCON; struct mrpt::topography::TDatumTransfInterpolation; struct mrpt::topography::TEllipsoid; struct mrpt::topography::TGeodeticCoords; struct mrpt::topography::TPathFromRTKInfo; // global functions bool mrpt::topography::operator == ( const TCoords& a, const TCoords& o ); bool mrpt::topography::operator != ( const TCoords& a, const TCoords& o ); std::ostream& mrpt::topography::operator << ( std::ostream& out, const TCoords& o ); bool mrpt::topography::operator == ( const TGeodeticCoords& a, const TGeodeticCoords& o ); bool mrpt::topography::operator != ( const TGeodeticCoords& a, const TGeodeticCoords& o ); void mrpt::topography::geodeticToENU_WGS84(const TGeodeticCoords& in_coords, mrpt::math::TPoint3D& out_ENU_point, const TGeodeticCoords& in_coords_origin); void mrpt::topography::ENUToGeocentric( const mrpt::math::TPoint3D& in_ENU_point, const TGeodeticCoords& in_coords_origin, TGeocentricCoords& out_coords, const TEllipsoid& ellip ); void mrpt::topography::geocentricToENU_WGS84(const mrpt::math::TPoint3D& in_geocentric_point, mrpt::math::TPoint3D& out_ENU_point, const TGeodeticCoords& in_coords_origin); void mrpt::topography::geocentricToENU_WGS84( const std::vector<mrpt::math::TPoint3D>& in_geocentric_points, std::vector<mrpt::math::TPoint3D>& out_ENU_points, const TGeodeticCoords& in_coords_origin ); void mrpt::topography::geodeticToGeocentric_WGS84(const TGeodeticCoords& in_coords, mrpt::math::TPoint3D& out_point); void mrpt::topography::geodeticToGeocentric(const TGeodeticCoords& in_coords, TGeocentricCoords& out_point, const TEllipsoid& ellip); void mrpt::topography::geocentricToGeodetic(const TGeocentricCoords& in_point, TGeodeticCoords& out_coords, const TEllipsoid& ellip = TEllipsoid::Ellipsoid_WGS84()); void mrpt::topography::transform7params(const mrpt::math::TPoint3D& in_point, const TDatum7Params& in_datum, mrpt::math::TPoint3D& out_point); void mrpt::topography::transform7params_TOPCON(const mrpt::math::TPoint3D& in_point, const TDatum7Params_TOPCON& in_datum, mrpt::math::TPoint3D& out_point); void mrpt::topography::transform10params(const mrpt::math::TPoint3D& in_point, const TDatum10Params& in_datum, mrpt::math::TPoint3D& out_point); void mrpt::topography::transformHelmert2D(const mrpt::math::TPoint2D& p, const TDatumHelmert2D& d, mrpt::math::TPoint2D& o); void mrpt::topography::transformHelmert2D_TOPCON(const mrpt::math::TPoint2D& p, const TDatumHelmert2D_TOPCON& d, mrpt::math::TPoint2D& o); void mrpt::topography::transformHelmert3D(const mrpt::math::TPoint3D& p, const TDatumHelmert3D& d, mrpt::math::TPoint3D& o); void mrpt::topography::transformHelmert3D_TOPCON(const mrpt::math::TPoint3D& p, const TDatumHelmert3D_TOPCON& d, mrpt::math::TPoint3D& o); void mrpt::topography::transform1D(const mrpt::math::TPoint3D& p, const TDatum1DTransf& d, mrpt::math::TPoint3D& o); void mrpt::topography::transfInterpolation(const mrpt::math::TPoint3D& p, const TDatumTransfInterpolation& d, mrpt::math::TPoint3D& o); void mrpt::topography::UTMToGeodetic( double X, double Y, int zone, char hem, double& out_lon, double& out_lat, const TEllipsoid& ellip = TEllipsoid::Ellipsoid_WGS84() ); void mrpt::topography::UTMToGeodetic( const TUTMCoords& UTMCoords, int zone, char hem, TGeodeticCoords& GeodeticCoords, const TEllipsoid& ellip = TEllipsoid::Ellipsoid_WGS84() ); void mrpt::topography::GeodeticToUTM( double in_latitude_degrees, double in_longitude_degrees, double& out_UTM_x, double& out_UTM_y, int& out_UTM_zone, char& out_UTM_latitude_band, const TEllipsoid& ellip = TEllipsoid::Ellipsoid_WGS84() ); void mrpt::topography::geodeticToUTM( const TGeodeticCoords& GeodeticCoords, TUTMCoords& UTMCoords, int& UTMZone, char& UTMLatitudeBand, const TEllipsoid& ellip = TEllipsoid::Ellipsoid_WGS84() ); void mrpt::topography::GeodeticToUTM( const TGeodeticCoords& GeodeticCoords, TUTMCoords& UTMCoords, int& UTMZone, char& UTMLatitudeBand, const TEllipsoid& ellip = TEllipsoid::Ellipsoid_WGS84() ); void mrpt::topography::ENU_axes_from_WGS84( double in_longitude_reference_degrees, double in_latitude_reference_degrees, double in_height_reference_meters, mrpt::math::TPose3D& out_ENU, bool only_angles = false ); void mrpt::topography::ENU_axes_from_WGS84(const TGeodeticCoords& in_coords, mrpt::math::TPose3D& out_ENU, bool only_angles = false); void mrpt::topography::path_from_rtk_gps( mrpt::poses::CPose3DInterpolator& robot_path, const mrpt::obs::CRawlog& rawlog, size_t rawlog_first, size_t rawlog_last, bool isGUI = false, bool disableGPSInterp = false, int path_smooth_filter_size = 2, TPathFromRTKInfo* outInfo = nullptr ); void mrpt::topography::registerAllClasses_mrpt_topography();
Global Functions
void mrpt::topography::geodeticToENU_WGS84( const TGeodeticCoords& in_coords, mrpt::math::TPoint3D& out_ENU_point, const TGeodeticCoords& in_coords_origin )
Coordinates transformation from longitude/latitude/height to ENU (East-North-Up) X/Y/Z coordinates The WGS84 ellipsoid is used for the transformation.
The coordinates are in 3D relative to some user-provided point, with local X axis being east-ward, Y north-ward, Z up-ward. For an explanation, refer to http://en.wikipedia.org/wiki/Reference_ellipsoid The “Up” (Z) direction in ENU is the normal to the ellipsoid, which coincides with the direction of an increasing geodetic height.
See also:
coordinatesTransformation_WGS84_geocentric, ENU_axes_from_WGS84, ENUToGeocentric
void mrpt::topography::ENUToGeocentric( const mrpt::math::TPoint3D& in_ENU_point, const TGeodeticCoords& in_coords_origin, TGeocentricCoords& out_coords, const TEllipsoid& ellip )
ENU to geocentric coordinates.
See also:
void mrpt::topography::geocentricToENU_WGS84( const mrpt::math::TPoint3D& in_geocentric_point, mrpt::math::TPoint3D& out_ENU_point, const TGeodeticCoords& in_coords_origin )
ENU to EFEC (Geocentric) coordinates.
See also:
ENUToGeocentric, geodeticToENU_WGS84
void mrpt::topography::geodeticToGeocentric_WGS84( const TGeodeticCoords& in_coords, mrpt::math::TPoint3D& out_point )
Coordinates transformation from longitude/latitude/height to geocentric X/Y/Z coordinates (with a WGS84 geoid).
The WGS84 ellipsoid is used for the transformation. The coordinates are in 3D where the reference is the center of the Earth. For an explanation, refer to http://en.wikipedia.org/wiki/Reference_ellipsoid
See also:
void mrpt::topography::geodeticToGeocentric( const TGeodeticCoords& in_coords, TGeocentricCoords& out_point, const TEllipsoid& ellip )
Coordinates transformation from longitude/latitude/height to geocentric X/Y/Z coordinates (with an specified geoid).
See also:
void mrpt::topography::geocentricToGeodetic( const TGeocentricCoords& in_point, TGeodeticCoords& out_coords, const TEllipsoid& ellip = TEllipsoid::Ellipsoid_WGS84() )
Coordinates transformation from geocentric X/Y/Z coordinates to longitude/latitude/height.
See also:
void mrpt::topography::transform7params( const mrpt::math::TPoint3D& in_point, const TDatum7Params& in_datum, mrpt::math::TPoint3D& out_point )
7-parameter Bursa-Wolf transformation: [ X Y Z ]_WGS84 = [ dX dY dZ ] + ( 1 + dS ) [ 1 RZ -RY; -RZ 1 RX; RY -RX 1 ] [ X Y Z ]_local
See also:
void mrpt::topography::transform7params_TOPCON( const mrpt::math::TPoint3D& in_point, const TDatum7Params_TOPCON& in_datum, mrpt::math::TPoint3D& out_point )
7-parameter Bursa-Wolf transformation TOPCON: [ X Y Z ]_WGS84 = [ dX dY dZ ] + ( 1 + dS ) [ 1 RZ -RY; -RZ 1 RX; RY -RX 1 ] [ X Y Z ]_local
See also:
void mrpt::topography::transform10params( const mrpt::math::TPoint3D& in_point, const TDatum10Params& in_datum, mrpt::math::TPoint3D& out_point )
10-parameter Molodensky-Badekas transformation: [ X Y Z ]_WGS84 = [ dX dY dZ ] + ( 1 + dS ) [ 1 RZ -RY; -RZ 1 RX; RY -RX 1 ] [ X-Xp Y-Yp Z-Zp ]_local + [Xp Yp Zp]
See also:
void mrpt::topography::transformHelmert2D(const mrpt::math::TPoint2D& p, const TDatumHelmert2D& d, mrpt::math::TPoint2D& o)
Helmert 2D transformation: [ X Y ]_WGS84 = [ dX dY ] + ( 1 + dS ) [ cos(alpha) -sin(alpha); sin(alpha) cos(alpha) ] [ X-Xp Y-Yp Z-Zp ]_local + [Xp Yp Zp].
See also:
void mrpt::topography::transformHelmert2D_TOPCON(const mrpt::math::TPoint2D& p, const TDatumHelmert2D_TOPCON& d, mrpt::math::TPoint2D& o)
Helmert 2D transformation: [ X Y ]_WGS84 = [ dX dY ] + ( 1 + dS ) [ cos(alpha) -sin(alpha); sin(alpha) cos(alpha) ] [ X-Xp Y-Yp Z-Zp ]_local + [Xp Yp Zp].
See also:
void mrpt::topography::transformHelmert3D(const mrpt::math::TPoint3D& p, const TDatumHelmert3D& d, mrpt::math::TPoint3D& o)
Helmert3D transformation: [ X Y Z ]_WGS84 = [ dX dY dZ ] + ( 1 + dS ) [ 1 -RZ RY; RZ 1 -RX; -RY RX 1 ] [ X Y Z ]_local.
Helmert 3D transformation: [ X Y ]_WGS84 = [ dX dY ] + ( 1 + dS ) [ cos(alpha) -sin(alpha); sin(alpha) cos(alpha) ] [ X-Xp Y-Yp Z-Zp ]_local + [Xp Yp Zp].
See also:
void mrpt::topography::transformHelmert3D_TOPCON(const mrpt::math::TPoint3D& p, const TDatumHelmert3D_TOPCON& d, mrpt::math::TPoint3D& o)
Helmert 3D transformation: [ X Y ]_WGS84 = [ dX dY ] + ( 1 + dS ) [ cos(alpha) -sin(alpha); sin(alpha) cos(alpha) ] [ X-Xp Y-Yp Z-Zp ]_local + [Xp Yp Zp].
See also:
void mrpt::topography::transform1D(const mrpt::math::TPoint3D& p, const TDatum1DTransf& d, mrpt::math::TPoint3D& o)
1D transformation: [ Z ]_WGS84 = (dy * X - dx * Y + Z)*(1+e)+DZ
See also:
void mrpt::topography::transfInterpolation(const mrpt::math::TPoint3D& p, const TDatumTransfInterpolation& d, mrpt::math::TPoint3D& o)
Interpolation: [ Z ]_WGS84 = (dy * X - dx * Y + Z)*(1+e)+DZ.
1D transformation: [ X;Y ]_WGS84 = [X;Y]_locales+[1 -sin(d.beta);0 cos(d.beta)]*[x*d.dSx;y*d.dSy ]
See also:
void mrpt::topography::UTMToGeodetic( double X, double Y, int zone, char hem, double& out_lon, double& out_lat, const TEllipsoid& ellip = TEllipsoid::Ellipsoid_WGS84() )
Returns the Geodetic coordinates of the UTM input point.
Parameters:
X |
East coordinate of the input point. |
Y |
North coordinate of the input point. |
zone |
time zone (Spanish: “huso”). |
hem |
hemisphere (‘N’/’n’ for North or ‘S’/s’ for South ). An exception will be raised on any other value. |
ellip |
the reference ellipsoid used for the transformation (default: WGS84) |
out_lat |
Out latitude, in degrees. |
out_lon |
Out longitude, in degrees. |
void mrpt::topography::UTMToGeodetic( const TUTMCoords& UTMCoords, int zone, char hem, TGeodeticCoords& GeodeticCoords, const TEllipsoid& ellip = TEllipsoid::Ellipsoid_WGS84() )
Returns the Geodetic coordinates of the UTM input point.
Parameters:
UTMCoords |
UTM input coordinates. |
zone |
time zone (Spanish: “huso”). |
hem |
hemisphere (‘N’/’n’ for North or ‘S’/s’ for South ). An exception will be raised on any other value. |
GeodeticCoords |
Out geodetic coordinates. |
ellip |
the reference ellipsoid used for the transformation (default: WGS84) |
void mrpt::topography::GeodeticToUTM( double in_latitude_degrees, double in_longitude_degrees, double& out_UTM_x, double& out_UTM_y, int& out_UTM_zone, char& out_UTM_latitude_band, const TEllipsoid& ellip = TEllipsoid::Ellipsoid_WGS84() )
Convert latitude and longitude coordinates into UTM coordinates, computing the corresponding UTM zone and latitude band.
This method is based on public code by Gabriel Ruiz Martinez and Rafael Palacios. Example:
Input: Lat=40.3154333 Lon=-3.4857166 Output: x = 458731 y = 4462881 utm_zone = 30 utm_band = T
See also:
http://www.mathworks.com/matlabcentral/fileexchange/10915
void mrpt::topography::GeodeticToUTM( const TGeodeticCoords& GeodeticCoords, TUTMCoords& UTMCoords, int& UTMZone, char& UTMLatitudeBand, const TEllipsoid& ellip = TEllipsoid::Ellipsoid_WGS84() )
Convert latitude and longitude coordinates into UTM coordinates, computing the corresponding UTM zone and latitude band.
This method is based on public code by Gabriel Ruiz Martinez and Rafael Palacios. Example:
Input: Lat=40.3154333 Lon=-3.4857166 Output: x = 458731 y = 4462881 utm_zone = 30 utm_band = T
See also:
http://www.mathworks.com/matlabcentral/fileexchange/10915
void mrpt::topography::ENU_axes_from_WGS84( double in_longitude_reference_degrees, double in_latitude_reference_degrees, double in_height_reference_meters, mrpt::math::TPose3D& out_ENU, bool only_angles = false )
Returns the East-North-Up (ENU) coordinate system associated to the given point.
This is the reference employed in geodeticToENU_WGS84 The “Up” (Z) direction in ENU is the normal to the ellipsoid, which coincides with the direction of an increasing geodetic height.
Parameters:
only_angles |
If set to true, the (x,y,z) fields will be left zeroed. |
See also:
void mrpt::topography::ENU_axes_from_WGS84( const TGeodeticCoords& in_coords, mrpt::math::TPose3D& out_ENU, bool only_angles = false )
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
void mrpt::topography::path_from_rtk_gps( mrpt::poses::CPose3DInterpolator& robot_path, const mrpt::obs::CRawlog& rawlog, size_t rawlog_first, size_t rawlog_last, bool isGUI = false, bool disableGPSInterp = false, int path_smooth_filter_size = 2, TPathFromRTKInfo* outInfo = nullptr )
Reconstruct the path of a vehicle equipped with 3 RTK GPSs.
For more details on the method, refer to the paper: (…)
Parameters:
robot_path |
[OUT] The reconstructed vehicle path |
rawlog |
[IN] The dataset. It must contain mrpt::obs::CObservationGPS observations with GGA datums. |
rawlog_first |
[IN] The index of the first entry to process (first=0) |
rawlog_last |
[IN] The index of the last entry to process |
isGUI |
[IN] If set to true, some progress dialogs will be shown during the computation (requires MRPT built with support for wxWidgets). |
disableGPSInterp |
[IN] Whether to interpolate missing GPS readings between very close datums. |
path_smooth_filter_size |
[IN] Size of the window in the pitch & roll noise filtering. |
outInfo |
[OUT] Optional output: additional information from the optimization |
See also:
void mrpt::topography::registerAllClasses_mrpt_topography()
Forces manual RTTI registration of all serializable classes in this namespace.
Should never be required to be explicitly called by users, except if building MRPT as a static library.