LaneletMap.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <unordered_map>
4 
11 
12 namespace lanelet {
13 namespace internal {
14 template <typename T>
15 struct SearchBox {
17 };
18 template <>
19 struct SearchBox<Point3d> {
20  using Type = BasicPoint2d;
21 };
22 template <typename T>
23 using SearchBoxT = typename SearchBox<T>::Type;
24 } // namespace internal
38 template <typename T>
40  public:
41  using PrimitiveT = T;
43  using Map = std::unordered_map<Id, T>;
44  using ConstPrimitiveVec = std::vector<ConstPrimitiveT>;
45  using PrimitiveVec = std::vector<PrimitiveT>;
48 
50  using iterator = // NOLINT
52 
54  using const_iterator = // NOLINT
55  internal::TransformIterator<typename Map::const_iterator, const ConstPrimitiveT,
57  PrimitiveLayer(const PrimitiveLayer& rhs) = delete;
58  PrimitiveLayer& operator=(const PrimitiveLayer& rhs) = delete;
59 
65  bool exists(Id id) const;
66 
73  ConstPrimitiveT get(Id id) const;
74 
81  PrimitiveT get(Id id);
82 
91  const_iterator find(Id id) const;
92 
102  std::vector<ConstPrimitiveT> findUsages(
104 
110  std::vector<PrimitiveT> findUsages(const traits::ConstPrimitiveType<traits::OwnedT<PrimitiveT>>& primitive);
111 
116  const_iterator begin() const;
117 
122  const_iterator end() const;
123 
129  iterator find(Id id);
130 
135  iterator begin();
136 
141  iterator end();
142 
147  bool empty() const { return elements_.empty(); }
148 
153  size_t size() const { return elements_.size(); }
154 
155  using ConstSearchFunction = std::function<bool(const internal::SearchBoxT<T>& box, const ConstPrimitiveT& prim)>;
156  using SearchFunction = std::function<bool(const internal::SearchBoxT<T>& box, const PrimitiveT& prim)>;
157 
172  ConstPrimitiveVec search(const BoundingBox2d& area) const;
173  PrimitiveVec search(const BoundingBox2d& area);
174 
184  OptConstPrimitiveT searchUntil(const BoundingBox2d& area, const ConstSearchFunction& func) const;
185  OptPrimitiveT searchUntil(const BoundingBox2d& area, const SearchFunction& func);
186 
203  ConstPrimitiveVec nearest(const BasicPoint2d& point, unsigned n) const;
204  PrimitiveVec nearest(const BasicPoint2d& point, unsigned n);
205  ConstPrimitiveVec nearest(const Point2d& point, unsigned n) const { return nearest(point.basicPoint(), n); }
206  PrimitiveVec nearest(const Point2d& point, unsigned n) { return nearest(point.basicPoint(), n); }
207 
217  OptConstPrimitiveT nearestUntil(const BasicPoint2d& point, const ConstSearchFunction& func) const;
218  OptPrimitiveT nearestUntil(const BasicPoint2d& point, const SearchFunction& func);
220  return nearestUntil(point.basicPoint2d(), func);
221  }
222  OptPrimitiveT nearestUntil(const Point2d& point, const SearchFunction& func) {
223  return nearestUntil(point.basicPoint2d(), func);
224  }
225 
234  Id uniqueId() const;
235 
236  protected:
237  friend class LaneletMap; // only the map can create or modify layers
238  friend class LaneletMapLayers;
239  friend class LaneletSubmap;
240  explicit PrimitiveLayer(const Map& primitives = Map());
241  PrimitiveLayer(PrimitiveLayer&& rhs) noexcept;
242  PrimitiveLayer& operator=(PrimitiveLayer&& rhs) noexcept;
243  ~PrimitiveLayer() noexcept;
244 
245  void add(const PrimitiveT& element);
246  void remove(Id element);
247 
248  // NOLINTNEXTLINE
249  Map elements_;
250  struct Tree;
251  // NOLINTNEXTLINE
252  std::unique_ptr<Tree> tree_;
253 };
254 
255 // we need this ifndef for LaneletMap.cpp
256 #ifndef LANELET_LAYER_DEFINITION
257 extern template class PrimitiveLayer<Area>;
258 extern template class PrimitiveLayer<Polygon3d>;
259 extern template class PrimitiveLayer<Lanelet>;
260 extern template class PrimitiveLayer<LineString3d>;
261 extern template class PrimitiveLayer<Point3d>;
262 extern template class PrimitiveLayer<RegulatoryElementPtr>;
263 #endif
264 
267  public:
269  AreaLayer() = default;
270  ~AreaLayer() = default;
271  AreaLayer(const AreaLayer&) = delete;
272  AreaLayer operator=(AreaLayer&) = delete;
274  ConstAreas findUsages(const RegulatoryElementConstPtr& regElem) const;
275 
276  private:
277  friend class LaneletMap;
278  friend class LaneletMapLayers;
279  friend class LaneletSubmap;
281  AreaLayer(AreaLayer&& rhs) noexcept = default;
282  AreaLayer& operator=(AreaLayer&& rhs) noexcept = default;
283 };
284 
287  public:
289  LaneletLayer() = default;
290  ~LaneletLayer() = default;
291  LaneletLayer(const LaneletLayer&) = delete;
292  LaneletLayer operator=(LaneletLayer&) = delete;
294  ConstLanelets findUsages(const RegulatoryElementConstPtr& regElem) const;
295 
296  private:
297  friend class LaneletMap;
298  friend class LaneletMapLayers;
299  friend class LaneletSubmap;
301  LaneletLayer(LaneletLayer&& rhs) noexcept = default;
302  LaneletLayer& operator=(LaneletLayer&& rhs) noexcept = default;
303 };
304 
309 
314  public:
315  LaneletMapLayers() = default;
316  LaneletMapLayers(LaneletMapLayers&& rhs) noexcept = default;
317  LaneletMapLayers& operator=(LaneletMapLayers&& rhs) noexcept = default;
318  LaneletMapLayers(const LaneletMapLayers& rhs) = delete;
319  LaneletMapLayers& operator=(const LaneletMapLayers& rhs) = delete;
320  ~LaneletMapLayers() noexcept = default;
321 
337  LaneletMapLayers(const LaneletLayer::Map& lanelets, const AreaLayer::Map& areas,
338  const RegulatoryElementLayer::Map& regulatoryElements, const PolygonLayer::Map& polygons,
339  const LineStringLayer::Map& lineStrings, const PointLayer::Map& points);
340 
342  bool empty() const noexcept {
343  return laneletLayer.empty() && areaLayer.empty() && regulatoryElementLayer.empty() && polygonLayer.empty() &&
344  lineStringLayer.empty() && pointLayer.empty();
345  }
346 
348  size_t size() const noexcept {
349  return laneletLayer.size() + areaLayer.size() + regulatoryElementLayer.size() + polygonLayer.size() +
350  lineStringLayer.size() + pointLayer.size();
351  }
352 
359 };
360 
375 class LaneletMap : public LaneletMapLayers {
376  public:
378 
388  void add(Lanelet lanelet);
389 
399  void add(Area area);
400 
410  void add(const RegulatoryElementPtr& regElem);
411 
419  void add(Polygon3d polygon);
420 
428  void add(LineString3d lineString);
429 
437  void add(Point3d point);
438 };
439 
452  public:
453  LaneletSubmap() = default;
455 
457  explicit LaneletSubmap(LaneletMap&& rhs) noexcept : LaneletMapLayers{std::move(rhs)} {}
459  static_cast<LaneletMapLayers&>(*this) = std::move(rhs);
460  return *this;
461  }
462 
472  void add(Lanelet lanelet);
473 
475  void add(Area area);
476 
478  void add(const RegulatoryElementPtr& regElem);
479 
481  void add(Polygon3d polygon);
482 
484  void add(LineString3d lineString);
485 
487  void add(Point3d point);
488 
490  LaneletMapConstPtr laneletMap() const;
491  LaneletMapUPtr laneletMap();
492 
495  void trackParameters(const RegulatoryElement& regelem);
496 
497  private:
499  std::vector<boost::variant<ConstLanelet, ConstArea>> regelemObjects_;
500 };
501 
502 namespace utils {
503 template <typename PrimitiveT>
505 
507 LaneletMapUPtr createMap(const Points3d& fromPoints);
508 LaneletMapUPtr createMap(const LineStrings3d& fromLineStrings);
509 LaneletMapUPtr createMap(const Polygons3d& fromPolygons);
510 LaneletMapUPtr createMap(const Lanelets& fromLanelets);
511 LaneletMapUPtr createMap(const Areas& fromAreas);
512 LaneletMapUPtr createMap(const Lanelets& fromLanelets, const Areas& fromAreas);
513 LaneletMapConstUPtr createConstMap(const ConstLanelets& fromLanelets, const ConstAreas& fromAreas);
514 
516 LaneletSubmapUPtr createSubmap(const Points3d& fromPoints);
517 LaneletSubmapUPtr createSubmap(const LineStrings3d& fromLineStrings);
518 LaneletSubmapUPtr createSubmap(const Polygons3d& fromPolygons);
519 LaneletSubmapUPtr createSubmap(const Lanelets& fromLanelets);
520 LaneletSubmapUPtr createSubmap(const Areas& fromAreas);
521 LaneletSubmapUPtr createSubmap(const Lanelets& fromLanelets, const Areas& fromAreas);
522 LaneletSubmapConstUPtr createConstSubmap(const ConstLanelets& fromLanelets, const ConstAreas& fromAreas);
523 
535 Id getId();
536 
539 void registerId(Id id);
540 
541 template <typename PrimitiveT>
542 std::vector<ConstLayerPrimitive<PrimitiveT>> findUsages(const PrimitiveLayer<PrimitiveT>& layer, Id id);
543 
546 
547 } // namespace utils
548 
549 namespace traits {
550 template <typename T>
552  using Type = typename T::PrimitiveT;
553 };
554 template <typename T>
555 struct LayerPrimitive<const T> {
556  using Type = typename T::ConstPrimitiveT;
557 };
558 
559 template <typename T>
561 } // namespace traits
562 
563 namespace geometry {
578 template <typename PrimT>
579 std::vector<std::pair<double, PrimT>> findNearest(PrimitiveLayer<PrimT>& map, const BasicPoint2d& pt, unsigned count);
580 template <typename PrimT>
581 std::vector<std::pair<double, traits::ConstPrimitiveType<PrimT>>> findNearest(const PrimitiveLayer<PrimT>& map,
582  const BasicPoint2d& pt, unsigned count);
583 
584 #ifndef LANELET_LAYER_DEFINITION
585 // clang-format off
586 // NOLINTNEXTLINE
587 #define EXTERN_FIND_NEAREST(PRIM) extern template std::vector<std::pair<double, PRIM>> findNearest(PrimitiveLayer<PRIM>&, const BasicPoint2d&, unsigned)
588 // NOLINTNEXTLINE
589 #define EXTERN_CONST_FIND_NEAREST(PRIM) extern template std::vector<std::pair<double, traits::ConstPrimitiveType<PRIM>>> findNearest(const PrimitiveLayer<PRIM>&, const BasicPoint2d&, unsigned)
590 // clang-format on
591 EXTERN_FIND_NEAREST(Area);
592 EXTERN_FIND_NEAREST(Polygon3d);
593 EXTERN_FIND_NEAREST(Lanelet);
594 EXTERN_FIND_NEAREST(LineString3d);
595 EXTERN_FIND_NEAREST(Point3d);
598 EXTERN_CONST_FIND_NEAREST(Polygon3d);
600 EXTERN_CONST_FIND_NEAREST(LineString3d);
603 #undef EXTERN_FIND_NEAREST
604 #undef EXTERN_CONST_FIND_NEAREST
605 #endif
606 } // namespace geometry
607 
608 } // namespace lanelet
LaneletSubmap & operator=(LaneletMap &&rhs)
Definition: LaneletMap.h:458
OptConstPrimitiveT nearestUntil(const ConstPoint2d &point, const ConstSearchFunction &func) const
Definition: LaneletMap.h:219
Each primitive in lanelet2 has its own layer in the map.
Definition: LaneletMap.h:39
typename Owned< PrimitiveT >::Type OwnedT
Definition: Traits.h:76
std::vector< ConstLayerPrimitive< PrimitiveT > > findUsages(const PrimitiveLayer< PrimitiveT > &layer, Id id)
Definition: LaneletMap.cpp:779
BasicPoint p
Id getId()
returns a unique id by incrementing a counter each time this is called.
Definition: LaneletMap.cpp:883
traits::ConstPrimitiveType< RegulatoryElementPtr > ConstPrimitiveT
Definition: LaneletMap.h:42
std::shared_ptr< RegulatoryElement > RegulatoryElementPtr
Definition: Forward.h:192
PrimitiveVec nearest(const Point2d &point, unsigned n)
Definition: LaneletMap.h:206
auto basicPoint() noexcept
get a mutable reference to the 2d point data
auto find(ContainerT &&c, const ValueT &val)
Definition: Utilities.h:186
friend class LaneletSubmap
Definition: LaneletMap.h:299
typename PrimitiveLayer< PrimitiveT >::ConstPrimitiveT ConstLayerPrimitive
Definition: LaneletMap.h:504
int64_t Id
Definition: Forward.h:198
std::unordered_map< Id, RegulatoryElementPtr > Map
Definition: LaneletMap.h:43
Optional< ConstPrimitiveT > OptConstPrimitiveT
Definition: LaneletMap.h:46
LaneletSubmapUPtr createSubmap(const Lanelets &fromLanelets, const Areas &fromAreas)
Definition: LaneletMap.cpp:912
Specialized map layer for Area.
Definition: LaneletMap.h:266
PointLayer pointLayer
access to the points
Definition: LaneletMap.h:358
AreaLayer areaLayer
access to areas
Definition: LaneletMap.h:354
std::vector< ConstPrimitiveT > findUsages(const traits::ConstPrimitiveType< traits::OwnedT< PrimitiveT >> &primitive) const
finds usages of an owned type within this layer
The famous (mutable) lanelet class.
std::vector< Lanelet > Lanelets
Definition: Forward.h:113
std::shared_ptr< const LaneletMap > LaneletMapConstPtr
Definition: Forward.h:168
An immutable 2d point.
LaneletSubmapConstUPtr createConstSubmap(const ConstLanelets &fromLanelets, const ConstAreas &fromAreas)
Definition: LaneletMap.cpp:924
std::function< bool(const internal::SearchBoxT< RegulatoryElementPtr > &box, const ConstPrimitiveT &prim)> ConstSearchFunction
Definition: LaneletMap.h:155
Container for all layers of a lanelet map. Used by both LaneletMap and LaneletSubmap.
Definition: LaneletMap.h:313
std::vector< Point3d > Points3d
Definition: Forward.h:34
std::vector< Polygon3d > Polygons3d
Definition: Forward.h:149
std::unique_ptr< LaneletMap > LaneletMapUPtr
Definition: Forward.h:167
std::unique_ptr< const LaneletSubmap > LaneletSubmapConstUPtr
Definition: Forward.h:178
A normal 3d linestring with mutable data.
A mutable 3d point.
LaneletLayer laneletLayer
access to the lanelets within this map
Definition: LaneletMap.h:353
friend class LaneletMap
Definition: LaneletMap.h:297
boost::optional< T > Optional
Definition: Optional.h:7
friend class LaneletSubmap
Definition: LaneletMap.h:279
std::vector< ConstPrimitiveT > ConstPrimitiveVec
Definition: LaneletMap.h:44
ConstPrimitiveVec nearest(const Point2d &point, unsigned n) const
Definition: LaneletMap.h:205
bool empty() const
returns whether this layer contains something
Definition: LaneletMap.h:147
ConstLanelets findUsagesInLanelets(const LaneletMapLayers &map, const ConstPoint3d &p)
Definition: LaneletMap.cpp:793
RegulatoryElementLayer regulatoryElementLayer
access to regElems
Definition: LaneletMap.h:355
size_t size() const noexcept
Returns the total number of elements in all layers.
Definition: LaneletMap.h:348
ConstAreas findUsagesInAreas(const LaneletMapLayers &map, const ConstPoint3d &p)
Definition: LaneletMap.cpp:803
typename SearchBox< T >::Type SearchBoxT
Definition: LaneletMap.h:23
A LaneletSubmap only contains the elemets that have be expleicitly added to it.
Definition: LaneletMap.h:451
typename PrimitiveTraits< PrimitiveT >::ConstType ConstPrimitiveType
Utility for determinig the matching const type for a primitive.
Definition: Traits.h:80
std::shared_ptr< const RegulatoryElement > RegulatoryElementConstPtr
Definition: Forward.h:194
friend class LaneletMapLayers
Definition: LaneletMap.h:278
Specialized map layer for Lanelet.
Definition: LaneletMap.h:286
typename T::PrimitiveT Type
Definition: LaneletMap.h:552
#define EXTERN_FIND_NEAREST(PRIM)
Definition: LaneletMap.h:587
std::function< bool(const internal::SearchBoxT< RegulatoryElementPtr > &box, const PrimitiveT &prim)> SearchFunction
Definition: LaneletMap.h:156
LaneletSubmap(LaneletMap &&rhs) noexcept
Constructs a submap from a moved-from LaneletMap.
Definition: LaneletMap.h:457
Axis-Aligned bounding box in 2d.
size_t size() const
returns number of elements in this layer
Definition: LaneletMap.h:153
A mutable clockwise oriented, open (ie start point != end point) polygon in 3d.
typename LayerPrimitive< T >::Type LayerPrimitiveType
Definition: LaneletMap.h:560
LaneletMapUPtr createMap(const Lanelets &fromLanelets, const Areas &fromAreas)
Definition: LaneletMap.cpp:824
Eigen::Matrix< double, 2, 1, Eigen::DontAlign > BasicPoint2d
a simple 2d-point
friend class LaneletMap
Definition: LaneletMap.h:277
Famous Area class that represents a basic area as element of the map.
std::vector< std::pair< double, traits::ConstPrimitiveType< PrimT > > > findNearest(const PrimitiveLayer< PrimT > &map, const BasicPoint2d &pt, unsigned count)
Definition: LaneletMap.cpp:992
Id id
Definition: LaneletMap.cpp:63
std::vector< Area > Areas
Definition: Forward.h:125
A general rule or limitation for a lanelet (abstract base class)
An immutable 3d point.
typename T::ConstPrimitiveT Type
Definition: LaneletMap.h:556
std::unique_ptr< const LaneletMap > LaneletMapConstUPtr
Definition: Forward.h:169
PolygonLayer polygonLayer
access to the polygons
Definition: LaneletMap.h:356
friend class LaneletMapLayers
Definition: LaneletMap.h:298
void registerId(Id id)
Definition: LaneletMap.cpp:885
Basic element for accessing and managing the elements of a map.
Definition: LaneletMap.h:375
LineStringLayer lineStringLayer
access to the lineStrings
Definition: LaneletMap.h:357
std::unique_ptr< LaneletSubmap > LaneletSubmapUPtr
Definition: Forward.h:176
A mutable 2d point.
std::vector< LineString3d > LineStrings3d
Definition: Forward.h:57
LaneletMapConstUPtr createConstMap(const ConstLanelets &fromLanelets, const ConstAreas &fromAreas)
Definition: LaneletMap.cpp:875
bool empty() const noexcept
Returns whether all layers of this object are empty.
Definition: LaneletMap.h:342
std::vector< ConstArea > ConstAreas
Definition: Forward.h:126
#define EXTERN_CONST_FIND_NEAREST(PRIM)
Definition: LaneletMap.h:589
OptPrimitiveT nearestUntil(const Point2d &point, const SearchFunction &func)
Definition: LaneletMap.h:222
std::vector< ConstLanelet > ConstLanelets
Definition: Forward.h:114
std::vector< boost::variant< ConstLanelet, ConstArea > > regelemObjects_
In order to not let lanelets/areas referenced by regelems get out of scope, we keep a reference to th...
Definition: LaneletMap.h:499


lanelet2_core
Author(s): Fabian Poggenhans
autogenerated on Tue Jun 6 2023 02:23:32