1 #ifndef OSMSCOUT_ROUTINGPROFILE_H 2 #define OSMSCOUT_ROUTINGPROFILE_H 64 std::array<double,5>
speed{NAN, NAN, NAN, NAN, NAN};
68 uint8_t i=
static_cast<uint8_t
>(grade);
75 uint8_t i=
static_cast<uint8_t
>(grade);
87 for (
size_t i=0; i<5; i++){
88 if (std::isnan(
speed[i])){
98 return *std::min_element(
speed.begin(),
speed.end());
103 return *std::max_element(
speed.begin(),
speed.end());
122 virtual Vehicle GetVehicle()
const = 0;
123 virtual Distance GetCostLimitDistance()
const = 0;
124 virtual double GetCostLimitFactor()
const = 0;
126 virtual bool CanUse(
const RouteNode& currentNode,
127 const std::vector<ObjectVariantData>& objectVariantData,
128 size_t pathIndex)
const = 0;
129 virtual bool CanUse(
const Area& area)
const = 0;
130 virtual bool CanUse(
const Way& way)
const = 0;
131 virtual bool CanUseForward(
const Way& way)
const = 0;
132 virtual bool CanUseBackward(
const Way& way)
const = 0;
138 virtual double GetCosts(
const RouteNode& currentNode,
139 const std::vector<ObjectVariantData>& objectVariantData,
141 size_t outPathIndex)
const = 0;
146 virtual double GetCosts(
const Area& area,
147 const Distance &distance)
const = 0;
152 virtual double GetCosts(
const Way& way,
153 const Distance &distance)
const = 0;
158 virtual double GetCosts(
const Distance &distance)
const = 0;
163 virtual std::string GetCostString(
double cost)
const = 0;
165 virtual Duration GetTime(
const Area& area,
166 const Distance &distance)
const = 0;
167 virtual Duration GetTime(
const Way& way,
168 const Distance &distance)
const = 0;
195 template <
typename Obj>
197 const Distance &distance)
const 199 double speed=vehicleMaxSpeed;
203 if (maxSpeedValue!=
nullptr &&
211 if (gradeValue!=
nullptr){
215 speed=std::min(speed,speeds[obj.GetType()->GetIndex()][grade]);
223 void SetVehicle(
Vehicle vehicle);
224 void SetVehicleMaxSpeed(
double maxSpeed);
226 virtual void ParametrizeForFoot(
const TypeConfig& typeConfig,
228 virtual void ParametrizeForBicycle(
const TypeConfig& typeConfig,
230 virtual bool ParametrizeForCar(
const TypeConfig& typeConfig,
231 const std::map<std::string,double>& speedMap,
241 return vehicleMaxSpeed;
244 void SetCostLimitDistance(
const Distance &costLimitDistance);
248 return costLimitDistance;
251 void SetCostLimitFactor(
double costLimitFactor);
255 return costLimitFactor;
260 return std::to_string(cost);
269 void AddType(
const TypeInfoRef& type,
double speed);
280 bool CanUse(
const RouteNode& currentNode,
281 const std::vector<ObjectVariantData>& objectVariantData,
282 size_t pathIndex)
const override;
283 bool CanUse(
const Area& area)
const override;
284 bool CanUse(
const Way& way)
const override;
285 bool CanUseForward(
const Way& way)
const override;
286 bool CanUseBackward(
const Way& way)
const override;
289 const Distance &distance)
const override 291 return GetTime2(area,distance);
295 const Distance &distance)
const override 297 return GetTime2(way,distance);
311 const std::vector<ObjectVariantData>& ,
313 size_t outPathIndex)
const override 319 const Distance &distance)
const override 325 const Distance &distance)
const override 330 double GetCosts(
const Distance &distance)
const override 351 bool applyJunctionPenalty=
true;
353 Distance penaltyDifferentType=
Meters(250);
360 double maxSpeed)
override 362 applyJunctionPenalty=
false;
370 double maxSpeed)
override 372 applyJunctionPenalty =
true;
373 costLimitDistance *= 2;
374 costLimitFactor *= 1.5;
382 const std::map<std::string,double>& speedMap,
383 double maxSpeed)
override 385 applyJunctionPenalty =
true;
386 costLimitDistance *= 2;
387 costLimitFactor *= 1.5;
393 return applyJunctionPenalty;
398 applyJunctionPenalty=b;
403 return penaltySameType;
413 return penaltyDifferentType;
418 penaltyDifferentType=d;
432 const std::vector<ObjectVariantData>& objectVariantData,
434 size_t outPathIndex)
const override 436 assert(currentNode.
paths.size() > inPathIndex);
437 assert(currentNode.
paths.size() > outPathIndex);
438 auto inObjIndex=currentNode.
paths[inPathIndex].objectIndex;
439 auto outObjIndex=currentNode.
paths[outPathIndex].objectIndex;
440 auto inVariantIndex=currentNode.
objects[inObjIndex].objectVariantIndex;
441 auto outVariantIndex=currentNode.
objects[outObjIndex].objectVariantIndex;
442 assert(objectVariantData.size() > inVariantIndex);
443 assert(objectVariantData.size() > outVariantIndex);
449 Grade grade=
static_cast<Grade>(variant.grade);
450 double speed=speeds[type->GetIndex()][grade];
452 log.
Warn() <<
"Infinite cost for type " << type->GetName();
454 if (variant.maxSpeed > 0 && speed>variant.maxSpeed) {
455 speed=variant.maxSpeed;
461 double speed=std::min(vehicleMaxSpeed,GetMaxSpeed(outPathVariant));
462 double outPrice = speed <= 0 ?
463 std::numeric_limits<double>::infinity() :
468 double junctionPenalty{0};
469 if (applyJunctionPenalty && inObjIndex!=outObjIndex){
470 auto penaltyDistance = inPathVariant.type != outPathVariant.
type ?
471 penaltyDifferentType :
474 double minSpeed=std::min(GetMaxSpeed(inPathVariant),GetMaxSpeed(outPathVariant));
475 junctionPenalty = minSpeed <= 0 ?
476 std::numeric_limits<double>::infinity() :
477 penaltyDistance.As<
Kilometer>() / minSpeed;
479 junctionPenalty = std::min(junctionPenalty, maxPenalty.count());
480 #if defined(DEBUG_ROUTING) 481 std::cout <<
" Add junction penalty " << GetCostString(junctionPenalty) << std::endl;
485 return outPrice + junctionPenalty;
489 const Distance &distance)
const override 491 auto time=GetTime2(area,distance);
492 return std::chrono::duration_cast<
HourDuration>(time).count();
496 const Distance &distance)
const override 498 auto time=GetTime2(way,distance);
499 return std::chrono::duration_cast<
HourDuration>(time).count();
502 double GetCosts(
const Distance &distance)
const override 504 double speed=maxSpeed;
506 speed=std::min(vehicleMaxSpeed,speed);
Distance GetPenaltyDifferentType() const
Definition: RoutingProfile.h:411
double GetCosts(const Area &, const Distance &distance) const override
Definition: RoutingProfile.h:318
virtual bool ParametrizeForCar(const TypeConfig &typeConfig, const std::map< std::string, double > &speedMap, double maxSpeed)
Duration GetTime(const Area &area, const Distance &distance) const override
Definition: RoutingProfile.h:288
double GetCosts(const RouteNode ¤tNode, const std::vector< ObjectVariantData > &, size_t, size_t outPathIndex) const override
Definition: RoutingProfile.h:310
virtual void ParametrizeForFoot(const TypeConfig &typeConfig, double maxSpeed)
std::shared_ptr< ShortestPathRoutingProfile > ShortestPathRoutingProfileRef
Definition: RoutingProfile.h:341
Definition: RoutingProfile.h:348
Definition: RoutingProfile.h:52
bool HasJunctionPenalty() const
Definition: RoutingProfile.h:391
GradeFeatureValueReader gradeReader
Definition: RoutingProfile.h:184
uint8_t vehicleRouteNodeBit
Definition: RoutingProfile.h:186
Distance GetPenaltySameType() const
Definition: RoutingProfile.h:401
double GetCosts(const RouteNode ¤tNode, const std::vector< ObjectVariantData > &objectVariantData, size_t inPathIndex, size_t outPathIndex) const override
Definition: RoutingProfile.h:431
Duration GetTime2(const Obj &obj, const Distance &distance) const
Definition: RoutingProfile.h:196
AccessFeatureValueReader accessReader
Definition: RoutingProfile.h:182
Definition: RoutingProfile.h:51
std::vector< SpeedVariant > speeds
maximum vehicle speed on route type and its grade
Definition: RoutingProfile.h:189
uint8_t GetMaxSpeed() const
Definition: TypeFeatures.h:961
std::shared_ptr< RoutingProfile > RoutingProfileRef
Definition: RoutingProfile.h:171
Vehicle
Definition: OSMScoutTypes.h:55
TypeInfoRef type
The type of the object.
Definition: RouteNode.h:45
double & operator[](Grade grade)
Definition: RoutingProfile.h:73
Definition: RoutingProfile.h:54
double GetCosts(const Area &area, const Distance &distance) const override
Definition: RoutingProfile.h:488
void ParametrizeForFoot(const TypeConfig &typeConfig, double maxSpeed) override
Definition: RoutingProfile.h:359
Definition: RoutingProfile.h:53
Definition: TypeFeatures.h:1009
Distance Kilometers(double km)
Definition: Distance.h:362
V * GetValue(const FeatureValueBuffer &buffer) const
Definition: FeatureReader.h:224
Duration GetTime(const Way &way, const Distance &distance) const override
Definition: RoutingProfile.h:294
double vehicleMaxSpeed
Definition: RoutingProfile.h:192
double costLimitFactor
Definition: RoutingProfile.h:188
OSMSCOUT_API std::string DurationString(const Duration &duration)
double minSpeed
Definition: RoutingProfile.h:190
Definition: Distance.h:234
std::string GetCostString(double cost) const override
Definition: RoutingProfile.h:511
double GetCosts(const Distance &distance) const override
Definition: RoutingProfile.h:330
const double & operator[](Grade grade) const
Definition: RoutingProfile.h:66
std::chrono::duration< double, std::ratio< 3600 > > HourDuration
Definition: Time.h:31
double GetVehicleMaxSpeed() const
Definition: RoutingProfile.h:239
Definition: RoutingProfile.h:117
Distance GetCostLimitDistance() const override
Definition: RoutingProfile.h:246
virtual void ParametrizeForBicycle(const TypeConfig &typeConfig, double maxSpeed)
#define OSMSCOUT_API
Definition: CoreImportExport.h:45
void ParametrizeForBicycle(const TypeConfig &typeConfig, double maxSpeed) override
Definition: RoutingProfile.h:369
Definition: RoutingProfile.h:178
double maxSpeed
Definition: RoutingProfile.h:191
Definition: RouteNode.h:42
std::string GetCostString(double cost) const override
Definition: RoutingProfile.h:258
Definition: TypeFeatures.h:942
bool ParametrizeForCar(const TypeConfig &typeConfig, const std::map< std::string, double > &speedMap, double maxSpeed) override
Definition: RoutingProfile.h:381
void SetupValues()
Definition: RoutingProfile.h:84
std::string GetCostString(double cost) const override
Definition: RoutingProfile.h:335
std::shared_ptr< FastestPathRoutingProfile > FastestPathRoutingProfileRef
Definition: RoutingProfile.h:518
std::vector< ObjectData > objects
List of objects (ways, areas) that cross this route node.
Definition: RouteNode.h:125
HourDuration GetMaxPenalty() const
Definition: RoutingProfile.h:421
Distance costLimitDistance
Definition: RoutingProfile.h:187
double GetCosts(const Way &way, const Distance &distance) const override
Definition: RoutingProfile.h:495
std::array< double, 5 > speed
speed for each grade, indexed by grade-1.
Definition: RoutingProfile.h:64
Duration DurationOfHours(double hours)
Definition: Time.h:44
TypeConfigRef typeConfig
Definition: RoutingProfile.h:181
Definition: RoutingProfile.h:50
void SetPenaltyDifferentType(const Distance &d)
Definition: RoutingProfile.h:416
double GetCostLimitFactor() const override
Definition: RoutingProfile.h:253
std::shared_ptr< TypeInfo > TypeInfoRef
Definition: TypeConfig.h:58
Definition: RoutingProfile.h:61
Distance Meters(double m)
Definition: Distance.h:358
Log & Warn(bool state)
Definition: Logger.h:462
Vehicle vehicle
Definition: RoutingProfile.h:185
Timestamp::duration Duration
Definition: Time.h:29
MaxSpeedFeatureValueReader maxSpeedReader
Definition: RoutingProfile.h:183
double Max() const
Definition: RoutingProfile.h:101
double Min() const
Definition: RoutingProfile.h:96
Definition: RoutingProfile.h:305
Vehicle GetVehicle() const override
Definition: RoutingProfile.h:234
Grade
Definition: RoutingProfile.h:48
static SpeedVariant Fill(double speed)
Definition: RoutingProfile.h:106
void SetPenaltySameType(const Distance &d)
Definition: RoutingProfile.h:406
double GetCosts(const Distance &distance) const override
Definition: RoutingProfile.h:502
double GetCosts(const Way &, const Distance &distance) const override
Definition: RoutingProfile.h:324
std::vector< Path > paths
List of paths that can in principle be used from this node.
Definition: RouteNode.h:126
std::shared_ptr< TypeConfig > TypeConfigRef
Definition: TypeConfig.h:1227
void SetJunctionPenalty(bool b)
Definition: RoutingProfile.h:396
uint8_t GetGrade() const
Definition: TypeFeatures.h:1028
void SetMaxPenalty(const HourDuration &d)
Definition: RoutingProfile.h:426
Definition: RouteNode.h:61