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
51 enum class PositionFixType
57 eGNSSDeadReckoningCombined,
85 double dDistanceMeters;
86 double dArcLengthDegrees;
87 double dStartRelativeBearing;
88 double dEndRelativeBearing;
107 double dMeridianConvergence;
109 PositionFixType eCoordinateAccuracyFixType;
110 bool bIsDifferential;
111 std::chrono::system_clock::time_point tmTimestamp;
133 double dLongitude = 0.0,
134 double dAltitude = 0.0,
135 double d2DAccuracy = -1.0,
136 double d3DAccuracy = -1.0,
137 double dMeridianConvergence = -1.0,
139 PositionFixType eCoordinateAccuracyFixType = PositionFixType::eUNKNOWN,
140 bool bIsDifferential =
false,
141 std::chrono::system_clock::time_point tmTimestamp = std::chrono::system_clock::time_point().
min())
144 this->dLatitude = dLatitude;
145 this->dLongitude = dLongitude;
146 this->dAltitude = dAltitude;
147 this->d2DAccuracy = d2DAccuracy;
148 this->d3DAccuracy = d3DAccuracy;
149 this->dMeridianConvergence = dMeridianConvergence;
150 this->dScale = dScale;
151 this->eCoordinateAccuracyFixType = eCoordinateAccuracyFixType;
152 this->bIsDifferential = bIsDifferential;
153 this->tmTimestamp = tmTimestamp;
169 return (dLatitude == stOtherCoordinate.dLatitude && dLongitude == stOtherCoordinate.dLongitude && dAltitude == stOtherCoordinate.dAltitude &&
170 d2DAccuracy == stOtherCoordinate.d2DAccuracy && d3DAccuracy == stOtherCoordinate.d3DAccuracy &&
171 eCoordinateAccuracyFixType == stOtherCoordinate.eCoordinateAccuracyFixType && bIsDifferential == stOtherCoordinate.bIsDifferential);
196 std::ostringstream oss;
197 oss <<
"Latitude: " << dLatitude <<
", Longitude: " << dLongitude <<
", Altitude: " << dAltitude;
216 bool bWithinNorthernHemisphere;
220 double dMeridianConvergence;
222 PositionFixType eCoordinateAccuracyFixType;
223 bool bIsDifferential;
224 std::chrono::system_clock::time_point tmTimestamp;
249 double dNorthing = 0.0,
251 bool bWithinNorthernHemisphere =
true,
252 double dAltitude = 0.0,
253 double d2DAccuracy = -1.0,
254 double d3DAccuracy = -1.0,
255 double dMeridianConvergence = -1.0,
257 PositionFixType eCoordinateAccuracyFixType = PositionFixType::eUNKNOWN,
258 bool bIsDifferential =
false,
259 std::chrono::system_clock::time_point tmTimestamp = std::chrono::system_clock::time_point().
min())
262 this->dEasting = dEasting;
263 this->dNorthing = dNorthing;
265 this->bWithinNorthernHemisphere = bWithinNorthernHemisphere;
266 this->dAltitude = dAltitude;
267 this->d2DAccuracy = d2DAccuracy;
268 this->d3DAccuracy = d3DAccuracy;
269 this->dMeridianConvergence = dMeridianConvergence;
270 this->dScale = dScale;
271 this->eCoordinateAccuracyFixType = eCoordinateAccuracyFixType;
272 this->bIsDifferential = bIsDifferential;
273 this->tmTimestamp = tmTimestamp;
289 return (dEasting == stOtherCoordinate.dEasting && dNorthing == stOtherCoordinate.dNorthing && nZone == stOtherCoordinate.nZone &&
290 bWithinNorthernHemisphere == stOtherCoordinate.bWithinNorthernHemisphere && dAltitude == stOtherCoordinate.dAltitude &&
291 d2DAccuracy == stOtherCoordinate.d2DAccuracy && d3DAccuracy == stOtherCoordinate.d3DAccuracy &&
292 eCoordinateAccuracyFixType == stOtherCoordinate.eCoordinateAccuracyFixType && bIsDifferential == stOtherCoordinate.bIsDifferential);
317 std::ostringstream oss;
318 oss <<
"Easting: " << dEasting <<
", Northing: " << dNorthing <<
", Altitude: " << dAltitude;
338 stConvertCoord.d2DAccuracy = stGPSCoord.d2DAccuracy;
339 stConvertCoord.d3DAccuracy = stGPSCoord.d3DAccuracy;
340 stConvertCoord.dAltitude = stGPSCoord.dAltitude;
341 stConvertCoord.eCoordinateAccuracyFixType = stGPSCoord.eCoordinateAccuracyFixType;
342 stConvertCoord.bIsDifferential = stGPSCoord.bIsDifferential;
343 stConvertCoord.tmTimestamp = stGPSCoord.tmTimestamp;
349 GeographicLib::UTMUPS::Forward(stGPSCoord.dLatitude,
350 stGPSCoord.dLongitude,
351 stConvertCoord.nZone,
352 stConvertCoord.bWithinNorthernHemisphere,
353 stConvertCoord.dEasting,
354 stConvertCoord.dNorthing,
355 stConvertCoord.dMeridianConvergence,
356 stConvertCoord.dScale);
358 catch (
const GeographicLib::GeographicErr::exception& geError)
361 LOG_ERROR(logging::g_qSharedLogger,
"Unable to forward solve a GPSCoordinate to UTMCoordinate. GeographicLib error is: {}", geError.what());
365 return stConvertCoord;
383 stConvertCoord.d2DAccuracy = stUTMCoord.d2DAccuracy;
384 stConvertCoord.d3DAccuracy = stUTMCoord.d3DAccuracy;
385 stConvertCoord.dAltitude = stUTMCoord.dAltitude;
386 stConvertCoord.eCoordinateAccuracyFixType = stUTMCoord.eCoordinateAccuracyFixType;
387 stConvertCoord.bIsDifferential = stUTMCoord.bIsDifferential;
388 stConvertCoord.tmTimestamp = stUTMCoord.tmTimestamp;
394 GeographicLib::UTMUPS::Reverse(stUTMCoord.nZone,
395 stUTMCoord.bWithinNorthernHemisphere,
396 std::fabs(stUTMCoord.dEasting),
397 stUTMCoord.dNorthing,
398 stConvertCoord.dLatitude,
399 stConvertCoord.dLongitude,
400 stConvertCoord.dMeridianConvergence,
401 stConvertCoord.dScale);
403 catch (
const GeographicLib::GeographicErr::exception& geError)
406 LOG_ERROR(logging::g_qSharedLogger,
"Unable to reverse solve a UTMCoordinate to GPSCoordinate. GeographicLib error is: {}", geError.what());
410 return stConvertCoord;
450 const WaypointType& eType = WaypointType::eUNKNOWN,
451 const double dRadius = 0.0,
455 this->stGPSLocation = stGPSLocation;
458 this->dRadius = dRadius;
480 this->stUTMLocation = stUTMLocation;
483 this->dRadius = dRadius;
522 return (stGPSLocation == stOtherWaypoint.stGPSLocation && stUTMLocation == stOtherWaypoint.stUTMLocation && eType == stOtherWaypoint.eType &&
523 dRadius == stOtherWaypoint.dRadius && nID == stOtherWaypoint.nID);
559 GeographicLib::Geodesic geGeodesic = GeographicLib::Geodesic::WGS84();
562 stMeasurements.dArcLengthDegrees = geGeodesic.Inverse(stCoord1.dLatitude,
566 stMeasurements.dDistanceMeters,
567 stMeasurements.dStartRelativeBearing,
568 stMeasurements.dEndRelativeBearing);
573 stMeasurements.dStartRelativeBearing = std::fmod((stMeasurements.dStartRelativeBearing + 360), 360);
574 stMeasurements.dEndRelativeBearing = std::fmod((stMeasurements.dEndRelativeBearing + 180), 360);
576 if (stMeasurements.dStartRelativeBearing < 0)
579 stMeasurements.dStartRelativeBearing += 360;
582 if (stMeasurements.dEndRelativeBearing < 0)
585 stMeasurements.dEndRelativeBearing += 360;
589 return stMeasurements;
612 GeographicLib::Geodesic geGeodesic = GeographicLib::Geodesic::WGS84();
619 stMeasurements.dArcLengthDegrees = geGeodesic.Inverse(stGPSCoord1.dLatitude,
620 stGPSCoord1.dLongitude,
621 stGPSCoord2.dLatitude,
622 stGPSCoord2.dLongitude,
623 stMeasurements.dDistanceMeters,
624 stMeasurements.dStartRelativeBearing,
625 stMeasurements.dEndRelativeBearing);
630 stMeasurements.dStartRelativeBearing = std::fmod((stMeasurements.dStartRelativeBearing + 360), 360);
631 stMeasurements.dEndRelativeBearing = std::fmod((stMeasurements.dEndRelativeBearing + 180), 360);
633 if (stMeasurements.dStartRelativeBearing < 0)
636 stMeasurements.dStartRelativeBearing += 360;
639 if (stMeasurements.dEndRelativeBearing < 0)
642 stMeasurements.dEndRelativeBearing += 360;
646 return stMeasurements;
666 GeographicLib::Geodesic geGeodesic = GeographicLib::Geodesic::WGS84();
669 stMeasurements.dArcLengthDegrees = geGeodesic.Inverse(stWaypoint1.
GetGPSCoordinate().dLatitude,
673 stMeasurements.dDistanceMeters,
674 stMeasurements.dStartRelativeBearing,
675 stMeasurements.dEndRelativeBearing);
680 stMeasurements.dStartRelativeBearing = std::fmod((stMeasurements.dStartRelativeBearing + 360), 360);
681 stMeasurements.dEndRelativeBearing = std::fmod((stMeasurements.dEndRelativeBearing + 180), 360);
683 if (stMeasurements.dStartRelativeBearing < 0)
686 stMeasurements.dStartRelativeBearing += 360;
689 if (stMeasurements.dEndRelativeBearing < 0)
692 stMeasurements.dEndRelativeBearing += 360;
696 return stMeasurements;
711 double dRoverHeading;
726 this->stRoverPosition =
Waypoint(stRoverPosition);
727 this->dRoverHeading = dRoverHeading;
742 this->stRoverPosition =
Waypoint(stRoverPosition);
743 this->dRoverHeading = dRoverHeading;
802 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:377
UTMCoordinate ConvertGPSToUTM(const GPSCoordinate &stGPSCoord)
Given a GPS coordinate, convert to UTM and create a new UTMCoordinate object.
Definition GeospatialOperations.hpp:332
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:552
This struct stores/contains information about a GPS data.
Definition GeospatialOperations.hpp:99
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:132
bool operator!=(const GPSCoordinate &stOtherCoordinate) const
Overridden operator not equals for GPSCoordinate struct.
Definition GeospatialOperations.hpp:184
bool operator==(const GPSCoordinate &stOtherCoordinate) const
Overridden operator equals for GPSCoordinate struct.
Definition GeospatialOperations.hpp:166
std::string ToString() const
Converts the GPSCoordinate to a string representation.
Definition GeospatialOperations.hpp:194
This struct is used to store the distance, arc length, and relative bearing for a calculated geodesic...
Definition GeospatialOperations.hpp:82
This struct is used by the WaypointHandler to provide an easy way to store all pose data about the ro...
Definition GeospatialOperations.hpp:707
RoverPose(const geoops::GPSCoordinate &stRoverPosition=geoops::GPSCoordinate(), const double dRoverHeading=0.0)
Construct a new Rover Pose object.
Definition GeospatialOperations.hpp:723
bool operator==(const RoverPose &stOtherRoverPose) const
Overridden operator equals for RoverPose struct.
Definition GeospatialOperations.hpp:798
const geoops::GPSCoordinate & GetGPSCoordinate() const
Accessor for the geoops::GPSCoordinate member variable.
Definition GeospatialOperations.hpp:755
bool operator!=(const RoverPose &stOtherRoverPose) const
Overridden operator equals for RoverPose struct.
Definition GeospatialOperations.hpp:815
double GetCompassHeading() const
Accessor for the Compass Heading private member.
Definition GeospatialOperations.hpp:786
const geoops::UTMCoordinate & GetUTMCoordinate() const
Accessor for the geoops::UTMCoordinate member variable.
Definition GeospatialOperations.hpp:766
RoverPose(const geoops::UTMCoordinate &stRoverPosition, const double dRoverHeading=0.0)
Construct a new Rover Pose object.
Definition GeospatialOperations.hpp:739
const geoops::Waypoint & GetWaypoint() const
Accessor for the Waypoint private member.
Definition GeospatialOperations.hpp:776
This struct stores/contains information about a UTM coordinate.
Definition GeospatialOperations.hpp:210
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:248
bool operator==(const UTMCoordinate &stOtherCoordinate) const
Overridden operator equals for UTMCoordinate struct.
Definition GeospatialOperations.hpp:286
bool operator!=(const UTMCoordinate &stOtherCoordinate) const
Overridden operator not equals for UTMCoordinate struct.
Definition GeospatialOperations.hpp:305
std::string ToString() const
Converts the UTMCoordinate to a string representation.
Definition GeospatialOperations.hpp:315
This struct is used by the WaypointHandler class to store location, size, and type information about ...
Definition GeospatialOperations.hpp:422
const geoops::GPSCoordinate & GetGPSCoordinate() const
Accessor for the geoops::GPSCoordinate member variable.
Definition GeospatialOperations.hpp:496
bool operator==(const Waypoint &stOtherWaypoint) const
Overridden operator equals for Waypoint struct.
Definition GeospatialOperations.hpp:519
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:449
bool operator!=(const Waypoint &stOtherWaypoint) const
Overridden operator equals for Waypoint struct.
Definition GeospatialOperations.hpp:536
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:477
const geoops::UTMCoordinate & GetUTMCoordinate() const
Accessor for the geoops::UTMCoordinate member variable.
Definition GeospatialOperations.hpp:507