libosmscout  1.1.1
RouteDescription.h
Go to the documentation of this file.
1 #ifndef OSMSCOUT_ROUTE_DESCRIPTION_H
2 #define OSMSCOUT_ROUTE_DESCRIPTION_H
3 
4 /*
5  This source is part of the libosmscout library
6  Copyright (C) 2009 Tim Teulings
7 
8  This library is free software; you can redistribute it and/or
9  modify it under the terms of the GNU Lesser General Public
10  License as published by the Free Software Foundation; either
11  version 2.1 of the License, or (at your option) any later version.
12 
13  This library is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  Lesser General Public License for more details.
17 
18  You should have received a copy of the GNU Lesser General Public
19  License along with this library; if not, write to the Free Software
20  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */
22 
23 #include <list>
24 #include <memory>
25 #include <string>
26 #include <unordered_map>
27 #include <vector>
28 #include <map>
29 
30 #include <osmscout/ObjectRef.h>
31 #include <osmscout/Path.h>
32 #include <osmscout/GeoCoord.h>
34 #include <osmscout/util/Distance.h>
35 #include <osmscout/util/Time.h>
36 
37 namespace osmscout {
38 
54  {
55  public:
57  static const char* const NODE_START_DESC;
59  static const char* const NODE_TARGET_DESC;
61  static const char* const WAY_NAME_DESC;
63  static const char* const WAY_NAME_CHANGED_DESC;
65  static const char* const CROSSING_WAYS_DESC;
67  static const char* const DIRECTION_DESC;
69  static const char* const TURN_DESC;
71  static const char* const ROUNDABOUT_ENTER_DESC;
73  static const char* const ROUNDABOUT_LEAVE_DESC;
75  static const char* const MOTORWAY_ENTER_DESC;
77  static const char* const MOTORWAY_CHANGE_DESC;
79  static const char* const MOTORWAY_LEAVE_DESC;
81  static const char* const MOTORWAY_JUNCTION_DESC;
83  static const char* const CROSSING_DESTINATION_DESC;
85  static const char* const WAY_MAXSPEED_DESC;
87  static const char* const WAY_TYPE_NAME_DESC;
89  static const char* const POI_AT_ROUTE_DESC;
91  static const char* const LANES_DESC;
93  static const char* const SUGGESTED_LANES_DESC;
94 
95  public:
101  {
102  public:
103  virtual ~Description() = default;
104 
105  virtual std::string GetDebugString() const = 0;
106  };
107 
108  using DescriptionRef = std::shared_ptr<Description>;
109 
115  {
116  private:
117  std::string description;
118 
119  public:
120  explicit StartDescription(const std::string& description);
121 
122  std::string GetDebugString() const override;
123 
124  std::string GetDescription() const;
125  };
126 
127  using StartDescriptionRef = std::shared_ptr<StartDescription>;
128 
134  {
135  private:
136  std::string description;
137 
138  public:
139  explicit TargetDescription(const std::string& description);
140 
141  std::string GetDebugString() const override;
142 
143  std::string GetDescription() const;
144  };
145 
146  using TargetDescriptionRef = std::shared_ptr<TargetDescription>;
147 
154  {
155  private:
156  std::string name;
157  std::string ref;
158 
159  public:
160  explicit NameDescription(const std::string& name);
161 
162  NameDescription(const std::string& name,
163  const std::string& ref);
164 
165  std::string GetDebugString() const override;
166 
167  bool HasName() const;
168 
169  std::string GetName() const;
170  std::string GetRef() const;
171 
172  std::string GetDescription() const;
173  };
174 
175  using NameDescriptionRef = std::shared_ptr<NameDescription>;
176 
183  {
184  NameDescriptionRef originDescription;
185  NameDescriptionRef targetDescription;
186 
187  public:
188  NameChangedDescription(const NameDescriptionRef& originDescription,
189  const NameDescriptionRef& targetDescription);
190 
191  std::string GetDebugString() const override;
192 
194  {
195  return originDescription;
196  }
197 
199  {
200  return targetDescription;
201  }
202  };
203 
204  using NameChangedDescriptionRef = std::shared_ptr<NameChangedDescription>;
205 
211  {
212  private:
213  size_t exitCount;
214  NameDescriptionRef originDescription;
215  NameDescriptionRef targetDescription;
216  std::list<NameDescriptionRef> descriptions;
217 
218  public:
219  CrossingWaysDescription(size_t exitCount,
220  const NameDescriptionRef& originDescription,
221  const NameDescriptionRef& targetDescription);
222 
223  void AddDescription(const NameDescriptionRef& description);
224 
225  std::string GetDebugString() const override;
226 
227  size_t GetExitCount() const
228  {
229  return exitCount;
230  }
231 
232  bool HasMultipleExits() const
233  {
234  return exitCount>1;
235  }
236 
238  {
239  return originDescription;
240  }
241 
243  {
244  return targetDescription;
245  }
246 
247  const std::list<NameDescriptionRef>& GetDescriptions() const
248  {
249  return descriptions;
250  }
251  };
252 
253  using CrossingWaysDescriptionRef = std::shared_ptr<CrossingWaysDescription>;
254 
267  {
268  public:
269  enum Move {
276  sharpRight
277  };
278 
279  private:
280  double turnAngle;
281  double curveAngle;
282  Move turn;
283  Move curve;
284 
285  private:
286  Move ConvertAngleToMove(double angle) const;
287  std::string ConvertMoveToString(Move move) const;
288 
289  public:
290  DirectionDescription(double turnAngle,
291  double curveAngle);
292 
293  std::string GetDebugString() const override;
294 
295  double GetTurnAngle() const
296  {
297  return turnAngle;
298  }
299 
300  double GetCurveAngle() const
301  {
302  return curveAngle;
303  }
304 
305  Move GetTurn() const
306  {
307  return turn;
308  }
309 
310  Move GetCurve() const
311  {
312  return curve;
313  }
314  };
315 
316  using DirectionDescriptionRef = std::shared_ptr<DirectionDescription>;
317 
323  {
324  public:
325  std::string GetDebugString() const override;
326  };
327 
328  using TurnDescriptionRef = std::shared_ptr<TurnDescription>;
329 
335  {
336  private:
337  bool clockwise;
338 
339  public:
340  explicit RoundaboutEnterDescription(bool clockwise);
341 
342  std::string GetDebugString() const override;
343 
344  bool IsClockwise() const
345  {
346  return clockwise;
347  }
348  };
349 
350  using RoundaboutEnterDescriptionRef = std::shared_ptr<RoundaboutEnterDescription>;
351 
357  {
358  private:
359  size_t exitCount;
360  bool clockwise;
361 
362  public:
363  RoundaboutLeaveDescription(size_t exitCount, bool clockwise);
364 
365  std::string GetDebugString() const override;
366 
367  size_t GetExitCount() const
368  {
369  return exitCount;
370  }
371 
372  bool IsClockwise() const
373  {
374  return clockwise;
375  }
376  };
377 
378  using RoundaboutLeaveDescriptionRef = std::shared_ptr<RoundaboutLeaveDescription>;
379 
385  {
386  private:
387  NameDescriptionRef toDescription;
388 
389  public:
390  explicit MotorwayEnterDescription(const NameDescriptionRef& toDescription);
391 
392  std::string GetDebugString() const override;
393 
395  {
396  return toDescription;
397  }
398  };
399 
400  using MotorwayEnterDescriptionRef = std::shared_ptr<MotorwayEnterDescription>;
401 
407  {
408  private:
409  NameDescriptionRef fromDescription;
410  NameDescriptionRef toDescription;
411 
412  public:
413  MotorwayChangeDescription(const NameDescriptionRef& fromDescription,
414  const NameDescriptionRef& toDescription);
415 
416  std::string GetDebugString() const override;
417 
419  {
420  return fromDescription;
421  }
422 
424  {
425  return toDescription;
426  }
427  };
428 
429  using MotorwayChangeDescriptionRef = std::shared_ptr<MotorwayChangeDescription>;
430 
436  {
437  private:
438  NameDescriptionRef fromDescription;
439 
440  public:
441  explicit MotorwayLeaveDescription(const NameDescriptionRef& fromDescription);
442 
443  std::string GetDebugString() const override;
444 
446  {
447  return fromDescription;
448  }
449  };
450 
451  using MotorwayLeaveDescriptionRef = std::shared_ptr<MotorwayLeaveDescription>;
452 
458  {
459  private:
460  NameDescriptionRef junctionDescription;
461 
462  public:
463  explicit MotorwayJunctionDescription(const NameDescriptionRef& junctionDescription);
464 
465  std::string GetDebugString() const override;
466 
468  {
469  return junctionDescription;
470  }
471  };
472 
473  using MotorwayJunctionDescriptionRef = std::shared_ptr<MotorwayJunctionDescription>;
474 
480  {
481  private:
482  std::string description;
483 
484  public:
485  explicit DestinationDescription(const std::string& description);
486 
487  std::string GetDebugString() const override;
488 
489  std::string GetDescription() const;
490  };
491 
492  using DestinationDescriptionRef = std::shared_ptr<DestinationDescription>;
493 
499  {
500  private:
501  uint8_t maxSpeed;
502 
503  public:
504  explicit MaxSpeedDescription(uint8_t speed);
505 
506  std::string GetDebugString() const override;
507 
508  uint8_t GetMaxSpeed() const
509  {
510  return maxSpeed;
511  }
512  };
513 
514  using MaxSpeedDescriptionRef = std::shared_ptr<MaxSpeedDescription>;
515 
521  {
522  private:
523  std::string name;
524 
525  public:
526  explicit TypeNameDescription(const std::string& name);
527 
528  std::string GetDebugString() const override;
529 
530  bool HasName() const;
531 
532  std::string GetName() const;
533 
534  std::string GetDescription() const;
535  };
536 
537  using TypeNameDescriptionRef = std::shared_ptr<TypeNameDescription>;
538 
544  {
545  private:
546  DatabaseId databaseId;
547  ObjectFileRef object;
548  NameDescriptionRef name;
549  Distance distance;
550 
551  public:
552  explicit POIAtRouteDescription(DatabaseId databaseId,
553  const ObjectFileRef& object,
554  const NameDescriptionRef& name,
555  const Distance& distance);
556 
557  std::string GetDebugString() const override;
558 
560  {
561  return databaseId;
562  }
563 
564  ObjectFileRef GetObject() const
565  {
566  return object;
567  }
568 
570  {
571  return name;
572  }
573 
574  Distance GetDistance() const
575  {
576  return distance;
577  }
578  };
579 
580  using POIAtRouteDescriptionRef = std::shared_ptr<POIAtRouteDescription>;
581 
587  {
588  private:
589  bool oneway{false};
590  uint8_t laneCount{1};
591 
603  std::vector<std::string> laneTurns;
604 
605  public:
606  LaneDescription(bool oneway,
607  uint8_t laneCount,
608  const std::vector<std::string> &laneTurns);
609 
610  std::string GetDebugString() const override;
611 
612  bool IsOneway() const
613  {
614  return oneway;
615  }
616 
617  uint8_t GetLaneCount() const
618  {
619  return laneCount;
620  }
621 
622  const std::vector<std::string>& GetLaneTurns() const
623  {
624  return laneTurns;
625  }
626 
627  bool operator==(const LaneDescription &o) const;
628  bool operator!=(const LaneDescription &o) const;
629  };
630 
631  using LaneDescriptionRef = std::shared_ptr<LaneDescription>;
632 
641  {
642  private:
643  uint8_t from = uint8_t(-1);
644  uint8_t to = uint8_t(-1);
645 
646  public:
647  SuggestedLaneDescription(uint8_t from, uint8_t to);
648 
649  std::string GetDebugString() const override;
650 
651  uint8_t GetFrom() const
652  {
653  return from;
654  }
655 
656  uint8_t GetTo() const
657  {
658  return to;
659  }
660  };
661 
662  using SuggestedLaneDescriptionRef = std::shared_ptr<SuggestedLaneDescription>;
663 
668  {
669  private:
670  DatabaseId database;
671  size_t currentNodeIndex;
672  std::vector<ObjectFileRef> objects;
673  ObjectFileRef pathObject;
674  size_t targetNodeIndex;
675  Distance distance;
676  Duration time;
677  GeoCoord location;
678  std::unordered_map<std::string,DescriptionRef> descriptionMap;
679  std::list<DescriptionRef> descriptions;
680 
681  public:
682  Node(DatabaseId database,
683  size_t currentNodeIndex,
684  const std::vector<ObjectFileRef>& objects,
685  const ObjectFileRef& pathObject,
686  size_t targetNodeIndex);
687 
688  size_t GetCurrentNodeIndex() const
689  {
690  return currentNodeIndex;
691  }
692 
696  const std::vector<ObjectFileRef>& GetObjects() const
697  {
698  return objects;
699  }
700 
704  const std::list<DescriptionRef>& GetDescriptions() const
705  {
706  return descriptions;
707  }
708 
713  bool HasPathObject() const
714  {
715  return pathObject.Valid();
716  }
717 
719  {
720  return database;
721  }
722 
724  {
725  return DBFileOffset(GetDatabaseId(),GetPathObject().GetFileOffset());
726  }
727 
731  ObjectFileRef GetPathObject() const
732  {
733  return pathObject;
734  }
735 
739  size_t GetTargetNodeIndex() const
740  {
741  return targetNodeIndex;
742  }
743 
747  Distance GetDistance() const
748  {
749  return distance;
750  }
751 
756  {
757  return time;
758  }
759 
763  GeoCoord GetLocation() const
764  {
765  return location;
766  }
767 
768  bool HasDescription(const char* name) const;
769  DescriptionRef GetDescription(const char* name) const;
770 
771  void SetDistance(Distance distance);
772  void SetTime(const Timestamp::duration &time);
773  void SetLocation(const GeoCoord &coord);
774 
775  void AddDescription(const char* name,
776  const DescriptionRef& description);
777  };
778 
779  using NodeIterator = std::list<RouteDescription::Node>::const_iterator;
780 
781  private:
782  std::list<Node> nodes;
783  std::map<DatabaseId, std::string> databaseMapping;
784 
785  public:
786  RouteDescription() = default;
787  virtual ~RouteDescription() = default;
788 
789  void SetDatabaseMapping(std::map<DatabaseId, std::string> databaseMapping);
790 
791  std::map<DatabaseId, std::string> GetDatabaseMapping() const;
792 
793  void Clear();
794 
795  bool Empty() const;
796 
797  void AddNode(DatabaseId database,
798  size_t currentNodeIndex,
799  const std::vector<ObjectFileRef>& objects,
800  const ObjectFileRef& pathObject,
801  size_t targetNodeIndex);
802 
803  std::list<Node>& Nodes()
804  {
805  return nodes;
806  }
807 
808  const std::list<Node>& Nodes() const
809  {
810  return nodes;
811  }
812  };
813 
814  using RouteDescriptionRef = std::shared_ptr<RouteDescription>;
815 }
816 
817 #endif
NameDescriptionRef GetTargetDesccription() const
Definition: RouteDescription.h:242
static const char *const LANES_DESC
Definition: RouteDescription.h:91
uint8_t GetLaneCount() const
Definition: RouteDescription.h:617
size_t GetExitCount() const
Definition: RouteDescription.h:227
bool HasPathObject() const
Definition: RouteDescription.h:713
std::list< Node > & Nodes()
Definition: RouteDescription.h:803
Definition: RouteDescription.h:520
std::shared_ptr< MotorwayChangeDescription > MotorwayChangeDescriptionRef
Definition: RouteDescription.h:429
static const char *const NODE_TARGET_DESC
Definition: RouteDescription.h:59
Definition: RouteDescription.h:586
ObjectFileRef GetObject() const
Definition: RouteDescription.h:564
Move
Definition: RouteDescription.h:269
std::shared_ptr< DestinationDescription > DestinationDescriptionRef
Definition: RouteDescription.h:492
static const char *const MOTORWAY_ENTER_DESC
Definition: RouteDescription.h:75
Definition: RouteDescription.h:667
NameDescriptionRef GetOriginDescription() const
Definition: RouteDescription.h:193
static const char *const WAY_MAXSPEED_DESC
Definition: RouteDescription.h:85
Definition: RouteDescription.h:153
Definition: RouteDescription.h:53
std::shared_ptr< RoundaboutLeaveDescription > RoundaboutLeaveDescriptionRef
Definition: RouteDescription.h:378
std::shared_ptr< POIAtRouteDescription > POIAtRouteDescriptionRef
Definition: RouteDescription.h:580
std::shared_ptr< StartDescription > StartDescriptionRef
Definition: RouteDescription.h:127
std::shared_ptr< Description > DescriptionRef
Definition: RouteDescription.h:108
std::shared_ptr< MotorwayEnterDescription > MotorwayEnterDescriptionRef
Definition: RouteDescription.h:400
std::shared_ptr< MotorwayLeaveDescription > MotorwayLeaveDescriptionRef
Definition: RouteDescription.h:451
std::shared_ptr< RoundaboutEnterDescription > RoundaboutEnterDescriptionRef
Definition: RouteDescription.h:350
NameDescriptionRef GetTargetDescription() const
Definition: RouteDescription.h:198
static const char *const MOTORWAY_JUNCTION_DESC
Definition: RouteDescription.h:81
NameDescriptionRef GetOriginDesccription() const
Definition: RouteDescription.h:237
Duration GetTime() const
Definition: RouteDescription.h:755
size_t GetTargetNodeIndex() const
Definition: RouteDescription.h:739
std::shared_ptr< NameChangedDescription > NameChangedDescriptionRef
Definition: RouteDescription.h:204
bool HasMultipleExits() const
Definition: RouteDescription.h:232
bool operator!=(const MapViewStruct &r1, const MapViewStruct &r2)
Definition: DBThread.h:61
Definition: RouteDescription.h:266
NameDescriptionRef GetToDescription() const
Definition: RouteDescription.h:394
static const char *const NODE_START_DESC
Definition: RouteDescription.h:57
Distance GetDistance() const
Definition: RouteDescription.h:747
Definition: RouteDescription.h:322
std::shared_ptr< NameDescription > NameDescriptionRef
Definition: RouteDescription.h:175
static const char *const CROSSING_WAYS_DESC
Definition: RouteDescription.h:65
const std::vector< std::string > & GetLaneTurns() const
Definition: RouteDescription.h:622
const std::list< NameDescriptionRef > & GetDescriptions() const
Definition: RouteDescription.h:247
static const char *const WAY_NAME_DESC
Definition: RouteDescription.h:61
Distance GetDistance() const
Definition: RouteDescription.h:574
static const char *const ROUNDABOUT_ENTER_DESC
Definition: RouteDescription.h:71
Definition: Area.h:38
Definition: RouteDescription.h:114
Definition: RouteDescription.h:100
std::shared_ptr< TargetDescription > TargetDescriptionRef
Definition: RouteDescription.h:146
Definition: RouteDescription.h:543
NameDescriptionRef GetName() const
Definition: RouteDescription.h:569
size_t GetExitCount() const
Definition: RouteDescription.h:367
std::shared_ptr< DirectionDescription > DirectionDescriptionRef
Definition: RouteDescription.h:316
std::shared_ptr< MaxSpeedDescription > MaxSpeedDescriptionRef
Definition: RouteDescription.h:514
const std::list< DescriptionRef > & GetDescriptions() const
Definition: RouteDescription.h:704
#define OSMSCOUT_API
Definition: CoreImportExport.h:45
const std::vector< ObjectFileRef > & GetObjects() const
Definition: RouteDescription.h:696
std::shared_ptr< CrossingWaysDescription > CrossingWaysDescriptionRef
Definition: RouteDescription.h:253
Definition: RouteDescription.h:133
size_t GetCurrentNodeIndex() const
Definition: RouteDescription.h:688
NameDescriptionRef GetFromDescription() const
Definition: RouteDescription.h:418
std::shared_ptr< MotorwayJunctionDescription > MotorwayJunctionDescriptionRef
Definition: RouteDescription.h:473
std::shared_ptr< LaneDescription > LaneDescriptionRef
Definition: RouteDescription.h:631
std::list< RouteDescription::Node >::const_iterator NodeIterator
Definition: RouteDescription.h:779
std::shared_ptr< SuggestedLaneDescription > SuggestedLaneDescriptionRef
Definition: RouteDescription.h:662
uint8_t GetTo() const
Definition: RouteDescription.h:656
Definition: RouteDescription.h:479
double GetTurnAngle() const
Definition: RouteDescription.h:295
Definition: RouteDescription.h:498
Move GetTurn() const
Definition: RouteDescription.h:305
std::shared_ptr< TypeNameDescription > TypeNameDescriptionRef
Definition: RouteDescription.h:537
DBFileOffset GetDBFileOffset() const
Definition: RouteDescription.h:723
static const char *const POI_AT_ROUTE_DESC
Definition: RouteDescription.h:89
DatabaseId GetDatabaseId() const
Definition: RouteDescription.h:718
bool operator==(const MapView &a, const MapView &b)
Definition: InputHandler.h:222
static const char *const SUGGESTED_LANES_DESC
Definition: RouteDescription.h:93
NameDescriptionRef GetFromDescription() const
Definition: RouteDescription.h:445
static const char *const WAY_NAME_CHANGED_DESC
Definition: RouteDescription.h:63
std::shared_ptr< TurnDescription > TurnDescriptionRef
Definition: RouteDescription.h:328
double GetCurveAngle() const
Definition: RouteDescription.h:300
std::shared_ptr< RouteDescription > RouteDescriptionRef
Definition: RouteDescription.h:814
static const char *const CROSSING_DESTINATION_DESC
Definition: RouteDescription.h:83
bool IsClockwise() const
Definition: RouteDescription.h:372
static const char *const MOTORWAY_CHANGE_DESC
Definition: RouteDescription.h:77
NameDescriptionRef GetJunctionDescription() const
Definition: RouteDescription.h:467
Timestamp::duration Duration
Definition: Time.h:29
static const char *const MOTORWAY_LEAVE_DESC
Definition: RouteDescription.h:79
static const char *const ROUNDABOUT_LEAVE_DESC
Definition: RouteDescription.h:73
ObjectFileRef GetPathObject() const
Definition: RouteDescription.h:731
Move GetCurve() const
Definition: RouteDescription.h:310
DatabaseId GetDatabaseId() const
Definition: RouteDescription.h:559
const std::list< Node > & Nodes() const
Definition: RouteDescription.h:808
GeoCoord GetLocation() const
Definition: RouteDescription.h:763
static const char *const TURN_DESC
Definition: RouteDescription.h:69
Definition: DBFileOffset.h:92
Definition: RouteDescription.h:210
uint8_t GetMaxSpeed() const
Definition: RouteDescription.h:508
uint8_t GetFrom() const
Definition: RouteDescription.h:651
bool IsOneway() const
Definition: RouteDescription.h:612
Definition: RouteDescription.h:182
NameDescriptionRef GetToDescription() const
Definition: RouteDescription.h:423
bool IsClockwise() const
Definition: RouteDescription.h:344
static const char *const DIRECTION_DESC
Definition: RouteDescription.h:67
static const char *const WAY_TYPE_NAME_DESC
Definition: RouteDescription.h:87
uint32_t DatabaseId
Definition: DBFileOffset.h:30