35#include <GeographicLib/UTMUPS.hpp>
37namespace etsi_its_mapem_ts_msgs {
50 throwIfOutOfRange(moy_value, MinuteOfTheYear::MIN, MinuteOfTheYear::MAX,
"MinuteOfTheYear");
51 moy.value = moy_value;
71 mapem.map.time_stamp_is_present =
true;
80 inline void setIntersectionID(IntersectionID& intsct_id,
const uint16_t id_value) {
82 intsct_id.value = id_value;
91 inline void setIntersectionID(IntersectionGeometry& intsct,
const uint16_t id_value) {
102 int64_t angle_in_10_micro_degree = (int64_t)std::round(deg*1e7);
103 throwIfOutOfRange(angle_in_10_micro_degree, Latitude::MIN, Latitude::MAX,
"Latitude");
104 latitude.value = angle_in_10_micro_degree;
113 inline void setLongitude(Longitude& longitude,
const double deg) {
114 int64_t angle_in_10_micro_degree = (int64_t)std::round(deg*1e7);
115 throwIfOutOfRange(angle_in_10_micro_degree, Longitude::MIN, Longitude::MAX,
"Longitude");
116 longitude.value = angle_in_10_micro_degree;
125 inline void setElevation(Elevation& elevation,
const double value) {
126 int64_t alt_in_dm = (int64_t)std::round(value*1e1);
127 if(alt_in_dm>=Elevation::MIN && alt_in_dm<=Elevation::MAX) elevation.value = alt_in_dm;
128 else if(alt_in_dm<Elevation::MIN) elevation.value = Elevation::MIN;
129 else if(alt_in_dm>Elevation::MAX) elevation.value = Elevation::MAX;
139 inline void setPosition3D(Position3D& pos,
const double latitude,
const double longitude) {
142 pos.elevation_is_present =
false;
153 inline void setPosition3D(Position3D& pos,
const double latitude,
const double longitude,
const double altitude) {
156 pos.elevation_is_present =
true;
167 inline void setPosition3D(IntersectionGeometry& intsct,
double latitude,
double longitude,
double altitude) {
168 setPosition3D(intsct.ref_point, latitude, longitude, altitude);
183 inline void setPosition3DFromUTMPosition(Position3D& reference_position,
const gm::PointStamped& utm_position,
const int zone,
const bool northp) {
184 std::string required_frame_prefix =
"utm_";
185 if(utm_position.header.frame_id.rfind(required_frame_prefix, 0) != 0)
187 throw std::invalid_argument(
"Frame-ID of UTM Position '"+utm_position.header.frame_id+
"' does not start with required prefix '"+required_frame_prefix+
"'!");
189 double latitude, longitude;
191 GeographicLib::UTMUPS::Reverse(zone, northp, utm_position.point.x, utm_position.point.y, latitude, longitude);
192 }
catch (GeographicLib::GeographicErr& e) {
193 throw std::invalid_argument(e.what());
195 setPosition3D(reference_position, latitude, longitude, utm_position.point.z);
Sanity-check functions etc.
void throwIfOutOfRange(const T1 &val, const T2 &min, const T2 &max, const std::string val_desc)
Throws an exception if a given value is out of a defined range.
void setPosition3D(Position3D &pos, const double latitude, const double longitude)
Set the Position3D object.
void setPosition3DFromUTMPosition(Position3D &reference_position, const gm::PointStamped &utm_position, const int zone, const bool northp)
Set the Position3D from a given UTM-Position.
void setMinuteOfTheYear(MinuteOfTheYear &moy, const uint32_t moy_value)
Set the MinuteOfTheYear object.
void setElevation(Elevation &elevation, const double value)
Set the Elevation object.
void setLatitude(Latitude &latitude, const double deg)
Set the Latitude object.
void setIntersectionID(IntersectionID &intsct_id, const uint16_t id_value)
Set the IntersectionID value.
void setLongitude(Longitude &longitude, const double deg)
Set the Longitude object.