12#ifndef GEOSPATIAL_OPERATIONS_HPP
13#define GEOSPATIAL_OPERATIONS_HPP
15#include "../AutonomyLogging.h"
18#include <GeographicLib/Geodesic.hpp>
19#include <GeographicLib/UTMUPS.hpp>
39 enum class WaypointType
52 enum class PositionFixType
58 eGNSSDeadReckoningCombined,
86 double dDistanceMeters;
87 double dArcLengthDegrees;
88 double dStartRelativeBearing;
89 double dEndRelativeBearing;
108 double dMeridianConvergence;
110 PositionFixType eCoordinateAccuracyFixType;
111 bool bIsDifferential;
112 std::chrono::system_clock::time_point tmTimestamp;
134 double dLongitude = 0.0,
135 double dAltitude = 0.0,
136 double d2DAccuracy = -1.0,
137 double d3DAccuracy = -1.0,
138 double dMeridianConvergence = -1.0,
140 PositionFixType eCoordinateAccuracyFixType = PositionFixType::eUNKNOWN,
141 bool bIsDifferential =
false,
142 std::chrono::system_clock::time_point tmTimestamp = std::chrono::system_clock::time_point().
min())
145 this->dLatitude = dLatitude;
146 this->dLongitude = dLongitude;
147 this->dAltitude = dAltitude;
148 this->d2DAccuracy = d2DAccuracy;
149 this->d3DAccuracy = d3DAccuracy;
150 this->dMeridianConvergence = dMeridianConvergence;
151 this->dScale = dScale;
152 this->eCoordinateAccuracyFixType = eCoordinateAccuracyFixType;
153 this->bIsDifferential = bIsDifferential;
154 this->tmTimestamp = tmTimestamp;
170 return (dLatitude == stOtherCoordinate.dLatitude && dLongitude == stOtherCoordinate.dLongitude && dAltitude == stOtherCoordinate.dAltitude &&
171 d2DAccuracy == stOtherCoordinate.d2DAccuracy && d3DAccuracy == stOtherCoordinate.d3DAccuracy &&
172 eCoordinateAccuracyFixType == stOtherCoordinate.eCoordinateAccuracyFixType && bIsDifferential == stOtherCoordinate.bIsDifferential);
197 std::ostringstream oss;
198 oss <<
"Latitude: " << dLatitude <<
", Longitude: " << dLongitude <<
", Altitude: " << dAltitude;
217 bool bWithinNorthernHemisphere;
221 double dMeridianConvergence;
223 PositionFixType eCoordinateAccuracyFixType;
224 bool bIsDifferential;
225 std::chrono::system_clock::time_point tmTimestamp;
250 double dNorthing = 0.0,
252 bool bWithinNorthernHemisphere =
true,
253 double dAltitude = 0.0,
254 double d2DAccuracy = -1.0,
255 double d3DAccuracy = -1.0,
256 double dMeridianConvergence = -1.0,
258 PositionFixType eCoordinateAccuracyFixType = PositionFixType::eUNKNOWN,
259 bool bIsDifferential =
false,
260 std::chrono::system_clock::time_point tmTimestamp = std::chrono::system_clock::time_point().
min())
263 this->dEasting = dEasting;
264 this->dNorthing = dNorthing;
266 this->bWithinNorthernHemisphere = bWithinNorthernHemisphere;
267 this->dAltitude = dAltitude;
268 this->d2DAccuracy = d2DAccuracy;
269 this->d3DAccuracy = d3DAccuracy;
270 this->dMeridianConvergence = dMeridianConvergence;
271 this->dScale = dScale;
272 this->eCoordinateAccuracyFixType = eCoordinateAccuracyFixType;
273 this->bIsDifferential = bIsDifferential;
274 this->tmTimestamp = tmTimestamp;
290 return (dEasting == stOtherCoordinate.dEasting && dNorthing == stOtherCoordinate.dNorthing && nZone == stOtherCoordinate.nZone &&
291 bWithinNorthernHemisphere == stOtherCoordinate.bWithinNorthernHemisphere && dAltitude == stOtherCoordinate.dAltitude &&
292 d2DAccuracy == stOtherCoordinate.d2DAccuracy && d3DAccuracy == stOtherCoordinate.d3DAccuracy &&
293 eCoordinateAccuracyFixType == stOtherCoordinate.eCoordinateAccuracyFixType && bIsDifferential == stOtherCoordinate.bIsDifferential);
318 std::ostringstream oss;
319 oss <<
"Easting: " << dEasting <<
", Northing: " << dNorthing <<
", Altitude: " << dAltitude;
339 stConvertCoord.d2DAccuracy = stGPSCoord.d2DAccuracy;
340 stConvertCoord.d3DAccuracy = stGPSCoord.d3DAccuracy;
341 stConvertCoord.dAltitude = stGPSCoord.dAltitude;
342 stConvertCoord.eCoordinateAccuracyFixType = stGPSCoord.eCoordinateAccuracyFixType;
343 stConvertCoord.bIsDifferential = stGPSCoord.bIsDifferential;
344 stConvertCoord.tmTimestamp = stGPSCoord.tmTimestamp;
350 GeographicLib::UTMUPS::Forward(stGPSCoord.dLatitude,
351 stGPSCoord.dLongitude,
352 stConvertCoord.nZone,
353 stConvertCoord.bWithinNorthernHemisphere,
354 stConvertCoord.dEasting,
355 stConvertCoord.dNorthing,
356 stConvertCoord.dMeridianConvergence,
357 stConvertCoord.dScale);
359 catch (
const GeographicLib::GeographicErr::exception& geError)
362 LOG_ERROR(logging::g_qSharedLogger,
"Unable to forward solve a GPSCoordinate to UTMCoordinate. GeographicLib error is: {}", geError.what());
366 return stConvertCoord;
384 stConvertCoord.d2DAccuracy = stUTMCoord.d2DAccuracy;
385 stConvertCoord.d3DAccuracy = stUTMCoord.d3DAccuracy;
386 stConvertCoord.dAltitude = stUTMCoord.dAltitude;
387 stConvertCoord.eCoordinateAccuracyFixType = stUTMCoord.eCoordinateAccuracyFixType;
388 stConvertCoord.bIsDifferential = stUTMCoord.bIsDifferential;
389 stConvertCoord.tmTimestamp = stUTMCoord.tmTimestamp;
395 GeographicLib::UTMUPS::Reverse(stUTMCoord.nZone,
396 stUTMCoord.bWithinNorthernHemisphere,
397 std::fabs(stUTMCoord.dEasting),
398 stUTMCoord.dNorthing,
399 stConvertCoord.dLatitude,
400 stConvertCoord.dLongitude,
401 stConvertCoord.dMeridianConvergence,
402 stConvertCoord.dScale);
404 catch (
const GeographicLib::GeographicErr::exception& geError)
407 LOG_ERROR(logging::g_qSharedLogger,
"Unable to reverse solve a UTMCoordinate to GPSCoordinate. GeographicLib error is: {}", geError.what());
411 return stConvertCoord;
451 const WaypointType& eType = WaypointType::eUNKNOWN,
452 const double dRadius = 0.0,
456 this->stGPSLocation = stGPSLocation;
459 this->dRadius = dRadius;
481 this->stUTMLocation = stUTMLocation;
484 this->dRadius = dRadius;
523 return (stGPSLocation == stOtherWaypoint.stGPSLocation && stUTMLocation == stOtherWaypoint.stUTMLocation && eType == stOtherWaypoint.eType &&
524 dRadius == stOtherWaypoint.dRadius && nID == stOtherWaypoint.nID);
560 GeographicLib::Geodesic geGeodesic = GeographicLib::Geodesic::WGS84();
563 stMeasurements.dArcLengthDegrees = geGeodesic.Inverse(stCoord1.dLatitude,
567 stMeasurements.dDistanceMeters,
568 stMeasurements.dStartRelativeBearing,
569 stMeasurements.dEndRelativeBearing);
574 stMeasurements.dStartRelativeBearing = std::fmod((stMeasurements.dStartRelativeBearing + 360), 360);
575 stMeasurements.dEndRelativeBearing = std::fmod((stMeasurements.dEndRelativeBearing + 180), 360);
577 if (stMeasurements.dStartRelativeBearing < 0)
580 stMeasurements.dStartRelativeBearing += 360;
583 if (stMeasurements.dEndRelativeBearing < 0)
586 stMeasurements.dEndRelativeBearing += 360;
590 return stMeasurements;
613 GeographicLib::Geodesic geGeodesic = GeographicLib::Geodesic::WGS84();
620 stMeasurements.dArcLengthDegrees = geGeodesic.Inverse(stGPSCoord1.dLatitude,
621 stGPSCoord1.dLongitude,
622 stGPSCoord2.dLatitude,
623 stGPSCoord2.dLongitude,
624 stMeasurements.dDistanceMeters,
625 stMeasurements.dStartRelativeBearing,
626 stMeasurements.dEndRelativeBearing);
631 stMeasurements.dStartRelativeBearing = std::fmod((stMeasurements.dStartRelativeBearing + 360), 360);
632 stMeasurements.dEndRelativeBearing = std::fmod((stMeasurements.dEndRelativeBearing + 180), 360);
634 if (stMeasurements.dStartRelativeBearing < 0)
637 stMeasurements.dStartRelativeBearing += 360;
640 if (stMeasurements.dEndRelativeBearing < 0)
643 stMeasurements.dEndRelativeBearing += 360;
647 return stMeasurements;
667 GeographicLib::Geodesic geGeodesic = GeographicLib::Geodesic::WGS84();
670 stMeasurements.dArcLengthDegrees = geGeodesic.Inverse(stWaypoint1.
GetGPSCoordinate().dLatitude,
674 stMeasurements.dDistanceMeters,
675 stMeasurements.dStartRelativeBearing,
676 stMeasurements.dEndRelativeBearing);
681 stMeasurements.dStartRelativeBearing = std::fmod((stMeasurements.dStartRelativeBearing + 360), 360);
682 stMeasurements.dEndRelativeBearing = std::fmod((stMeasurements.dEndRelativeBearing + 180), 360);
684 if (stMeasurements.dStartRelativeBearing < 0)
687 stMeasurements.dStartRelativeBearing += 360;
690 if (stMeasurements.dEndRelativeBearing < 0)
693 stMeasurements.dEndRelativeBearing += 360;
697 return stMeasurements;
712 double dRoverHeading;
727 this->stRoverPosition =
Waypoint(stRoverPosition);
728 this->dRoverHeading = dRoverHeading;
743 this->stRoverPosition =
Waypoint(stRoverPosition);
744 this->dRoverHeading = dRoverHeading;
803 dRoverHeading == stOtherRoverPose.dRoverHeading);
Namespace containing functions related to operations on global position number systems and other data...
Definition GeospatialOperations.hpp:33
GPSCoordinate ConvertUTMToGPS(const UTMCoordinate &stUTMCoord)
Given a UTM coordinate, convert to GPS and create a new GPSCoordinate object.
Definition GeospatialOperations.hpp:378
UTMCoordinate ConvertGPSToUTM(const GPSCoordinate &stGPSCoord)
Given a GPS coordinate, convert to UTM and create a new UTMCoordinate object.
Definition GeospatialOperations.hpp:333
GeoMeasurement CalculateGeoMeasurement(const GPSCoordinate &stCoord1, const GPSCoordinate &stCoord2)
The shortest path between two points on an ellipsoid at (lat1, lon1) and (lat2, lon2) is called the g...
Definition GeospatialOperations.hpp:553
This struct stores/contains information about a GPS data.
Definition GeospatialOperations.hpp:100
GPSCoordinate(double dLatitude=0.0, double dLongitude=0.0, double dAltitude=0.0, double d2DAccuracy=-1.0, double d3DAccuracy=-1.0, double dMeridianConvergence=-1.0, double dScale=0.0, PositionFixType eCoordinateAccuracyFixType=PositionFixType::eUNKNOWN, bool bIsDifferential=false, std::chrono::system_clock::time_point tmTimestamp=std::chrono::system_clock::time_point().min())
Construct a new GPSCoordinate object.
Definition GeospatialOperations.hpp:133
bool operator!=(const GPSCoordinate &stOtherCoordinate) const
Overridden operator not equals for GPSCoordinate struct.
Definition GeospatialOperations.hpp:185
bool operator==(const GPSCoordinate &stOtherCoordinate) const
Overridden operator equals for GPSCoordinate struct.
Definition GeospatialOperations.hpp:167
std::string ToString() const
Converts the GPSCoordinate to a string representation.
Definition GeospatialOperations.hpp:195
This struct is used to store the distance, arc length, and relative bearing for a calculated geodesic...
Definition GeospatialOperations.hpp:83
This struct is used by the WaypointHandler to provide an easy way to store all pose data about the ro...
Definition GeospatialOperations.hpp:708
RoverPose(const geoops::GPSCoordinate &stRoverPosition=geoops::GPSCoordinate(), const double dRoverHeading=0.0)
Construct a new Rover Pose object.
Definition GeospatialOperations.hpp:724
bool operator==(const RoverPose &stOtherRoverPose) const
Overridden operator equals for RoverPose struct.
Definition GeospatialOperations.hpp:799
const geoops::GPSCoordinate & GetGPSCoordinate() const
Accessor for the geoops::GPSCoordinate member variable.
Definition GeospatialOperations.hpp:756
bool operator!=(const RoverPose &stOtherRoverPose) const
Overridden operator equals for RoverPose struct.
Definition GeospatialOperations.hpp:816
double GetCompassHeading() const
Accessor for the Compass Heading private member.
Definition GeospatialOperations.hpp:787
const geoops::UTMCoordinate & GetUTMCoordinate() const
Accessor for the geoops::UTMCoordinate member variable.
Definition GeospatialOperations.hpp:767
RoverPose(const geoops::UTMCoordinate &stRoverPosition, const double dRoverHeading=0.0)
Construct a new Rover Pose object.
Definition GeospatialOperations.hpp:740
const geoops::Waypoint & GetWaypoint() const
Accessor for the Waypoint private member.
Definition GeospatialOperations.hpp:777
This struct stores/contains information about a UTM coordinate.
Definition GeospatialOperations.hpp:211
UTMCoordinate(double dEasting=0.0, double dNorthing=0.0, int nZone=0, bool bWithinNorthernHemisphere=true, double dAltitude=0.0, double d2DAccuracy=-1.0, double d3DAccuracy=-1.0, double dMeridianConvergence=-1.0, double dScale=0.0, PositionFixType eCoordinateAccuracyFixType=PositionFixType::eUNKNOWN, bool bIsDifferential=false, std::chrono::system_clock::time_point tmTimestamp=std::chrono::system_clock::time_point().min())
Construct a new UTMCoordinate object.
Definition GeospatialOperations.hpp:249
bool operator==(const UTMCoordinate &stOtherCoordinate) const
Overridden operator equals for UTMCoordinate struct.
Definition GeospatialOperations.hpp:287
bool operator!=(const UTMCoordinate &stOtherCoordinate) const
Overridden operator not equals for UTMCoordinate struct.
Definition GeospatialOperations.hpp:306
std::string ToString() const
Converts the UTMCoordinate to a string representation.
Definition GeospatialOperations.hpp:316
This struct is used by the WaypointHandler class to store location, size, and type information about ...
Definition GeospatialOperations.hpp:423
const geoops::GPSCoordinate & GetGPSCoordinate() const
Accessor for the geoops::GPSCoordinate member variable.
Definition GeospatialOperations.hpp:497
bool operator==(const Waypoint &stOtherWaypoint) const
Overridden operator equals for Waypoint struct.
Definition GeospatialOperations.hpp:520
Waypoint(const geoops::GPSCoordinate &stGPSLocation=geoops::GPSCoordinate(), const WaypointType &eType=WaypointType::eUNKNOWN, const double dRadius=0.0, const int nID=-1)
Construct a new Waypoint object.
Definition GeospatialOperations.hpp:450
bool operator!=(const Waypoint &stOtherWaypoint) const
Overridden operator equals for Waypoint struct.
Definition GeospatialOperations.hpp:537
Waypoint(const geoops::UTMCoordinate &stUTMLocation, const WaypointType &eType=WaypointType::eUNKNOWN, const double dRadius=0.0, const int nID=-1)
Construct a new Waypoint object.
Definition GeospatialOperations.hpp:478
const geoops::UTMCoordinate & GetUTMCoordinate() const
Accessor for the geoops::UTMCoordinate member variable.
Definition GeospatialOperations.hpp:508