libosmscout 1.1.1
Loading...
Searching...
No Matches
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/lib/CoreFeatures.h>
32
33#include <osmscout/TypeConfig.h>
34#include <osmscout/Point.h>
35#include <osmscout/Pixel.h>
36
42
43namespace osmscout {
44
52 class OSMSCOUT_API RoutingResult CLASS_FINAL
53 {
54 private:
55 RouteData route;
56 Distance currentMaxDistance;
57 Distance overallDistance;
58 std::vector<int> sectionLengths;
59
60 public:
62
63 void SetOverallDistance(const Distance &overallDistance)
64 {
65 this->overallDistance=overallDistance;
66 }
67
68 void SetCurrentMaxDistance(const Distance &currentMaxDistance)
69 {
70 this->currentMaxDistance=currentMaxDistance;
71 }
72
73 Distance GetOverallDistance() const
74 {
75 return overallDistance;
76 }
77
78 Distance GetCurrentMaxDistance() const
79 {
80 return currentMaxDistance;
81 }
82
84 {
85 return route;
86 }
87
88 const RouteData& GetRoute() const
89 {
90 return route;
91 }
92
93 bool Success() const
94 {
95 return !route.IsEmpty();
96 }
97
98 const std::vector<int>& GetSectionLenghts() const
99 {
100 return sectionLengths;
101 }
102
103 void AppendSectionLength(int length)
104 {
105 this->sectionLengths.push_back(length);
106 }
107
109 {
110 this->sectionLengths.clear();
111 }
112 };
113
115 {
116 const std::vector<Point> points;
117
118 explicit RoutePoints(const std::list<Point>& points);
119 };
120
121 using RoutePointsRef = std::shared_ptr<RoutePoints>;
122
123 class OSMSCOUT_API RoutePointsResult CLASS_FINAL
124 {
125 private:
126 bool success;
127 RoutePointsRef points;
128
129 public:
131 explicit RoutePointsResult(const RoutePointsRef& points);
132
133 bool Success() const
134 {
135 return success;
136 }
137
139 {
140 return points;
141 }
142 };
143
144 class OSMSCOUT_API RouteDescriptionResult CLASS_FINAL
145 {
146 private:
147 bool success;
148 RouteDescriptionRef description;
149
150 public:
152 explicit RouteDescriptionResult(const RouteDescriptionRef& description);
153
154 bool Success() const
155 {
156 return success;
157 }
158
160 {
161 return description;
162 }
163 };
164
165 class OSMSCOUT_API RouteWayResult CLASS_FINAL
166 {
167 private:
168 bool success;
169 WayRef way;
170
171 public:
173 explicit RouteWayResult(const WayRef& way);
174
175 bool Success() const
176 {
177 return success;
178 }
179
181 {
182 return way;
183 }
184 };
185
191 template <class RoutingState>
193 {
194 protected:
196
197 protected:
198 virtual Vehicle GetVehicle(const RoutingState& state) = 0;
199
200 virtual bool CanUse(const RoutingState& state,
201 DatabaseId database,
202 const RouteNode& routeNode,
203 size_t pathIndex) = 0;
204
205 virtual bool CanUseForward(const RoutingState& state,
206 const DatabaseId& database,
207 const WayRef& way) = 0;
208
209 virtual bool CanUseBackward(const RoutingState& state,
210 const DatabaseId& database,
211 const WayRef& way) = 0;
212
213 virtual double GetCosts(const RoutingState& state,
214 DatabaseId database,
215 const RouteNode& routeNode,
216 size_t inPathIndex,
217 size_t outPathIndex) = 0;
218
219 virtual double GetUTurnCost(const RoutingState& state, const DatabaseId databaseId) = 0;
220
221 virtual double GetCosts(const RoutingState& state,
222 DatabaseId database,
223 const WayRef &way,
224 const Distance &wayLength) = 0;
225
226 virtual double GetEstimateCosts(const RoutingState& state,
227 DatabaseId database,
228 const Distance &targetDistance) = 0;
229
230 virtual double GetCostLimit(const RoutingState& state,
231 DatabaseId database,
232 const Distance &targetDistance) = 0;
233
234 virtual std::string GetCostString(const RoutingState& state,
235 DatabaseId database,
236 double cost) const = 0;
237
238 virtual bool GetRouteNodes(const std::set<DBId> &routeNodeIds,
239 std::unordered_map<DBId,RouteNodeRef> &routeNodeMap) = 0;
240
250 virtual bool GetRouteNode(const DBId &id,
251 RouteNodeRef &node) = 0;
252
253 virtual bool GetWayByOffset(const DBFileOffset &offset,
254 WayRef &way) = 0;
255
256 virtual bool GetWaysByOffset(const std::set<DBFileOffset> &wayOffsets,
257 std::unordered_map<DBFileOffset,WayRef> &wayMap) = 0;
258
259 virtual bool GetAreaByOffset(const DBFileOffset &offset,
260 AreaRef &area) = 0;
261
262 virtual bool GetAreasByOffset(const std::set<DBFileOffset> &areaOffsets,
263 std::unordered_map<DBFileOffset,AreaRef> &areaMap) = 0;
264
265 void ResolveRNodeChainToList(const RNode &finalRouteNode,
266 const ClosedSet& closedSet,
267 std::list<VNode>& nodes);
268
269 virtual bool ResolveRouteDataJunctions(RouteData& route) = 0;
270
271 virtual std::vector<DBId> GetNodeTwins(const RoutingState& state,
272 DatabaseId database,
273 Id id) = 0;
274
275 void GetStartForwardRouteNode(const RoutingState& state,
276 const DatabaseId& database,
277 const WayRef& way,
278 size_t nodeIndex,
279 RouteNodeRef& routeNode,
280 size_t& routeNodeIndex);
281 void GetStartBackwardRouteNode(const RoutingState& state,
282 const DatabaseId& database,
283 const WayRef& way,
284 size_t nodeIndex,
285 RouteNodeRef& routeNode,
286 size_t& routeNodeIndex);
287 void GetTargetForwardRouteNode(const RoutingState& state,
288 const DatabaseId& database,
289 const WayRef& way,
290 size_t nodeIndex,
291 RouteNodeRef& routeNode);
292 void GetTargetBackwardRouteNode(const RoutingState& state,
293 const DatabaseId& database,
294 const WayRef& way,
295 size_t nodeIndex,
296 RouteNodeRef& routeNode);
297
298 bool GetStartNodes(const RoutingState& state,
299 const RoutePosition& position,
300 GeoCoord& startCoord,
301 const GeoCoord& targetCoord,
302 RouteNodeRef& forwardRouteNode,
303 RouteNodeRef& backwardRouteNode,
304 RNodeRef& forwardRNode,
305 RNodeRef& backwardRNode);
306
307 bool GetWayTargetNodes(const RoutingState& state,
308 const RoutePosition& position,
309 GeoCoord& targetCoord,
310 RouteNodeRef& forwardNode,
311 RouteNodeRef& backwardNode);
312
313 bool GetTargetNodes(const RoutingState& state,
314 const RoutePosition& position,
315 GeoCoord& targetCoord,
316 RouteNodeRef& forwardNode,
317 RouteNodeRef& backwardNode);
318
319 bool GetRNode(const RoutingState& state,
320 const RoutePosition& position,
321 const WayRef& way,
322 size_t routeNodeIndex,
323 const RouteNodeRef& routeNode,
324 const GeoCoord& startCoord,
325 const GeoCoord& targetCoord,
326 RNodeRef& node);
327
328 void AddNodes(RouteData& route,
329 DatabaseId database,
330 Id startNodeId,
331 size_t startNodeIndex,
332 const ObjectFileRef& object,
333 size_t idCount,
334 bool oneway,
335 size_t targetNodeIndex);
336
337 bool GetWayStartNodes(const RoutingState& state,
338 const RoutePosition& position,
339 GeoCoord& startCoord,
340 const GeoCoord& targetCoord,
341 RouteNodeRef& forwardRouteNode,
342 RouteNodeRef& backwardRouteNode,
343 RNodeRef& forwardRNode,
344 RNodeRef& backwardRNode);
345
346 bool ResolveRNodesToRouteData(const RoutingState& state,
347 const std::list<VNode>& nodes,
348 const RoutePosition& start,
349 const RoutePosition& target,
350 RouteData& route);
351
352 virtual bool WalkToOtherDatabases(const RoutingState& state,
353 RNodeRef &current,
354 RouteNodeRef &currentRouteNode,
355 OpenList &openList,
356 OpenMap &openMap,
357 const ClosedSet &closedSet);
358
359 virtual bool WalkPaths(const RoutingState& state,
360 RNodeRef &current,
361 RouteNodeRef &currentRouteNode,
362 OpenList &openList,
363 OpenMap &openMap,
364 ClosedSet &closedSet,
365 RoutingResult &result,
366 const RoutingParameter& parameter,
367 const GeoCoord &targetCoord,
368 const Vehicle &vehicle,
369 size_t &nodesIgnoredCount,
370 Distance &currentMaxDistance,
371 const Distance &overallDistance,
372 const double &costLimit);
373
374 bool RestrictInitialUTurn(const RoutingState& state,
375 const Bearing& vehicleBearing,
376 const RoutePosition& start,
377 RNodeRef startForwardNode,
378 RNodeRef startBackwardNode);
379
380 public:
381 explicit AbstractRoutingService(const RouterParameter& parameter);
383
384 RoutingResult CalculateRoute(RoutingState& state,
385 const RoutePosition& start,
386 const RoutePosition& target,
387 const std::optional<osmscout::Bearing> &bearing,
388 const RoutingParameter& parameter);
389
390 RouteDescriptionResult TransformRouteDataToRouteDescription(const RouteData& data);
391 RoutePointsResult TransformRouteDataToPoints(const RouteData& data);
392 RouteWayResult TransformRouteDataToWay(const RouteData& data);
393
400 virtual std::map<DatabaseId, std::string> GetDatabaseMapping() const = 0;
401 };
402
403}
404
405#endif /* OSMSCOUT_ABSTRACTROUTINGSERVICE_H */
#define CLASS_FINAL
Definition Compiler.h:26
#define OSMSCOUT_API
Definition CoreImportExport.h:45
virtual double GetUTurnCost(const RoutingState &state, const DatabaseId databaseId)=0
RoutePointsResult TransformRouteDataToPoints(const RouteData &data)
bool RestrictInitialUTurn(const RoutingState &state, const Bearing &vehicleBearing, const RoutePosition &start, RNodeRef startForwardNode, RNodeRef startBackwardNode)
virtual bool GetRouteNodes(const std::set< DBId > &routeNodeIds, std::unordered_map< DBId, RouteNodeRef > &routeNodeMap)=0
bool GetTargetNodes(const RoutingState &state, const RoutePosition &position, GeoCoord &targetCoord, RouteNodeRef &forwardNode, RouteNodeRef &backwardNode)
RoutingResult CalculateRoute(RoutingState &state, const RoutePosition &start, const RoutePosition &target, const std::optional< osmscout::Bearing > &bearing, const RoutingParameter &parameter)
virtual bool ResolveRouteDataJunctions(RouteData &route)=0
virtual bool WalkToOtherDatabases(const RoutingState &state, RNodeRef &current, RouteNodeRef &currentRouteNode, OpenList &openList, OpenMap &openMap, const ClosedSet &closedSet)
bool debugPerformance
Definition AbstractRoutingService.h:195
virtual double GetCosts(const RoutingState &state, DatabaseId database, const WayRef &way, const Distance &wayLength)=0
virtual bool CanUseForward(const RoutingState &state, const DatabaseId &database, const WayRef &way)=0
void GetTargetBackwardRouteNode(const RoutingState &state, const DatabaseId &database, const WayRef &way, size_t nodeIndex, RouteNodeRef &routeNode)
virtual bool CanUseBackward(const RoutingState &state, const DatabaseId &database, const WayRef &way)=0
bool GetRNode(const RoutingState &state, const RoutePosition &position, const WayRef &way, size_t routeNodeIndex, const RouteNodeRef &routeNode, const GeoCoord &startCoord, const GeoCoord &targetCoord, RNodeRef &node)
RouteWayResult TransformRouteDataToWay(const RouteData &data)
virtual std::string GetCostString(const RoutingState &state, DatabaseId database, double cost) const =0
virtual bool CanUse(const RoutingState &state, DatabaseId database, const RouteNode &routeNode, size_t pathIndex)=0
virtual std::vector< DBId > GetNodeTwins(const RoutingState &state, DatabaseId database, Id id)=0
virtual bool GetWaysByOffset(const std::set< DBFileOffset > &wayOffsets, std::unordered_map< DBFileOffset, WayRef > &wayMap)=0
void GetStartBackwardRouteNode(const RoutingState &state, const DatabaseId &database, const WayRef &way, size_t nodeIndex, RouteNodeRef &routeNode, size_t &routeNodeIndex)
virtual double GetCosts(const RoutingState &state, DatabaseId database, const RouteNode &routeNode, size_t inPathIndex, size_t outPathIndex)=0
RouteDescriptionResult TransformRouteDataToRouteDescription(const RouteData &data)
void GetTargetForwardRouteNode(const RoutingState &state, const DatabaseId &database, const WayRef &way, size_t nodeIndex, RouteNodeRef &routeNode)
virtual bool GetRouteNode(const DBId &id, RouteNodeRef &node)=0
AbstractRoutingService(const RouterParameter &parameter)
bool GetWayTargetNodes(const RoutingState &state, const RoutePosition &position, GeoCoord &targetCoord, RouteNodeRef &forwardNode, RouteNodeRef &backwardNode)
void GetStartForwardRouteNode(const RoutingState &state, const DatabaseId &database, const WayRef &way, size_t nodeIndex, RouteNodeRef &routeNode, size_t &routeNodeIndex)
virtual bool WalkPaths(const RoutingState &state, RNodeRef &current, RouteNodeRef &currentRouteNode, OpenList &openList, OpenMap &openMap, ClosedSet &closedSet, RoutingResult &result, const RoutingParameter &parameter, const GeoCoord &targetCoord, const Vehicle &vehicle, size_t &nodesIgnoredCount, Distance &currentMaxDistance, const Distance &overallDistance, const double &costLimit)
void AddNodes(RouteData &route, DatabaseId database, Id startNodeId, size_t startNodeIndex, const ObjectFileRef &object, size_t idCount, bool oneway, size_t targetNodeIndex)
virtual double GetCostLimit(const RoutingState &state, DatabaseId database, const Distance &targetDistance)=0
virtual bool GetWayByOffset(const DBFileOffset &offset, WayRef &way)=0
bool ResolveRNodesToRouteData(const RoutingState &state, const std::list< VNode > &nodes, const RoutePosition &start, const RoutePosition &target, RouteData &route)
bool GetStartNodes(const RoutingState &state, const RoutePosition &position, GeoCoord &startCoord, const GeoCoord &targetCoord, RouteNodeRef &forwardRouteNode, RouteNodeRef &backwardRouteNode, RNodeRef &forwardRNode, RNodeRef &backwardRNode)
virtual std::map< DatabaseId, std::string > GetDatabaseMapping() const =0
virtual double GetEstimateCosts(const RoutingState &state, DatabaseId database, const Distance &targetDistance)=0
virtual bool GetAreaByOffset(const DBFileOffset &offset, AreaRef &area)=0
bool GetWayStartNodes(const RoutingState &state, const RoutePosition &position, GeoCoord &startCoord, const GeoCoord &targetCoord, RouteNodeRef &forwardRouteNode, RouteNodeRef &backwardRouteNode, RNodeRef &forwardRNode, RNodeRef &backwardRNode)
void ResolveRNodeChainToList(const RNode &finalRouteNode, const ClosedSet &closedSet, std::list< VNode > &nodes)
virtual Vehicle GetVehicle(const RoutingState &state)=0
virtual bool GetAreasByOffset(const std::set< DBFileOffset > &areaOffsets, std::unordered_map< DBFileOffset, AreaRef > &areaMap)=0
Definition Area.h:88
bool Success() const
Definition AbstractRoutingService.h:93
RouteDescriptionRef GetDescription() const
Definition AbstractRoutingService.h:159
void ClearSectionLengths()
Definition AbstractRoutingService.h:108
RouteWayResult(const WayRef &way)
void SetCurrentMaxDistance(const Distance &currentMaxDistance)
Definition AbstractRoutingService.h:68
Distance GetCurrentMaxDistance() const
Definition AbstractRoutingService.h:78
Distance GetOverallDistance() const
Definition AbstractRoutingService.h:73
RoutePointsRef GetPoints() const
Definition AbstractRoutingService.h:138
void SetOverallDistance(const Distance &overallDistance)
Definition AbstractRoutingService.h:63
WayRef GetWay() const
Definition AbstractRoutingService.h:180
RouteData & GetRoute()
Definition AbstractRoutingService.h:83
void AppendSectionLength(int length)
Definition AbstractRoutingService.h:103
const std::vector< int > & GetSectionLenghts() const
Definition AbstractRoutingService.h:98
const RouteData & GetRoute() const
Definition AbstractRoutingService.h:88
RouteDescriptionResult(const RouteDescriptionRef &description)
RoutePointsResult(const RoutePointsRef &points)
Definition RouteData.h:36
Definition RouteNode.h:62
std::unordered_set< VNode, ClosedNodeHasher > ClosedSet
Definition RoutingService.h:389
std::unordered_map< DBId, OpenListRef > OpenMap
Definition RoutingService.h:388
std::shared_ptr< RNode > RNodeRef
Definition RoutingService.h:279
std::set< RNodeRef, RNodeCostCompare > OpenList
Definition RoutingService.h:385
uint64_t Id
Definition OSMScoutTypes.h:40
Definition Area.h:39
std::shared_ptr< Way > WayRef
Definition Way.h:213
std::shared_ptr< Area > AreaRef
Definition Area.h:360
std::shared_ptr< RoutePoints > RoutePointsRef
Definition AbstractRoutingService.h:121
uint32_t DatabaseId
Definition DBFileOffset.h:30
std::shared_ptr< RouteNode > RouteNodeRef
Definition RouteNode.h:177
std::shared_ptr< RouteDescription > RouteDescriptionRef
Definition RouteDescription.h:834
Vehicle
Definition OSMScoutTypes.h:55
Definition DBFileOffset.h:93
Definition DBFileOffset.h:39
const std::vector< Point > points
Definition AbstractRoutingService.h:116
RoutePoints(const std::list< Point > &points)
Definition RoutingService.h:222