ad_map_access
CoordinateTransform.hpp
Go to the documentation of this file.
1 // ----------------- BEGIN LICENSE BLOCK ---------------------------------
2 //
3 // Copyright (C) 2018-2021 Intel Corporation
4 //
5 // SPDX-License-Identifier: MIT
6 //
7 // ----------------- END LICENSE BLOCK -----------------------------------
12 #pragma once
13 
14 #define ACCEPT_USE_OF_DEPRECATED_PROJ_API_H
15 #include <memory>
16 #include <proj_api.h>
17 #include <vector>
18 #include "ad/map/point/Types.hpp"
19 
21 namespace ad {
23 namespace map {
25 namespace point {
26 
31 {
32 public:
33  typedef std::shared_ptr<CoordinateTransform> Ptr;
34  typedef std::shared_ptr<CoordinateTransform const> ConstPtr;
35 
36 public: // Constructor/Destructor
41 
46 
47 public: // Basic Conversions
48 public: // ENU Reference Point Managment
55  bool setGeoProjection(std::string const &geo_projection);
56 
62  void setENUReferencePoint(const GeoPoint &enu_ref_point);
63 
67  const GeoPoint &getENUReferencePoint() const;
68 
72  bool isENUValid() const;
73 
78  size_t getENURef() const;
79 
80 public: // ENU/Geo Conversions
87  ENUPoint Geo2ENU(const GeoPoint &pt) const;
88 
95  GeoPoint ENU2Geo(const ENUPoint &pt) const;
96 
97 public: // ECEF/Geo Conversions
107  ECEFPoint Geo2ECEF(const GeoPoint &pt) const;
108 
118  GeoPoint ECEF2Geo(const ECEFPoint &pt) const;
119 
120 public: // ECEF/ENU Conversions
127  ECEFPoint ENU2ECEF(const ENUPoint &pt) const;
128 
135  ENUPoint ECEF2ENU(const ECEFPoint &pt) const;
136 
137 public: // Useful methods
144  static physics::Distance WGS84_R(const Latitude &lat);
145 
152  static double geocentricLatitude(const Latitude &lat);
153 
154 public: // Conversions
162  void convert(const GeoPoint &x, ENUPoint &y) const
163  {
164  y = Geo2ENU(x);
165  }
166 
174  void convert(const ENUPoint &x, GeoPoint &y) const
175  {
176  y = ENU2Geo(x);
177  }
178 
186  void convert(const GeoPoint &x, ECEFPoint &y) const
187  {
188  y = Geo2ECEF(x);
189  }
190 
198  void convert(const ECEFPoint &x, GeoPoint &y) const
199  {
200  y = ECEF2Geo(x);
201  }
202 
210  void convert(const ECEFPoint &x, ENUPoint &y) const
211  {
212  y = ECEF2ENU(x);
213  }
214 
222  void convert(const ENUPoint &x, ECEFPoint &y) const
223  {
224  y = ENU2ECEF(x);
225  }
226 
234  template <typename SourceC, typename TargetC>
235  void convert(const std::vector<SourceC> &xs, std::vector<TargetC> &ys) const
236  {
237  ys.clear();
238  ys.reserve(xs.size());
239  for (auto x : xs)
240  {
241  TargetC y;
242  convert(x, y);
243  ys.push_back(y);
244  }
245  }
246 
247 private: // ENU Conversion parameters
248  size_t enu_ref_;
249  GeoPoint enu_ref_point_;
250  ECEFPoint ecef_ref_point_;
251  double enu_phi_;
252  double enu_lam_;
253  double enu_h_;
254  double enu_tmp1_;
255  double enu_tmp1_3_;
256  double enu_cp_;
257  double enu_sp_;
258  double enu_cp_2_;
259  double enu_sp_2_;
260  double ecef_enu_[9];
261 
262  projPJ projPtr_;
263 
266  bool isGeoProjectionValid() const;
267 
268 private: // Constants
269  static constexpr double PI = 3.141592654;
270  static constexpr double A = 6378137.0;
271  static constexpr double B = 6356752.3;
272  static constexpr double E2 = 6.6943799901377997e-3;
273  static constexpr double A1 = A * E2;
274  static constexpr double A2 = A1 * A1;
275  static constexpr double A3 = A1 * E2 * 0.5;
276  static constexpr double A4 = 2.5 * A2;
277  static constexpr double A5 = A1 + A3;
278  static constexpr double A6 = 9.9330562000986220e-1;
279 
280 private: // Static Data
281  static size_t instance_counter_;
282 };
284 
285 } // namespace point
286 } // namespace map
287 } // namespace ad
ad
namespace ad
Definition: GeometryStoreItem.hpp:28
ad::map::point::CoordinateTransform::getENURef
size_t getENURef() const
ad::map::point::CoordinateTransform::convert
void convert(const GeoPoint &x, ECEFPoint &y) const
Convert point between coordinate systems.
Definition: CoordinateTransform.hpp:186
ad::map::point::CoordinateTransform::convert
void convert(const GeoPoint &x, ENUPoint &y) const
Convert point between coordinate systems.
Definition: CoordinateTransform.hpp:162
ad::map::point::CoordinateTransform::ENU2Geo
GeoPoint ENU2Geo(const ENUPoint &pt) const
Convert point between coordinate systems.
ad::map::point::CoordinateTransform::CoordinateTransform
CoordinateTransform()
ad::map::point::CoordinateTransform::setENUReferencePoint
void setENUReferencePoint(const GeoPoint &enu_ref_point)
Set the reference point for the ENU coordinate system. Increases ENU reference point counter.
ad::map::point::CoordinateTransform::isENUValid
bool isENUValid() const
ad::map::point::CoordinateTransform::WGS84_R
static physics::Distance WGS84_R(const Latitude &lat)
Calculates Earth Radius at specific latitude.
ad::map::point::GeoPoint
DataType GeoPoint.
Definition: GeoPoint.hpp:47
ad::map::point::CoordinateTransform::Geo2ECEF
ECEFPoint Geo2ECEF(const GeoPoint &pt) const
Convert point between coordinate systems.
ad::map::point::CoordinateTransform::ConstPtr
std::shared_ptr< CoordinateTransform const > ConstPtr
Smart pointer to the object.
Definition: CoordinateTransform.hpp:34
ad::map::point::ENUPoint
DataType ENUPoint.
Definition: ENUPoint.hpp:51
ad::map::point::CoordinateTransform::setGeoProjection
bool setGeoProjection(std::string const &geo_projection)
Set the method for ENU coordinate system conversion via projection string (e.g. from OpenDrive file)....
ad::map::point::CoordinateTransform::ENU2ECEF
ECEFPoint ENU2ECEF(const ENUPoint &pt) const
Convert point between coordinate systems.
ad::map::point::CoordinateTransform
Class that encapsulates various coordinate transformations.
Definition: CoordinateTransform.hpp:30
ad::map::point::CoordinateTransform::convert
void convert(const ECEFPoint &x, GeoPoint &y) const
Convert point between coordinate systems.
Definition: CoordinateTransform.hpp:198
ad::map::point::CoordinateTransform::geocentricLatitude
static double geocentricLatitude(const Latitude &lat)
Convert geodetic latitude to a geocentric latitude.
ad::map::point::CoordinateTransform::ECEF2ENU
ENUPoint ECEF2ENU(const ECEFPoint &pt) const
Convert point between coordinate systems.
ad::map::point::CoordinateTransform::ECEF2Geo
GeoPoint ECEF2Geo(const ECEFPoint &pt) const
Convert point between coordinate systems.
Types.hpp
ad::map::point::CoordinateTransform::Ptr
std::shared_ptr< CoordinateTransform > Ptr
Smart pointer to the object.
Definition: CoordinateTransform.hpp:33
ad::map::point::CoordinateTransform::convert
void convert(const ECEFPoint &x, ENUPoint &y) const
Convert point between coordinate systems.
Definition: CoordinateTransform.hpp:210
ad::map::point::Latitude
DataType Latitude.
Definition: Latitude.hpp:65
ad::map::point::CoordinateTransform::getENUReferencePoint
const GeoPoint & getENUReferencePoint() const
ad::map::point::ECEFPoint
DataType ECEFPoint.
Definition: ECEFPoint.hpp:45
ad::map::point::CoordinateTransform::convert
void convert(const ENUPoint &x, GeoPoint &y) const
Convert point between coordinate systems.
Definition: CoordinateTransform.hpp:174
ad::map::point::CoordinateTransform::convert
void convert(const std::vector< SourceC > &xs, std::vector< TargetC > &ys) const
Convert points between coordinate systems.
Definition: CoordinateTransform.hpp:235
ad::map::point::CoordinateTransform::~CoordinateTransform
~CoordinateTransform()
ad::map::point::CoordinateTransform::Geo2ENU
ENUPoint Geo2ENU(const GeoPoint &pt) const
Convert point between coordinate systems.
ad::map::point::CoordinateTransform::convert
void convert(const ENUPoint &x, ECEFPoint &y) const
Convert point between coordinate systems.
Definition: CoordinateTransform.hpp:222