libosmscout 1.1.1
Loading...
Searching...
No Matches
RoutingProfile.h
Go to the documentation of this file.
1#ifndef OSMSCOUT_ROUTINGPROFILE_H
2#define OSMSCOUT_ROUTINGPROFILE_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 <map>
24#include <memory>
25#include <vector>
26#include <iostream>
27
29#include <osmscout/TypeConfig.h>
31
32#include <osmscout/Way.h>
33#include <osmscout/Area.h>
34
38
41
42#include <osmscout/util/Time.h>
44#include <osmscout/log/Logger.h>
45
46namespace osmscout {
47#ifdef OSMSCOUT_DEBUG_ROUTING
48constexpr bool debugRouting = true;
49#else
50constexpr bool debugRouting = false;
51#endif
52
57 enum Grade: uint8_t
58 {
64 };
65
71 {
73 std::array<double,5> speed{NAN, NAN, NAN, NAN, NAN};
74
75 const double& operator[](Grade grade) const
76 {
77 uint8_t i=static_cast<uint8_t>(grade);
78 assert(i>=1 && i<=5);
79 return speed[i-1];
80 }
81
82 double& operator[](Grade grade)
83 {
84 uint8_t i=static_cast<uint8_t>(grade);
85 assert(i>=1 && i<=5);
86 return speed[i-1];
87 }
88
94 {
95 double speedVal=0;
96 for (size_t i=0; i<5; ++i){
97 if (std::isnan(speed[i])){
98 speed[i]=speedVal;
99 } else {
100 speedVal=speed[i];
101 }
102 }
103 }
104
105 double Min() const
106 {
107 return *std::min_element(speed.begin(), speed.end());
108 }
109
110 double Max() const
111 {
112 return *std::max_element(speed.begin(), speed.end());
113 }
114
115 static SpeedVariant Fill(double speed)
116 {
117 return SpeedVariant({speed, speed, speed, speed, speed});
118 }
119 };
120
127 {
128 public:
129 virtual ~RoutingProfile() = default;
130
131 virtual Vehicle GetVehicle() const = 0;
132 virtual Distance GetCostLimitDistance() const = 0;
133 virtual double GetCostLimitFactor() const = 0;
134
135 virtual bool CanUse(const RouteNode& currentNode,
136 const std::vector<ObjectVariantData>& objectVariantData,
137 size_t pathIndex) const = 0;
138 virtual bool CanUse(const Area& area) const = 0;
139 virtual bool CanUse(const Way& way) const = 0;
140 virtual bool CanUseForward(const Way& way) const = 0;
141 virtual bool CanUseBackward(const Way& way) const = 0;
142
147 virtual double GetCosts(const RouteNode& currentNode,
148 const std::vector<ObjectVariantData>& objectVariantData,
149 size_t inPathIndex,
150 size_t outPathIndex) const = 0;
151
155 virtual double GetCosts(const Area& area,
156 const Distance &distance) const = 0;
157
161 virtual double GetCosts(const Way& way,
162 const Distance &distance) const = 0;
163
164 virtual double GetUTurnCost() const = 0;
165
169 virtual double GetCosts(const Distance &distance) const = 0;
170
174 virtual std::string GetCostString(double cost) const = 0;
175
176 virtual Duration GetTime(const Area& area,
177 const Distance &distance) const = 0;
178 virtual Duration GetTime(const Way& way,
179 const Distance &distance) const = 0;
180 };
181
182 using RoutingProfileRef = std::shared_ptr<RoutingProfile>;
183
190 {
191 protected:
200 std::vector<SpeedVariant> speeds;
201 double minSpeed;
202 double maxSpeed;
204
205 protected:
206 template <typename Obj>
207 Duration GetTime2(const Obj& obj,
208 const Distance &distance) const
209 {
210 double speed=vehicleMaxSpeed;
211
212 const MaxSpeedFeatureValue *maxSpeedValue=maxSpeedReader.GetValue(obj.GetFeatureValueBuffer());
213
214 if (maxSpeedValue!=nullptr &&
215 maxSpeedValue->GetMaxSpeed()>0 &&
216 speed > maxSpeedValue->GetMaxSpeed()) {
217 speed=maxSpeedValue->GetMaxSpeed();
218 }
219
220 Grade grade=SolidGrade;
221 const GradeFeatureValue *gradeValue=gradeReader.GetValue(obj.GetFeatureValueBuffer());
222 if (gradeValue!=nullptr){
223 grade=static_cast<Grade>(gradeValue->GetGrade());
224 }
225
226 speed=std::min(speed,speeds[obj.GetType()->GetIndex()][grade]);
227
228 return DurationOfHours(distance.As<Kilometer>()/speed);
229 }
230
231 public:
233
236
237 virtual void ParametrizeForFoot(const TypeConfig& typeConfig,
238 double maxSpeed);
239 virtual void ParametrizeForBicycle(const TypeConfig& typeConfig,
240 double maxSpeed);
241 virtual bool ParametrizeForCar(const TypeConfig& typeConfig,
242 const std::map<std::string,double>& speedMap,
243 double maxSpeed);
244
245 Vehicle GetVehicle() const override
246 {
247 return vehicle;
248 }
249
250 double GetVehicleMaxSpeed() const
251 {
252 return vehicleMaxSpeed;
253 }
254
256
257 Distance GetCostLimitDistance() const override
258 {
259 return costLimitDistance;
260 }
261
263
264 double GetCostLimitFactor() const override
265 {
266 return costLimitFactor;
267 }
268
269 std::string GetCostString(double cost) const override
270 {
271 return std::to_string(cost);
272 }
273
280 void AddType(const TypeInfoRef& type, double speed);
281
289 void AddType(const TypeInfoRef& type, SpeedVariant speed);
290
291 bool CanUse(const RouteNode& currentNode,
292 const std::vector<ObjectVariantData>& objectVariantData,
293 size_t pathIndex) const override;
294 bool CanUse(const Area& area) const override;
295 bool CanUse(const Way& way) const override;
296 bool CanUseForward(const Way& way) const override;
297 bool CanUseBackward(const Way& way) const override;
298
299 Duration GetTime(const Area& area,
300 const Distance& distance) const override
301 {
302 return GetTime2(area,distance);
303 }
304
305 Duration GetTime(const Way& way,
306 const Distance& distance) const override
307 {
308 return GetTime2(way,distance);
309 }
310
311 double GetUTurnCost() const override;
312 };
313
319 {
320 public:
322
323 double GetCosts(const RouteNode& currentNode,
324 const std::vector<ObjectVariantData>& /*objectVariantData*/,
325 size_t /*inPathIndex*/,
326 size_t outPathIndex) const override
327 {
328 return currentNode.paths[outPathIndex].distance.As<Kilometer>();
329 }
330
331 double GetCosts(const Area& /*area*/,
332 const Distance &distance) const override
333 {
334 return distance.As<Kilometer>();
335 }
336
337 double GetCosts(const Way& /*way*/,
338 const Distance &distance) const override
339 {
340 return distance.As<Kilometer>();
341 }
342
343 double GetCosts(const Distance &distance) const override
344 {
345 return distance.As<Kilometer>();
346 }
347
348 std::string GetCostString(double cost) const override
349 {
350 return Kilometers(cost).AsString();
351 }
352 };
353
354 using ShortestPathRoutingProfileRef = std::shared_ptr<ShortestPathRoutingProfile>;
355
362 {
363 protected:
367 HourDuration maxPenalty=std::chrono::seconds(10);
368
369 public:
371
372 void ParametrizeForFoot(const TypeConfig& typeConfig,
373 double maxSpeed) override
374 {
377 }
378
382 void ParametrizeForBicycle(const TypeConfig& typeConfig,
383 double maxSpeed) override
384 {
387 costLimitFactor *= 1.5;
389 }
390
394 bool ParametrizeForCar(const TypeConfig& typeConfig,
395 const std::map<std::string,double>& speedMap,
396 double maxSpeed) override
397 {
400 costLimitFactor *= 1.5;
402 }
403
405 {
407 }
408
410 {
412 }
413
414 Distance GetPenaltySameType() const
415 {
416 return penaltySameType;
417 }
418
419 void SetPenaltySameType(const Distance &d)
420 {
422 }
423
424 Distance GetPenaltyDifferentType() const
425 {
427 }
428
429 void SetPenaltyDifferentType(const Distance &d)
430 {
432 }
433
435 {
436 return maxPenalty;
437 }
438
440 {
441 maxPenalty=d;
442 }
443
444 double GetCosts(const RouteNode& currentNode,
445 const std::vector<ObjectVariantData>& objectVariantData,
446 size_t inPathIndex,
447 size_t outPathIndex) const override
448 {
449 assert(currentNode.paths.size() > inPathIndex);
450 assert(currentNode.paths.size() > outPathIndex);
451 auto inObjIndex=currentNode.paths[inPathIndex].objectIndex;
452 auto outObjIndex=currentNode.paths[outPathIndex].objectIndex;
453 auto inVariantIndex=currentNode.objects[inObjIndex].objectVariantIndex;
454 auto outVariantIndex=currentNode.objects[outObjIndex].objectVariantIndex;
455 assert(objectVariantData.size() > inVariantIndex);
456 assert(objectVariantData.size() > outVariantIndex);
457 const ObjectVariantData &inPathVariant=objectVariantData[inVariantIndex];
458 const ObjectVariantData &outPathVariant=objectVariantData[outVariantIndex];
459
460 auto GetMaxSpeed = [&](const ObjectVariantData &variant) -> double {
461 TypeInfoRef type=variant.type;
462 Grade grade=static_cast<Grade>(variant.grade);
463 double speed=speeds[type->GetIndex()][grade];
464 if (speed<=0){
465 log.Warn() << "Infinite cost for type " << type->GetName();
466 }
467 if (variant.maxSpeed > 0 && speed>variant.maxSpeed) {
468 speed=variant.maxSpeed;
469 }
470 return speed;
471 };
472
473 // price of ride to target node using outPath
474 double speed=std::min(vehicleMaxSpeed,GetMaxSpeed(outPathVariant));
475 double outPrice = speed <= 0 ?
476 std::numeric_limits<double>::infinity() :
477 currentNode.paths[outPathIndex].distance.As<Kilometer>() / speed;
478
479 // add penalty for junction
480 // it is estimated without considering real junction geometry
481 double junctionPenalty{0};
482 if (applyJunctionPenalty && inObjIndex!=outObjIndex){
483 auto penaltyDistance = inPathVariant.type != outPathVariant.type ?
486
487 double minSpeed=std::min(GetMaxSpeed(inPathVariant),GetMaxSpeed(outPathVariant));
488 junctionPenalty = minSpeed <= 0 ?
489 std::numeric_limits<double>::infinity() :
490 penaltyDistance.As<Kilometer>() / minSpeed;
491
492 junctionPenalty = std::min(junctionPenalty, maxPenalty.count());
493 if constexpr (debugRouting) {
494 std::cout << " Add junction penalty " << GetCostString(junctionPenalty) << std::endl;
495 }
496 }
497
498 return outPrice + junctionPenalty;
499 }
500
501 double GetCosts(const Area& area,
502 const Distance &distance) const override
503 {
504 auto duration=GetTime2(area,distance);
505 return std::chrono::duration_cast<HourDuration>(duration).count();
506 }
507
508 double GetCosts(const Way& way,
509 const Distance &distance) const override
510 {
511 auto duration=GetTime2(way,distance);
512 return std::chrono::duration_cast<HourDuration>(duration).count();
513 }
514
515 double GetCosts(const Distance &distance) const override
516 {
517 double speed=maxSpeed;
518
519 speed=std::min(vehicleMaxSpeed,speed);
520
521 return distance.As<Kilometer>()/speed;
522 }
523
524 double GetUTurnCost() const override
525 {
526 switch (vehicle) {
527 case Vehicle::vehicleCar: return 15.0/60.0; // 15 minutes, u-turn is not allowed in most places
528 case Vehicle::vehicleBicycle: return 1.0/60.0;
529 default: return 0;
530 }
531 }
532
533 std::string GetCostString(double cost) const override
534 {
535 return DurationString(std::chrono::duration_cast<Duration>(HourDuration(cost)));
536 }
537
538 };
539
540 using FastestPathRoutingProfileRef = std::shared_ptr<FastestPathRoutingProfile>;
541}
542
543#endif
#define OSMSCOUT_API
Definition CoreImportExport.h:45
bool CanUseBackward(const Way &way) const override
void SetCostLimitDistance(const Distance &costLimitDistance)
double maxSpeed
Definition RoutingProfile.h:202
void SetVehicle(Vehicle vehicle)
void SetCostLimitFactor(double costLimitFactor)
void AddType(const TypeInfoRef &type, SpeedVariant speed)
MaxSpeedFeatureValueReader maxSpeedReader
Definition RoutingProfile.h:194
bool CanUse(const Area &area) const override
AbstractRoutingProfile(const TypeConfigRef &typeConfig)
Duration GetTime(const Area &area, const Distance &distance) const override
Definition RoutingProfile.h:299
double minSpeed
Definition RoutingProfile.h:201
std::string GetCostString(double cost) const override
Definition RoutingProfile.h:269
Distance GetCostLimitDistance() const override
Definition RoutingProfile.h:257
Vehicle vehicle
Definition RoutingProfile.h:196
double vehicleMaxSpeed
Definition RoutingProfile.h:203
double costLimitFactor
Definition RoutingProfile.h:199
bool CanUseForward(const Way &way) const override
double GetUTurnCost() const override
Duration GetTime(const Way &way, const Distance &distance) const override
Definition RoutingProfile.h:305
double GetCostLimitFactor() const override
Definition RoutingProfile.h:264
Duration GetTime2(const Obj &obj, const Distance &distance) const
Definition RoutingProfile.h:207
uint8_t vehicleRouteNodeBit
Definition RoutingProfile.h:197
std::vector< SpeedVariant > speeds
maximum vehicle speed on route type and its grade
Definition RoutingProfile.h:200
Vehicle GetVehicle() const override
Definition RoutingProfile.h:245
GradeFeatureValueReader gradeReader
Definition RoutingProfile.h:195
bool CanUse(const RouteNode &currentNode, const std::vector< ObjectVariantData > &objectVariantData, size_t pathIndex) const override
AccessFeatureValueReader accessReader
Definition RoutingProfile.h:193
Distance costLimitDistance
Definition RoutingProfile.h:198
virtual void ParametrizeForFoot(const TypeConfig &typeConfig, double maxSpeed)
virtual void ParametrizeForBicycle(const TypeConfig &typeConfig, double maxSpeed)
void AddType(const TypeInfoRef &type, double speed)
virtual bool ParametrizeForCar(const TypeConfig &typeConfig, const std::map< std::string, double > &speedMap, double maxSpeed)
bool CanUse(const Way &way) const override
void SetVehicleMaxSpeed(double maxSpeed)
double GetVehicleMaxSpeed() const
Definition RoutingProfile.h:250
TypeConfigRef typeConfig
Definition RoutingProfile.h:192
Distance GetPenaltyDifferentType() const
Definition RoutingProfile.h:424
double GetCosts(const Distance &distance) const override
Definition RoutingProfile.h:515
void ParametrizeForFoot(const TypeConfig &typeConfig, double maxSpeed) override
Definition RoutingProfile.h:372
void SetJunctionPenalty(bool b)
Definition RoutingProfile.h:409
double GetCosts(const Area &area, const Distance &distance) const override
Definition RoutingProfile.h:501
HourDuration GetMaxPenalty() const
Definition RoutingProfile.h:434
std::string GetCostString(double cost) const override
Definition RoutingProfile.h:533
double GetUTurnCost() const override
Definition RoutingProfile.h:524
Distance penaltyDifferentType
Definition RoutingProfile.h:366
void ParametrizeForBicycle(const TypeConfig &typeConfig, double maxSpeed) override
Definition RoutingProfile.h:382
Distance penaltySameType
Definition RoutingProfile.h:365
void SetPenaltySameType(const Distance &d)
Definition RoutingProfile.h:419
double GetCosts(const Way &way, const Distance &distance) const override
Definition RoutingProfile.h:508
bool ParametrizeForCar(const TypeConfig &typeConfig, const std::map< std::string, double > &speedMap, double maxSpeed) override
Definition RoutingProfile.h:394
void SetPenaltyDifferentType(const Distance &d)
Definition RoutingProfile.h:429
bool applyJunctionPenalty
Definition RoutingProfile.h:364
HourDuration maxPenalty
Definition RoutingProfile.h:367
Distance GetPenaltySameType() const
Definition RoutingProfile.h:414
bool HasJunctionPenalty() const
Definition RoutingProfile.h:404
FastestPathRoutingProfile(const TypeConfigRef &typeConfig)
void SetMaxPenalty(const HourDuration &d)
Definition RoutingProfile.h:439
double GetCosts(const RouteNode &currentNode, const std::vector< ObjectVariantData > &objectVariantData, size_t inPathIndex, size_t outPathIndex) const override
Definition RoutingProfile.h:444
Definition GradeFeature.h:31
uint8_t GetGrade() const
Definition GradeFeature.h:49
Definition MaxSpeedFeature.h:31
uint8_t GetMaxSpeed() const
Definition MaxSpeedFeature.h:49
Definition RouteNode.h:62
std::vector< Path > paths
List of paths that can in principle be used from this node.
Definition RouteNode.h:139
std::vector< ObjectData > objects
List of objects (ways, areas) that cross this route node.
Definition RouteNode.h:138
Definition RoutingProfile.h:127
virtual bool CanUse(const Way &way) const =0
virtual ~RoutingProfile()=default
virtual Duration GetTime(const Way &way, const Distance &distance) const =0
virtual std::string GetCostString(double cost) const =0
virtual bool CanUseBackward(const Way &way) const =0
virtual double GetCosts(const RouteNode &currentNode, const std::vector< ObjectVariantData > &objectVariantData, size_t inPathIndex, size_t outPathIndex) const =0
virtual double GetCostLimitFactor() const =0
virtual double GetCosts(const Distance &distance) const =0
virtual bool CanUseForward(const Way &way) const =0
virtual double GetCosts(const Area &area, const Distance &distance) const =0
virtual double GetUTurnCost() const =0
virtual Vehicle GetVehicle() const =0
virtual Distance GetCostLimitDistance() const =0
virtual Duration GetTime(const Area &area, const Distance &distance) const =0
virtual bool CanUse(const RouteNode &currentNode, const std::vector< ObjectVariantData > &objectVariantData, size_t pathIndex) const =0
virtual bool CanUse(const Area &area) const =0
virtual double GetCosts(const Way &way, const Distance &distance) const =0
std::string GetCostString(double cost) const override
Definition RoutingProfile.h:348
double GetCosts(const RouteNode &currentNode, const std::vector< ObjectVariantData > &, size_t, size_t outPathIndex) const override
Definition RoutingProfile.h:323
double GetCosts(const Area &, const Distance &distance) const override
Definition RoutingProfile.h:331
double GetCosts(const Distance &distance) const override
Definition RoutingProfile.h:343
ShortestPathRoutingProfile(const TypeConfigRef &typeConfig)
double GetCosts(const Way &, const Distance &distance) const override
Definition RoutingProfile.h:337
OSMSCOUT_API Log log
Definition LoggerImpl.h:95
Grade
Definition RoutingProfile.h:58
@ SolidGrade
Definition RoutingProfile.h:59
@ MostlySoftGrade
Definition RoutingProfile.h:62
@ GravelGrade
Definition RoutingProfile.h:60
@ SoftGrade
Definition RoutingProfile.h:63
@ UnpavedGrade
Definition RoutingProfile.h:61
std::shared_ptr< TypeConfig > TypeConfigRef
Definition TypeConfig.h:1396
Definition Area.h:39
Distance Meters(double m)
Definition Distance.h:358
std::shared_ptr< RoutingProfile > RoutingProfileRef
Definition RoutingProfile.h:182
std::shared_ptr< ShortestPathRoutingProfile > ShortestPathRoutingProfileRef
Definition RoutingProfile.h:354
Distance Kilometers(double km)
Definition Distance.h:362
FeatureValueReader< MaxSpeedFeature, MaxSpeedFeatureValue > MaxSpeedFeatureValueReader
Definition MaxSpeedFeature.h:97
constexpr bool debugRouting
Definition RoutingProfile.h:50
FeatureValueReader< GradeFeature, GradeFeatureValue > GradeFeatureValueReader
Definition GradeFeature.h:88
std::shared_ptr< FastestPathRoutingProfile > FastestPathRoutingProfileRef
Definition RoutingProfile.h:540
Duration DurationOfHours(double hours)
Definition Time.h:44
Vehicle
Definition OSMScoutTypes.h:55
@ vehicleBicycle
Definition OSMScoutTypes.h:57
@ vehicleCar
Definition OSMScoutTypes.h:58
std::chrono::duration< double, std::ratio< 3600 > > HourDuration
Definition Time.h:31
std::shared_ptr< TypeInfo > TypeInfoRef
Definition TypeConfig.h:61
FeatureValueReader< AccessFeature, AccessFeatureValue > AccessFeatureValueReader
Definition AccessFeature.h:276
OSMSCOUT_API std::string DurationString(const Duration &duration)
Timestamp::duration Duration
Definition Time.h:29
Definition Distance.h:235
Definition RouteNode.h:43
TypeInfoRef type
The type of the object.
Definition RouteNode.h:45
Definition RoutingProfile.h:71
double & operator[](Grade grade)
Definition RoutingProfile.h:82
void SetupValues()
Definition RoutingProfile.h:93
const double & operator[](Grade grade) const
Definition RoutingProfile.h:75
double Min() const
Definition RoutingProfile.h:105
std::array< double, 5 > speed
speed for each grade, indexed by grade-1.
Definition RoutingProfile.h:73
double Max() const
Definition RoutingProfile.h:110
static SpeedVariant Fill(double speed)
Definition RoutingProfile.h:115