libosmscout 1.1.1
Loading...
Searching...
No Matches
RoutePostprocessor.h
Go to the documentation of this file.
1#ifndef OSMSCOUT_ROUTEPOSTPROCESSOR_H
2#define OSMSCOUT_ROUTEPOSTPROCESSOR_H
3
4/*
5 This source is part of the libosmscout library
6 Copyright (C) 2012 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 <map>
25#include <memory>
26#include <unordered_map>
27
28#include <osmscout/lib/CoreFeatures.h>
29
30#include <osmscout/TypeConfig.h>
31
39
40#include <osmscout/util/Time.h>
41
42// Database
44
45// Routing
49
50namespace osmscout {
51
63 {
64 public:
71 {
72 public:
73 virtual ~Postprocessor() = default;
74
75 virtual bool Process(const RoutePostprocessor& postprocessor,
76 RouteDescription& description) = 0;
77 };
78
79 using PostprocessorRef = std::shared_ptr<Postprocessor>;
80
86 {
87 private:
88 std::string startDescription;
89
90 public:
91 explicit StartPostprocessor(const std::string& startDescription);
92
93 bool Process(const RoutePostprocessor& postprocessor,
94 RouteDescription& description) override;
95 };
96
102 {
103 private:
104 std::string targetDescription;
105
106 public:
107 explicit TargetPostprocessor(const std::string& targetDescription);
108
109 bool Process(const RoutePostprocessor& postprocessor,
110 RouteDescription& description) override;
111 };
112
118 {
119 public:
121
122 bool Process(const RoutePostprocessor& postprocessor,
123 RouteDescription& description) override;
124 };
125
131 {
132 public:
134
135 bool Process(const RoutePostprocessor& postprocessor,
136 RouteDescription& description) override;
137 };
138
144 {
145 public:
147
148 bool Process(const RoutePostprocessor& postprocessor,
149 RouteDescription& description) override;
150 };
151
157 {
158 private:
159 void AddCrossingWaysDescriptions(const RoutePostprocessor& postprocessor,
161 const RouteDescription::Node& node,
162 const ObjectFileRef& originObject,
163 const ObjectFileRef& targetObject);
164
165 public:
167
168 bool Process(const RoutePostprocessor& postprocessor,
169 RouteDescription& description) override;
170 };
171
177 {
178 private:
179 static const double curveMinInitialAngle;
180 static const double curveMaxInitialAngle;
181 static const Distance curveMaxNodeDistance;
182 static const Distance curveMaxDistance;
183 static const double curveMinAngle;
184
185 public:
187
188 bool Process(const RoutePostprocessor& postprocessor,
189 RouteDescription& description) override;
190 };
191
197 {
198 public:
200
201 bool Process(const RoutePostprocessor& postprocessor,
202 RouteDescription& description) override;
203 };
204
210 {
211 public:
213
214 bool Process(const RoutePostprocessor& postprocessor,
215 RouteDescription& description) override;
216 };
217
223 {
224 public:
226
227 bool Process(const RoutePostprocessor& postprocessor,
228 RouteDescription& description) override;
229 };
230
236 {
237 private:
238 enum State {
239 street,
240 roundabout,
241 motorway,
242 link
243 };
244
245 struct NodeExit {
246 ObjectFileRef ref;
247 size_t node;
248 Bearing bearing;
249 bool canBeUsedAsExit;
250 };
251
252 private:
253
254 bool inRoundabout{false};
255 size_t roundaboutCrossingCounter{0};
256 bool roundaboutClockwise{false};
257
258 private:
259 State GetInitialState(const RoutePostprocessor& postprocessor,
261
262 void HandleRoundaboutEnter(const RoutePostprocessor& postprocessor, RouteDescription::Node& node);
263 void HandleRoundaboutNode(RouteDescription::Node& node);
264 void HandleRoundaboutLeave(RouteDescription::Node& node);
265 void HandleMiniRoundabout(const RoutePostprocessor& postprocessor,
267 ObjectFileRef incomingPath,
268 size_t incomingNode);
269
270 void HandleDirectMotorwayEnter(RouteDescription::Node& node,
272 void HandleDirectMotorwayLeave(RouteDescription::Node& node,
274 void HandleMotorwayLink(const RoutePostprocessor& postprocessor,
275 const RouteDescription::NameDescriptionRef &originName,
276 const std::list<RouteDescription::Node>::const_iterator &lastNode,
277 const std::list<RouteDescription::Node>::iterator &node,
278 const std::list<RouteDescription::Node>::const_iterator &end);
279 bool HandleNameChange(std::list<RouteDescription::Node>::const_iterator& lastNode,
280 std::list<RouteDescription::Node>::iterator& node,
281 const std::list<RouteDescription::Node>::const_iterator &end);
282 bool HandleDirectionChange(const RoutePostprocessor& postprocessor,
283 const std::list<RouteDescription::Node>::iterator& node,
284 const std::list<RouteDescription::Node>::const_iterator& end);
285 std::vector<NodeExit> CollectNodeWays(const RoutePostprocessor& postprocessor,
287 bool exitsOnly);
288
289 // just ways are supported as exits
290 inline std::vector<NodeExit> CollectNodeExits(const RoutePostprocessor& postprocessor,
292 {
293 return CollectNodeWays(postprocessor, node, true);
294 }
295
296 public:
297 bool Process(const RoutePostprocessor& postprocessor,
298 RouteDescription& description) override;
299
300 };
301
302 using InstructionPostprocessorRef = std::shared_ptr<InstructionPostprocessor>;
303
309 {
310 private:
311 struct POIAtRoute
312 {
313 ObjectFileRef object;
315 Distance distance;
316 std::list<RouteDescription::Node>::iterator node;
317 };
318
319 private:
320 std::set<ObjectFileRef> CollectPaths(const std::list<RouteDescription::Node>& nodes) const;
321 std::list<WayRef> CollectWays(const RoutePostprocessor& postprocessor,
322 const std::list<RouteDescription::Node>& nodes) const;
323 std::list<AreaRef> CollectAreas(const RoutePostprocessor& postprocessor,
324 const std::list<RouteDescription::Node>& nodes) const;
325 std::map<ObjectFileRef,std::set<ObjectFileRef>> CollectPOICandidates(const Database& database,
326 const std::set<ObjectFileRef>& paths,
327 const std::list<WayRef>& ways,
328 const std::list<AreaRef>& areas);
329 std::map<ObjectFileRef,POIAtRoute> AnalysePOICandidates(const RoutePostprocessor& postprocessor,
330 const DatabaseId& databaseId,
331 std::list<RouteDescription::Node>& nodes,
332 const TypeInfoSet& nodeTypes,
333 const TypeInfoSet& areaTypes,
334 const std::unordered_map<FileOffset,NodeRef>& nodeMap,
335 const std::unordered_map<FileOffset,AreaRef>& areaMap,
336 const std::map<ObjectFileRef,std::set<ObjectFileRef>>& poiCandidates);
337 void SortInCollectedPOIs(const DatabaseId& databaseId,
338 const std::map<ObjectFileRef,POIAtRoute>& pois);
339
340 public:
341 POIsPostprocessor() = default;
342
343 bool Process(const RoutePostprocessor& postprocessor,
344 RouteDescription& description) override;
345 };
346
347 using POIsPostprocessorRef = std::shared_ptr<POIsPostprocessor>;
348
354 {
355 public:
357
358 bool Process(const RoutePostprocessor& postprocessor,
359 RouteDescription& description) override;
360 };
361
362 using LanesPostprocessorRef = std::shared_ptr<LanesPostprocessor>;
363
370 {
371 public:
372 explicit SuggestedLanesPostprocessor(const Distance &distanceBefore=Meters(500)) :
373 Postprocessor(), distanceBefore(distanceBefore) {};
374
375 bool Process(const RoutePostprocessor& postprocessor,
376 RouteDescription& description) override;
377 private:
378 Distance distanceBefore;
379 };
380
386 {
387 private:
388 std::vector<int> sectionLengths;
389 public:
390 explicit SectionsPostprocessor(const std::vector<int>& sectionLengths) : Postprocessor(), sectionLengths(sectionLengths) {};
391
392 bool Process(const RoutePostprocessor& postprocessor,
393 RouteDescription& description) override;
394 };
395
396 using SuggestedLanesPostprocessorRef = std::shared_ptr<SuggestedLanesPostprocessor>;
397
398 private:
399 std::vector<RoutingProfileRef> profiles;
400 std::vector<DatabaseRef> databases;
401
402 std::unordered_map<DBFileOffset,AreaRef> areaMap;
403 std::unordered_map<DBFileOffset,WayRef> wayMap;
404 std::unordered_map<DBFileOffset,NodeRef> nodeMap;
405
406 std::unordered_map<DatabaseId,NameFeatureValueReader*> nameReaders;
407 std::unordered_map<DatabaseId,RefFeatureValueReader*> refReaders;
408 std::unordered_map<DatabaseId,BridgeFeatureReader*> bridgeReaders;
409 std::unordered_map<DatabaseId,RoundaboutFeatureReader*> roundaboutReaders;
410 std::unordered_map<DatabaseId,ClockwiseDirectionFeatureReader*> clockwiseDirectionReaders;
411 std::unordered_map<DatabaseId,DestinationFeatureValueReader*> destinationReaders;
412 std::unordered_map<DatabaseId,MaxSpeedFeatureValueReader*> maxSpeedReaders;
413 std::unordered_map<DatabaseId,LanesFeatureValueReader*> lanesReaders;
414 std::unordered_map<DatabaseId,AccessFeatureValueReader*> accessReaders;
415
416 std::unordered_map<DatabaseId,TypeInfoSet> motorwayTypes;
417 std::unordered_map<DatabaseId,TypeInfoSet> motorwayLinkTypes;
418 std::unordered_map<DatabaseId,TypeInfoSet> junctionTypes;
419 std::unordered_map<DatabaseId,TypeInfoRef> miniRoundaboutTypes;
420
421 private:
422 bool ResolveAllPathObjects(const RouteDescription& description,
423 DatabaseId dbId,
424 Database& database);
425 void Cleanup();
426
427 private:
428 AreaRef GetArea(const DBFileOffset &offset) const;
429 WayRef GetWay(const DBFileOffset &offset) const;
430 NodeRef GetNode(const DBFileOffset &offset) const;
431
432 Duration GetTime(DatabaseId dbId,const Area& area,const Distance &deltaDistance) const;
433 Duration GetTime(DatabaseId dbId,const Way& way,const Distance &deltaDistance) const;
434
435 RouteDescription::NameDescriptionRef GetNameDescription(const RouteDescription::Node& node) const;
436 RouteDescription::NameDescriptionRef GetNameDescription(DatabaseId dbId,
437 const ObjectFileRef& object) const;
438 RouteDescription::NameDescriptionRef GetNameDescription(DatabaseId dbId,
439 const Node& node) const;
440 RouteDescription::NameDescriptionRef GetNameDescription(DatabaseId dbId,
441 const Area& area) const;
442 RouteDescription::NameDescriptionRef GetNameDescription(DatabaseId dbId,
443 const Way& way) const;
444
445 bool IsMotorwayLink(const RouteDescription::Node& node) const;
446 bool IsMotorway(const RouteDescription::Node& node) const;
447
448 bool IsMiniRoundabout(const RouteDescription::Node& node) const;
449 bool IsRoundabout(const RouteDescription::Node& node) const;
450 bool IsBridge(const RouteDescription::Node& node) const;
451
453
454 uint8_t GetMaxSpeed(const RouteDescription::Node& node) const;
455
457
458 Id GetNodeId(const RouteDescription::Node& node) const;
459
460 size_t GetNodeIndex(const RouteDescription::Node& node,
461 Id nodeId) const;
462
463 bool CanUseBackward(const DatabaseId& dbId,
464 Id fromNodeId,
465 const ObjectFileRef& object) const;
466
467 bool CanUseForward(const DatabaseId& dbId,
468 Id fromNodeId,
469 const ObjectFileRef& object) const;
470
471 bool IsBackwardPath(const ObjectFileRef& object,
472 size_t fromNodeIndex,
473 size_t toNodeIndex) const;
474
475 bool IsForwardPath(const ObjectFileRef& object,
476 size_t fromNodeIndex,
477 size_t toNodeIndex) const;
478
479 bool IsNodeStartOrEndOfObject(const RouteDescription::Node& node,
480 const ObjectFileRef& object) const;
481
482 GeoCoord GetCoordinates(const RouteDescription::Node& node,
483 size_t nodeIndex) const;
484
485 public:
486 /*
487 * TODO:
488 * All Postprocessors are allowed to use our internal methods currently.
489 * We should fix this by moving helper methods to a separate
490 * PostprocessorContext object that gets passed to the postprocessors explicitly.
491 * This would also move state out of the RoutePostprocessor itself.
492 */
494
496 const std::vector<RoutingProfileRef>& profiles,
497 const std::vector<DatabaseRef>& databases,
498 const std::list<PostprocessorRef>& processors,
499 const std::set<std::string,std::less<>>& motorwayTypeNames=std::set<std::string,std::less<>>(),
500 const std::set<std::string,std::less<>>& motorwayLinkTypeNames=std::set<std::string,std::less<>>(),
501 const std::set<std::string,std::less<>>& junctionTypeNames=std::set<std::string,std::less<>>(),
502 const std::string& miniRoundaboutTypeName="highway_mini_roundabout");
503 };
504}
505
506#endif
#define OSMSCOUT_API
Definition CoreImportExport.h:45
Definition RouteDescription.h:688
Definition RouteDescription.h:55
std::shared_ptr< CrossingWaysDescription > CrossingWaysDescriptionRef
Definition RouteDescription.h:256
std::shared_ptr< NameDescription > NameDescriptionRef
Definition RouteDescription.h:178
std::shared_ptr< LaneDescription > LaneDescriptionRef
Definition RouteDescription.h:629
std::shared_ptr< DestinationDescription > DestinationDescriptionRef
Definition RouteDescription.h:495
bool Process(const RoutePostprocessor &postprocessor, RouteDescription &description) override
bool Process(const RoutePostprocessor &postprocessor, RouteDescription &description) override
bool Process(const RoutePostprocessor &postprocessor, RouteDescription &description) override
bool Process(const RoutePostprocessor &postprocessor, RouteDescription &description) override
bool Process(const RoutePostprocessor &postprocessor, RouteDescription &description) override
bool Process(const RoutePostprocessor &postprocessor, RouteDescription &description) override
bool Process(const RoutePostprocessor &postprocessor, RouteDescription &description) override
bool Process(const RoutePostprocessor &postprocessor, RouteDescription &description) override
bool Process(const RoutePostprocessor &postprocessor, RouteDescription &description) override
Definition RoutePostprocessor.h:71
virtual bool Process(const RoutePostprocessor &postprocessor, RouteDescription &description)=0
SectionsPostprocessor(const std::vector< int > &sectionLengths)
Definition RoutePostprocessor.h:390
bool Process(const RoutePostprocessor &postprocessor, RouteDescription &description) override
StartPostprocessor(const std::string &startDescription)
bool Process(const RoutePostprocessor &postprocessor, RouteDescription &description) override
bool Process(const RoutePostprocessor &postprocessor, RouteDescription &description) override
SuggestedLanesPostprocessor(const Distance &distanceBefore=Meters(500))
Definition RoutePostprocessor.h:372
bool Process(const RoutePostprocessor &postprocessor, RouteDescription &description) override
TargetPostprocessor(const std::string &targetDescription)
bool Process(const RoutePostprocessor &postprocessor, RouteDescription &description) override
bool Process(const RoutePostprocessor &postprocessor, RouteDescription &description) override
Definition RoutePostprocessor.h:63
bool PostprocessRouteDescription(RouteDescription &description, const std::vector< RoutingProfileRef > &profiles, const std::vector< DatabaseRef > &databases, const std::list< PostprocessorRef > &processors, const std::set< std::string, std::less<> > &motorwayTypeNames=std::set< std::string, std::less<> >(), const std::set< std::string, std::less<> > &motorwayLinkTypeNames=std::set< std::string, std::less<> >(), const std::set< std::string, std::less<> > &junctionTypeNames=std::set< std::string, std::less<> >(), const std::string &miniRoundaboutTypeName="highway_mini_roundabout")
std::shared_ptr< LanesPostprocessor > LanesPostprocessorRef
Definition RoutePostprocessor.h:362
std::shared_ptr< Postprocessor > PostprocessorRef
Definition RoutePostprocessor.h:79
std::shared_ptr< InstructionPostprocessor > InstructionPostprocessorRef
Definition RoutePostprocessor.h:302
std::shared_ptr< SuggestedLanesPostprocessor > SuggestedLanesPostprocessorRef
Definition RoutePostprocessor.h:396
std::shared_ptr< POIsPostprocessor > POIsPostprocessorRef
Definition RoutePostprocessor.h:347
uint64_t Id
Definition OSMScoutTypes.h:40
Definition Area.h:39
Distance Meters(double m)
Definition Distance.h:358
std::shared_ptr< Way > WayRef
Definition Way.h:213
std::shared_ptr< Area > AreaRef
Definition Area.h:360
uint32_t DatabaseId
Definition DBFileOffset.h:30
std::shared_ptr< Node > NodeRef
Definition Node.h:125
Timestamp::duration Duration
Definition Time.h:29
Definition DBFileOffset.h:93