12#include <GeographicLib/UTMUPS.hpp>
14namespace etsi_its_mapem_ts_msgs {
27 throwIfOutOfRange(moy_value, MinuteOfTheYear::MIN, MinuteOfTheYear::MAX,
"MinuteOfTheYear");
28 moy.value = moy_value;
48 mapem.map.time_stamp_is_present =
true;
58 throwIfOutOfRange(id_value, IntersectionID::MIN, IntersectionID::MAX,
"IntersectionID");
59 intsct_id.value = id_value;
78 inline void setLatitude(Latitude& latitude,
const double deg) {
79 int64_t angle_in_10_micro_degree = (int64_t)std::round(deg*1e7);
80 throwIfOutOfRange(angle_in_10_micro_degree, Latitude::MIN, Latitude::MAX,
"Latitude");
81 latitude.value = angle_in_10_micro_degree;
91 int64_t angle_in_10_micro_degree = (int64_t)std::round(deg*1e7);
92 throwIfOutOfRange(angle_in_10_micro_degree, Longitude::MIN, Longitude::MAX,
"Longitude");
93 longitude.value = angle_in_10_micro_degree;
103 int64_t alt_in_dm = (int64_t)std::round(value*1e1);
104 if(alt_in_dm>=Elevation::MIN && alt_in_dm<=Elevation::MAX) elevation.value = alt_in_dm;
105 else if(alt_in_dm<Elevation::MIN) elevation.value = Elevation::MIN;
106 else if(alt_in_dm>Elevation::MAX) elevation.value = Elevation::MAX;
116 inline void setPosition3D(Position3D& pos,
const double latitude,
const double longitude) {
119 pos.elevation_is_present =
false;
130 inline void setPosition3D(Position3D& pos,
const double latitude,
const double longitude,
const double altitude) {
133 pos.elevation_is_present =
true;
144 inline void setPosition3D(IntersectionGeometry& intsct,
double latitude,
double longitude,
double altitude) {
145 setPosition3D(intsct.ref_point, latitude, longitude, altitude);
161 std::string required_frame_prefix =
"utm_";
162 if(utm_position.header.frame_id.rfind(required_frame_prefix, 0) != 0)
164 throw std::invalid_argument(
"Frame-ID of UTM Position '"+utm_position.header.frame_id+
"' does not start with required prefix '"+required_frame_prefix+
"'!");
166 double latitude, longitude;
168 GeographicLib::UTMUPS::Reverse(zone, northp, utm_position.point.x, utm_position.point.y, latitude, longitude);
169 }
catch (GeographicLib::GeographicErr& e) {
170 throw std::invalid_argument(e.what());
172 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.