Skip to content
Snippets Groups Projects
QGCGeo.h 3.26 KiB
Newer Older
  • Learn to ignore specific revisions
  • /****************************************************************************
     *
     *   (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
     *
     * QGroundControl is licensed according to the terms in the file
     * COPYING.md in the root of the source code directory.
     *
     ****************************************************************************/
    
    
    
    /// @file
    ///     @brief Coordinate transformation math functions.
    ///     @link https://github.com/PX4/Firmware/blob/master/src/lib/geo/geo.c
    ///     @link http://psas.pdx.edu/CoordinateSystem/Latitude_to_LocalTangent.pdf
    ///     @link http://dspace.dsto.defence.gov.au/dspace/bitstream/1947/3538/1/DSTO-TN-0432.pdf
    ///     @author David Goodman <dagoodma@gmail.com>
    
    
    LM's avatar
    LM committed
    #ifndef QGCGEO_H
    #define QGCGEO_H
    
    
    #include <QGeoCoordinate>
    
    LM's avatar
    LM committed
    /**
    
     * @brief Project a geodetic coordinate on to local tangential plane (LTP) as coordinate with East,
     * North, and Down components in meters.
    
     * @param[in] coord Geodetic coordinate to project onto LTP.
     * @param[in] origin Geoedetic origin for LTP projection.
     * @param[out] x North component of coordinate in local plane.
     * @param[out] y East component of coordinate in local plane.
    
     * @param[out] z Down component of coordinate in local plane.
    
    LM's avatar
    LM committed
     */
    
    void convertGeoToNed(QGeoCoordinate coord, QGeoCoordinate origin, double* x, double* y, double* z);
    
    LM's avatar
    LM committed
    
    
     * @brief Transform a local (East, North, and Down) coordinate into a geodetic coordinate.
    
     * @param[in] x North component of local coordinate in meters.
     * @param[in] x East component of local coordinate in meters.
    
     * @param[in] x Down component of local coordinate in meters.
    
     * @param[in] origin Geoedetic origin for LTP.
     * @param[out] coord Geodetic coordinate to hold result.
     */
    
    void convertNedToGeo(double x, double y, double z, QGeoCoordinate origin, QGeoCoordinate *coord);
    
    LM's avatar
    LM committed
    
    
    // LatLonToUTMXY
    // Converts a latitude/longitude pair to x and y coordinates in the
    // Universal Transverse Mercator projection.
    //
    // Inputs:
    //   lat - Latitude of the point, in radians.
    //   lon - Longitude of the point, in radians.
    //   zone - UTM zone to be used for calculating values for x and y.
    //          If zone is less than 1 or greater than 60, the routine
    //          will determine the appropriate zone from the value of lon.
    //
    // Outputs:
    //   x - The x coordinate (easting) of the computed point. (in meters)
    //   y - The y coordinate (northing) of the computed point. (in meters)
    //
    // Returns:
    //   The UTM zone used for calculating the values of x and y.
    int convertGeoToUTM(const QGeoCoordinate& coord, double& easting, double& northing);
    
    // UTMXYToLatLon
    //
    // Converts x and y coordinates in the Universal Transverse Mercator//   The UTM zone parameter should be in the range [1,60].
    
    // projection to a latitude/longitude pair.
    //
    // Inputs:
    // x - The easting of the point, in meters.
    // y - The northing of the point, in meters.
    // zone - The UTM zone in which the point lies.
    // southhemi - True if the point is in the southern hemisphere;
    //               false otherwise.
    //
    // Outputs:
    // lat - The latitude of the point, in radians.
    // lon - The longitude of the point, in radians.
    //
    // Returns:
    // The function does not return a value.
    void convertUTMToGeo(double easting, double northing, int zone, bool southhemi, QGeoCoordinate& coord);
    
    
    LM's avatar
    LM committed
    #endif // QGCGEO_H