1#ifndef OSMSCOUT_ROUTINGPROFILE_H
2#define OSMSCOUT_ROUTINGPROFILE_H
47#ifdef OSMSCOUT_DEBUG_ROUTING
73 std::array<double,5>
speed{NAN, NAN, NAN, NAN, NAN};
77 uint8_t i=
static_cast<uint8_t
>(grade);
84 uint8_t i=
static_cast<uint8_t
>(grade);
96 for (
size_t i=0; i<5; ++i){
97 if (std::isnan(
speed[i])){
107 return *std::min_element(
speed.begin(),
speed.end());
112 return *std::max_element(
speed.begin(),
speed.end());
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;
148 const std::vector<ObjectVariantData>& objectVariantData,
150 size_t outPathIndex)
const = 0;
156 const Distance &distance)
const = 0;
162 const Distance &distance)
const = 0;
169 virtual double GetCosts(
const Distance &distance)
const = 0;
177 const Distance &distance)
const = 0;
179 const Distance &distance)
const = 0;
206 template <
typename Obj>
208 const Distance &distance)
const
214 if (maxSpeedValue!=
nullptr &&
222 if (gradeValue!=
nullptr){
226 speed=std::min(speed,
speeds[obj.GetType()->GetIndex()][grade]);
242 const std::map<std::string,double>& speedMap,
271 return std::to_string(cost);
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;
300 const Distance& distance)
const override
306 const Distance& distance)
const override
324 const std::vector<ObjectVariantData>& ,
326 size_t outPathIndex)
const override
332 const Distance &distance)
const override
338 const Distance &distance)
const override
343 double GetCosts(
const Distance &distance)
const override
395 const std::map<std::string,double>& speedMap,
445 const std::vector<ObjectVariantData>& objectVariantData,
447 size_t outPathIndex)
const override
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);
462 Grade grade=
static_cast<Grade>(variant.grade);
463 double speed=
speeds[type->GetIndex()][grade];
465 log.Warn() <<
"Infinite cost for type " << type->GetName();
467 if (variant.maxSpeed > 0 && speed>variant.maxSpeed) {
468 speed=variant.maxSpeed;
475 double outPrice = speed <= 0 ?
476 std::numeric_limits<double>::infinity() :
481 double junctionPenalty{0};
483 auto penaltyDistance = inPathVariant.
type != outPathVariant.
type ?
487 double minSpeed=std::min(GetMaxSpeed(inPathVariant),GetMaxSpeed(outPathVariant));
489 std::numeric_limits<double>::infinity() :
492 junctionPenalty = std::min(junctionPenalty,
maxPenalty.count());
494 std::cout <<
" Add junction penalty " <<
GetCostString(junctionPenalty) << std::endl;
498 return outPrice + junctionPenalty;
502 const Distance &distance)
const override
504 auto duration=
GetTime2(area,distance);
505 return std::chrono::duration_cast<HourDuration>(duration).count();
509 const Distance &distance)
const override
511 auto duration=
GetTime2(way,distance);
512 return std::chrono::duration_cast<HourDuration>(duration).count();
515 double GetCosts(
const Distance &distance)
const override
#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 ¤tNode, 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 ¤tNode, 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 ¤tNode, 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 ¤tNode, 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 ¤tNode, 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
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