libosmscout  1.1.1
AbstractRoutingService.h
Go to the documentation of this file.
1 #ifndef OSMSCOUT_ABSTRACTROUTINGSERVICE_H
2 #define OSMSCOUT_ABSTRACTROUTINGSERVICE_H
3 
4 /*
5  This source is part of the libosmscout library
6  Copyright (C) 2016 Tim Teulings
7  Copyright (C) 2017 Lukas Karas
8 
9  This library is free software; you can redistribute it and/or
10  modify it under the terms of the GNU Lesser General Public
11  License as published by the Free Software Foundation; either
12  version 2.1 of the License, or (at your option) any later version.
13 
14  This library is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  Lesser General Public License for more details.
18 
19  You should have received a copy of the GNU Lesser General Public
20  License along with this library; if not, write to the Free Software
21  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 */
23 
24 #include <functional>
25 #include <list>
26 #include <memory>
27 #include <set>
28 #include <unordered_map>
29 #include <unordered_set>
30 
31 #include <osmscout/CoreFeatures.h>
32 #include <osmscout/TypeConfig.h>
33 #include <osmscout/Point.h>
34 #include <osmscout/Pixel.h>
35 
41 
42 namespace osmscout {
43 
51  class OSMSCOUT_API RoutingResult CLASS_FINAL
52  {
53  private:
54  RouteData route;
55  Distance currentMaxDistance;
56  Distance overallDistance;
57 
58  public:
59  RoutingResult();
60 
61  inline void SetOverallDistance(const Distance &overallDistance)
62  {
63  this->overallDistance=overallDistance;
64  }
65 
66  inline void SetCurrentMaxDistance(const Distance &currentMaxDistance)
67  {
68  this->currentMaxDistance=currentMaxDistance;
69  }
70 
71  inline Distance GetOverallDistance() const
72  {
73  return overallDistance;
74  }
75 
76  inline Distance GetCurrentMaxDistance() const
77  {
78  return currentMaxDistance;
79  }
80 
81  inline RouteData& GetRoute()
82  {
83  return route;
84  }
85 
86  inline const RouteData& GetRoute() const
87  {
88  return route;
89  }
90 
91  inline bool Success() const
92  {
93  return !route.IsEmpty();
94  }
95  };
96 
98  {
99  const std::vector<Point> points;
100 
101  explicit RoutePoints(const std::list<Point>& points);
102  };
103 
104  using RoutePointsRef = std::shared_ptr<RoutePoints>;
105 
106  class OSMSCOUT_API RoutePointsResult CLASS_FINAL
107  {
108  private:
109  bool success;
110  RoutePointsRef points;
111 
112  public:
113  RoutePointsResult();
114  explicit RoutePointsResult(const RoutePointsRef& points);
115 
116  inline bool Success() const
117  {
118  return success;
119  }
120 
121  inline RoutePointsRef GetPoints() const
122  {
123  return points;
124  }
125  };
126 
127  class OSMSCOUT_API RouteDescriptionResult CLASS_FINAL
128  {
129  private:
130  bool success;
131  RouteDescriptionRef description;
132 
133  public:
134  RouteDescriptionResult();
135  explicit RouteDescriptionResult(const RouteDescriptionRef& description);
136 
137  inline bool Success() const
138  {
139  return success;
140  }
141 
143  {
144  return description;
145  }
146  };
147 
148  class OSMSCOUT_API RouteWayResult CLASS_FINAL
149  {
150  private:
151  bool success;
152  WayRef way;
153 
154  public:
155  RouteWayResult();
156  explicit RouteWayResult(const WayRef& way);
157 
158  inline bool Success() const
159  {
160  return success;
161  }
162 
163  inline WayRef GetWay() const
164  {
165  return way;
166  }
167  };
168 
174  template <class RoutingState>
176  {
177  protected:
179 
180  protected:
181  virtual Vehicle GetVehicle(const RoutingState& state) = 0;
182 
183  virtual bool CanUse(const RoutingState& state,
184  DatabaseId database,
185  const RouteNode& routeNode,
186  size_t pathIndex) = 0;
187 
188  virtual bool CanUseForward(const RoutingState& state,
189  const DatabaseId& database,
190  const WayRef& way) = 0;
191 
192  virtual bool CanUseBackward(const RoutingState& state,
193  const DatabaseId& database,
194  const WayRef& way) = 0;
195 
196  virtual double GetCosts(const RoutingState& state,
197  DatabaseId database,
198  const RouteNode& routeNode,
199  size_t inPathIndex,
200  size_t outPathIndex) = 0;
201 
202  virtual double GetCosts(const RoutingState& state,
203  DatabaseId database,
204  const WayRef &way,
205  const Distance &wayLength) = 0;
206 
207  virtual double GetEstimateCosts(const RoutingState& state,
208  DatabaseId database,
209  const Distance &targetDistance) = 0;
210 
211  virtual double GetCostLimit(const RoutingState& state,
212  DatabaseId database,
213  const Distance &targetDistance) = 0;
214 
215  virtual std::string GetCostString(const RoutingState& state,
216  DatabaseId database,
217  double cost) const = 0;
218 
219  virtual bool GetRouteNodes(const std::set<DBId> &routeNodeIds,
220  std::unordered_map<DBId,RouteNodeRef> &routeNodeMap) = 0;
221 
231  virtual bool GetRouteNode(const DBId &id,
232  RouteNodeRef &node) = 0;
233 
234  virtual bool GetWayByOffset(const DBFileOffset &offset,
235  WayRef &way) = 0;
236 
237  virtual bool GetWaysByOffset(const std::set<DBFileOffset> &wayOffsets,
238  std::unordered_map<DBFileOffset,WayRef> &wayMap) = 0;
239 
240  virtual bool GetAreaByOffset(const DBFileOffset &offset,
241  AreaRef &area) = 0;
242 
243  virtual bool GetAreasByOffset(const std::set<DBFileOffset> &areaOffsets,
244  std::unordered_map<DBFileOffset,AreaRef> &areaMap) = 0;
245 
246  void ResolveRNodeChainToList(DBId finalRouteNode,
247  const ClosedSet& closedSet,
248  const ClosedSet& closedRestrictedSet,
249  std::list<VNode>& nodes);
250 
251  virtual bool ResolveRouteDataJunctions(RouteData& route) = 0;
252 
253  virtual std::vector<DBId> GetNodeTwins(const RoutingState& state,
254  DatabaseId database,
255  Id id) = 0;
256 
257  void GetStartForwardRouteNode(const RoutingState& state,
258  const DatabaseId& database,
259  const WayRef& way,
260  size_t nodeIndex,
261  RouteNodeRef& routeNode,
262  size_t& routeNodeIndex);
263  void GetStartBackwardRouteNode(const RoutingState& state,
264  const DatabaseId& database,
265  const WayRef& way,
266  size_t nodeIndex,
267  RouteNodeRef& routeNode,
268  size_t& routeNodeIndex);
269  void GetTargetForwardRouteNode(const RoutingState& state,
270  const DatabaseId& database,
271  const WayRef& way,
272  size_t nodeIndex,
273  RouteNodeRef& routeNode);
274  void GetTargetBackwardRouteNode(const RoutingState& state,
275  const DatabaseId& database,
276  const WayRef& way,
277  size_t nodeIndex,
278  RouteNodeRef& routeNode);
279 
280  bool GetStartNodes(const RoutingState& state,
281  const RoutePosition& position,
282  GeoCoord& startCoord,
283  const GeoCoord& targetCoord,
284  RouteNodeRef& forwardRouteNode,
285  RouteNodeRef& backwardRouteNode,
286  RNodeRef& forwardRNode,
287  RNodeRef& backwardRNode);
288 
289  bool GetWayTargetNodes(const RoutingState& state,
290  const RoutePosition& position,
291  GeoCoord& targetCoord,
292  RouteNodeRef& forwardNode,
293  RouteNodeRef& backwardNode);
294 
295  bool GetTargetNodes(const RoutingState& state,
296  const RoutePosition& position,
297  GeoCoord& targetCoord,
298  RouteNodeRef& forwardNode,
299  RouteNodeRef& backwardNode);
300 
301  bool GetRNode(const RoutingState& state,
302  const RoutePosition& position,
303  const WayRef& way,
304  size_t routeNodeIndex,
305  const RouteNodeRef& routeNode,
306  const GeoCoord& startCoord,
307  const GeoCoord& targetCoord,
308  RNodeRef& node);
309 
310  void AddNodes(RouteData& route,
311  DatabaseId database,
312  Id startNodeId,
313  size_t startNodeIndex,
314  const ObjectFileRef& object,
315  size_t idCount,
316  bool oneway,
317  size_t targetNodeIndex);
318 
319  bool GetWayStartNodes(const RoutingState& state,
320  const RoutePosition& position,
321  GeoCoord& startCoord,
322  const GeoCoord& targetCoord,
323  RouteNodeRef& forwardRouteNode,
324  RouteNodeRef& backwardRouteNode,
325  RNodeRef& forwardRNode,
326  RNodeRef& backwardRNode);
327 
328  bool ResolveRNodesToRouteData(const RoutingState& state,
329  const std::list<VNode>& nodes,
330  const RoutePosition& start,
331  const RoutePosition& target,
332  RouteData& route);
333 
334  virtual bool WalkToOtherDatabases(const RoutingState& state,
335  RNodeRef &current,
336  RouteNodeRef &currentRouteNode,
337  OpenList &openList,
338  OpenMap &openMap,
339  const ClosedSet &closedSet,
340  const ClosedSet &closedRestrictedSet);
341 
342  virtual bool WalkPaths(const RoutingState& state,
343  RNodeRef &current,
344  RouteNodeRef &currentRouteNode,
345  OpenList &openList,
346  OpenMap &openMap,
347  ClosedSet &closedSet,
348  ClosedSet &closedRestrictedSet,
349  RoutingResult &result,
350  const RoutingParameter& parameter,
351  const GeoCoord &targetCoord,
352  const Vehicle &vehicle,
353  size_t &nodesIgnoredCount,
354  Distance &currentMaxDistance,
355  const Distance &overallDistance,
356  const double &costLimit);
357  public:
358  explicit AbstractRoutingService(const RouterParameter& parameter);
359  ~AbstractRoutingService() override;
360 
361  RoutingResult CalculateRoute(RoutingState& state,
362  const RoutePosition& start,
363  const RoutePosition& target,
364  const RoutingParameter& parameter);
365 
366  RouteDescriptionResult TransformRouteDataToRouteDescription(const RouteData& data);
367  RoutePointsResult TransformRouteDataToPoints(const RouteData& data);
368  RouteWayResult TransformRouteDataToWay(const RouteData& data);
369 
376  virtual std::map<DatabaseId, std::string> GetDatabaseMapping() const = 0;
377  };
378 
379 }
380 
381 #endif /* OSMSCOUT_ABSTRACTROUTINGSERVICE_H */
bool debugPerformance
Definition: AbstractRoutingService.h:178
RouteData & GetRoute()
Definition: AbstractRoutingService.h:81
void SetCurrentMaxDistance(const Distance &currentMaxDistance)
Definition: AbstractRoutingService.h:66
uint64_t Id
Definition: OSMScoutTypes.h:41
Definition: AbstractRoutingService.h:97
Distance GetCurrentMaxDistance() const
Definition: AbstractRoutingService.h:76
std::unordered_set< VNode, ClosedNodeHasher > ClosedSet
Definition: RoutingService.h:368
Definition: Area.h:86
WayRef GetWay() const
Definition: AbstractRoutingService.h:163
Vehicle
Definition: OSMScoutTypes.h:55
std::shared_ptr< Way > WayRef
Definition: Way.h:202
Definition: RouteData.h:35
bool Success() const
Definition: AbstractRoutingService.h:91
const RouteData & GetRoute() const
Definition: AbstractRoutingService.h:86
std::shared_ptr< RoutePoints > RoutePointsRef
Definition: AbstractRoutingService.h:104
const std::vector< Point > points
Definition: AbstractRoutingService.h:99
Definition: Area.h:38
std::unordered_map< DBId, OpenListRef > OpenMap
Definition: RoutingService.h:367
#define CLASS_FINAL
Definition: Compiler.h:26
std::shared_ptr< Area > AreaRef
Definition: Area.h:358
#define OSMSCOUT_API
Definition: CoreImportExport.h:45
std::shared_ptr< RNode > RNodeRef
Definition: RoutingService.h:272
Definition: AbstractRoutingService.h:175
RouteDescriptionRef GetDescription() const
Definition: AbstractRoutingService.h:142
Definition: RoutingService.h:211
std::shared_ptr< RouteNode > RouteNodeRef
Definition: RouteNode.h:160
std::set< RNodeRef, RNodeCostCompare > OpenList
Definition: RoutingService.h:364
void SetOverallDistance(const Distance &overallDistance)
Definition: AbstractRoutingService.h:61
RoutePointsRef GetPoints() const
Definition: AbstractRoutingService.h:121
std::shared_ptr< RouteDescription > RouteDescriptionRef
Definition: RouteDescription.h:814
Definition: DBFileOffset.h:38
Definition: DBFileOffset.h:92
Distance GetOverallDistance() const
Definition: AbstractRoutingService.h:71
Definition: RouteNode.h:61
uint32_t DatabaseId
Definition: DBFileOffset.h:30