Set the Position3D from a given UTM-Position.
The position is transformed to latitude and longitude by using GeographicLib::UTMUPS The z-Coordinate is directly used as altitude value The frame_id of the given utm_position must be set to 'utm_<zone><N/S>'
240 {
241
242namespace access {
243
245
253 throwIfOutOfRange(moy_value, MinuteOfTheYear::MIN, MinuteOfTheYear::MAX,
"MinuteOfTheYear");
254 moy.value = moy_value;
255 }
256
263 inline void setMinuteOfTheYear(MapData& map, const uint32_t moy_value) {
264 setMinuteOfTheYear(map.time_stamp, moy_value);
265 }
266
272 inline void setMinuteOfTheYear(MAPEM& mapem, const uint32_t moy_value) {
273 setMinuteOfTheYear(mapem.map, moy_value);
274 mapem.map.time_stamp_is_present = true;
275 }
276
283 inline void setIntersectionID(IntersectionID& intsct_id,
const uint16_t id_value) {
284 throwIfOutOfRange(id_value, IntersectionID::MIN, IntersectionID::MAX,
"IntersectionID");
285 intsct_id.value = id_value;
286 }
287
294 inline void setIntersectionID(IntersectionGeometry& intsct,
const uint16_t id_value) {
296 }
297
304 inline void setLatitude(Latitude& latitude,
const double deg) {
305 int64_t angle_in_10_micro_degree = (int64_t)std::round(deg*1e7);
306 throwIfOutOfRange(angle_in_10_micro_degree, Latitude::MIN, Latitude::MAX,
"Latitude");
307 latitude.value = angle_in_10_micro_degree;
308 }
309
316 inline void setLongitude(Longitude& longitude,
const double deg) {
317 int64_t angle_in_10_micro_degree = (int64_t)std::round(deg*1e7);
318 throwIfOutOfRange(angle_in_10_micro_degree, Longitude::MIN, Longitude::MAX,
"Longitude");
319 longitude.value = angle_in_10_micro_degree;
320 }
321
328 inline void setElevation(Elevation& elevation,
const double value) {
329 int64_t alt_in_dm = (int64_t)std::round(value*1e1);
330 if(alt_in_dm>=Elevation::MIN && alt_in_dm<=Elevation::MAX) elevation.value = alt_in_dm;
331 else if(alt_in_dm<Elevation::MIN) elevation.value = Elevation::MIN;
332 else if(alt_in_dm>Elevation::MAX) elevation.value = Elevation::MAX;
333 }
334
342 inline void setPosition3D(Position3D& pos,
const double latitude,
const double longitude) {
345 pos.elevation_is_present = false;
346 }
347
356 inline void setPosition3D(Position3D& pos,
const double latitude,
const double longitude,
const double altitude) {
359 pos.elevation_is_present = true;
360 }
361
370 inline void setPosition3D(IntersectionGeometry& intsct,
double latitude,
double longitude,
double altitude) {
371 setPosition3D(intsct.ref_point, latitude, longitude, altitude);
372 }
373
386 inline void setPosition3DFromUTMPosition(Position3D& reference_position,
const gm::PointStamped& utm_position,
const int zone,
const bool northp) {
387 std::string required_frame_prefix = "utm_";
388 if(utm_position.header.frame_id.rfind(required_frame_prefix, 0) != 0)
389 {
390 throw std::invalid_argument("Frame-ID of UTM Position '"+utm_position.header.frame_id+"' does not start with required prefix '"+required_frame_prefix+"'!");
391 }
392 double latitude, longitude;
393 try {
394 GeographicLib::UTMUPS::Reverse(zone, northp, utm_position.point.x, utm_position.point.y, latitude, longitude);
395 } catch (GeographicLib::GeographicErr& e) {
396 throw std::invalid_argument(e.what());
397 }
398 setPosition3D(reference_position, latitude, longitude, utm_position.point.z);
399 }
400
401}
402
403}
void setLongitude(Longitude &longitude, const double deg)
Set the Longitude object.
void setLatitude(Latitude &latitude, const double deg)
Set the Latitude object.
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.