mirror of
https://codeberg.org/comaps/comaps
synced 2025-12-20 05:13:58 +00:00
[traffxml] Use custom EdgeEstimator for decoding
Signed-off-by: mvglasow <michael -at- vonglasow.com>
This commit is contained in:
@@ -280,7 +280,7 @@ IndexRouter::IndexRouter(VehicleType vehicleType, bool loadAltitudes,
|
|||||||
CountryParentNameGetterFn const & countryParentNameGetterFn,
|
CountryParentNameGetterFn const & countryParentNameGetterFn,
|
||||||
TCountryFileFn const & countryFileFn, CountryRectFn const & countryRectFn,
|
TCountryFileFn const & countryFileFn, CountryRectFn const & countryRectFn,
|
||||||
shared_ptr<NumMwmIds> numMwmIds, unique_ptr<m4::Tree<NumMwmId>> numMwmTree,
|
shared_ptr<NumMwmIds> numMwmIds, unique_ptr<m4::Tree<NumMwmId>> numMwmTree,
|
||||||
DataSource & dataSource)
|
std::shared_ptr<EdgeEstimator> estimator, DataSource & dataSource)
|
||||||
: m_vehicleType(vehicleType)
|
: m_vehicleType(vehicleType)
|
||||||
, m_loadAltitudes(loadAltitudes)
|
, m_loadAltitudes(loadAltitudes)
|
||||||
, m_name("astar-bidirectional-" + ToString(m_vehicleType))
|
, m_name("astar-bidirectional-" + ToString(m_vehicleType))
|
||||||
@@ -296,10 +296,7 @@ IndexRouter::IndexRouter(VehicleType vehicleType, bool loadAltitudes,
|
|||||||
? IRoadGraph::Mode::IgnoreOnewayTag
|
? IRoadGraph::Mode::IgnoreOnewayTag
|
||||||
: IRoadGraph::Mode::ObeyOnewayTag,
|
: IRoadGraph::Mode::ObeyOnewayTag,
|
||||||
m_vehicleModelFactory)
|
m_vehicleModelFactory)
|
||||||
, m_estimator(EdgeEstimator::Create(
|
, m_estimator(estimator)
|
||||||
m_vehicleType, CalcMaxSpeed(*m_numMwmIds, *m_vehicleModelFactory, m_vehicleType),
|
|
||||||
CalcOffroadSpeed(*m_vehicleModelFactory), m_trafficStash,
|
|
||||||
&dataSource, m_numMwmIds))
|
|
||||||
, m_directionsEngine(CreateDirectionsEngine(m_vehicleType, m_numMwmIds, m_dataSource))
|
, m_directionsEngine(CreateDirectionsEngine(m_vehicleType, m_numMwmIds, m_dataSource))
|
||||||
, m_countryParentNameGetterFn(countryParentNameGetterFn)
|
, m_countryParentNameGetterFn(countryParentNameGetterFn)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -110,9 +110,15 @@ protected:
|
|||||||
/**
|
/**
|
||||||
* @brief Creates a new `IndexRouter` instance.
|
* @brief Creates a new `IndexRouter` instance.
|
||||||
*
|
*
|
||||||
* This constructor is intended for use by the TraFF decoder, not for normal routing. It lacks the
|
* This constructor is intended for use by the TraFF decoder, not for normal routing. It differs
|
||||||
* `TrafficCache` argument and never creates a traffic stash. This creates a router instance which
|
* from the general-purpose constructor in two ways.
|
||||||
* ignores the traffic situation, regardless of the vehicle type.
|
*
|
||||||
|
* It takes an explicit `EdgeEstimator` argument, instance, which gives the caller fine-grained
|
||||||
|
* control over the cost calculations used for routing by supplying an `EdgeEstimator` of their
|
||||||
|
* choice.
|
||||||
|
*
|
||||||
|
* It also lacks the `TrafficCache` argument and never creates a traffic stash. This creates a
|
||||||
|
* router instance which ignores the traffic situation, regardless of the vehicle type.
|
||||||
*
|
*
|
||||||
* @param vehicleType The vehichle type
|
* @param vehicleType The vehichle type
|
||||||
* @param loadAltitudes Whether to load altitudes
|
* @param loadAltitudes Whether to load altitudes
|
||||||
@@ -121,13 +127,14 @@ protected:
|
|||||||
* @param countryRectFn Function which returns the rect for a country
|
* @param countryRectFn Function which returns the rect for a country
|
||||||
* @param numMwmIds
|
* @param numMwmIds
|
||||||
* @param numMwmTree
|
* @param numMwmTree
|
||||||
|
* @param estimator An edge estimator
|
||||||
* @param dataSource The MWM data source
|
* @param dataSource The MWM data source
|
||||||
*/
|
*/
|
||||||
IndexRouter(VehicleType vehicleType, bool loadAltitudes,
|
IndexRouter(VehicleType vehicleType, bool loadAltitudes,
|
||||||
CountryParentNameGetterFn const & countryParentNameGetterFn,
|
CountryParentNameGetterFn const & countryParentNameGetterFn,
|
||||||
TCountryFileFn const & countryFileFn, CountryRectFn const & countryRectFn,
|
TCountryFileFn const & countryFileFn, CountryRectFn const & countryRectFn,
|
||||||
std::shared_ptr<NumMwmIds> numMwmIds, std::unique_ptr<m4::Tree<NumMwmId>> numMwmTree,
|
std::shared_ptr<NumMwmIds> numMwmIds, std::unique_ptr<m4::Tree<NumMwmId>> numMwmTree,
|
||||||
DataSource & dataSource);
|
std::shared_ptr<EdgeEstimator> estimator, DataSource & dataSource);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
RouterResultCode CalculateSubrouteJointsMode(IndexGraphStarter & starter,
|
RouterResultCode CalculateSubrouteJointsMode(IndexGraphStarter & starter,
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
#include "routing/async_router.hpp"
|
#include "routing/async_router.hpp"
|
||||||
#include "routing/checkpoints.hpp"
|
#include "routing/checkpoints.hpp"
|
||||||
|
#include "routing/edge_estimator.hpp"
|
||||||
#include "routing/maxspeeds.hpp"
|
#include "routing/maxspeeds.hpp"
|
||||||
#include "routing/route.hpp"
|
#include "routing/route.hpp"
|
||||||
#include "routing/router_delegate.hpp"
|
#include "routing/router_delegate.hpp"
|
||||||
@@ -350,6 +351,53 @@ void OpenLrV3TraffDecoder::DecodeLocation(traffxml::TraffMessage & message, traf
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class TraffEstimator final : public routing::EdgeEstimator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TraffEstimator(DataSource * dataSourcePtr, std::shared_ptr<routing::NumMwmIds> numMwmIds,
|
||||||
|
double maxWeightSpeedKMpH,
|
||||||
|
routing::SpeedKMpH const & offroadSpeedKMpH)
|
||||||
|
: EdgeEstimator(maxWeightSpeedKMpH, offroadSpeedKMpH, dataSourcePtr, numMwmIds)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// EdgeEstimator overrides:
|
||||||
|
double CalcSegmentWeight(routing::Segment const & segment, routing::RoadGeometry const & road, Purpose purpose) const override;
|
||||||
|
double GetUTurnPenalty(Purpose /* purpose */) const override
|
||||||
|
{
|
||||||
|
// Adds 2 minutes penalty for U-turn. The value is quite arbitrary
|
||||||
|
// and needs to be properly selected after a number of real-world
|
||||||
|
// experiments.
|
||||||
|
return 2 * 60; // seconds
|
||||||
|
}
|
||||||
|
|
||||||
|
double GetFerryLandingPenalty(Purpose purpose) const override
|
||||||
|
{
|
||||||
|
switch (purpose)
|
||||||
|
{
|
||||||
|
case Purpose::Weight: return 20 * 60; // seconds
|
||||||
|
case Purpose::ETA: return 20 * 60; // seconds
|
||||||
|
}
|
||||||
|
UNREACHABLE();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// TODO only needed temporarily
|
||||||
|
double GetSpeedMpS(routing::EdgeEstimator::Purpose purpose, routing::Segment const & segment, routing::RoadGeometry const & road)
|
||||||
|
{
|
||||||
|
routing::SpeedKMpH const & speed = road.GetSpeed(segment.IsForward());
|
||||||
|
double const speedMpS = measurement_utils::KmphToMps(purpose == routing::EdgeEstimator::Purpose::Weight ? speed.m_weight : speed.m_eta);
|
||||||
|
ASSERT_GREATER(speedMpS, 0.0, (segment));
|
||||||
|
return speedMpS;
|
||||||
|
}
|
||||||
|
|
||||||
|
double TraffEstimator::CalcSegmentWeight(routing::Segment const & segment, routing::RoadGeometry const & road, Purpose purpose) const
|
||||||
|
{
|
||||||
|
double result = road.GetDistance(segment.GetSegmentIdx()) / GetSpeedMpS(purpose, segment, road);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
RoutingTraffDecoder::DecoderRouter::DecoderRouter(CountryParentNameGetterFn const & countryParentNameGetterFn,
|
RoutingTraffDecoder::DecoderRouter::DecoderRouter(CountryParentNameGetterFn const & countryParentNameGetterFn,
|
||||||
routing::TCountryFileFn const & countryFileFn,
|
routing::TCountryFileFn const & countryFileFn,
|
||||||
routing::CountryRectFn const & countryRectFn,
|
routing::CountryRectFn const & countryRectFn,
|
||||||
@@ -361,16 +409,12 @@ RoutingTraffDecoder::DecoderRouter::DecoderRouter(CountryParentNameGetterFn cons
|
|||||||
countryParentNameGetterFn,
|
countryParentNameGetterFn,
|
||||||
countryFileFn,
|
countryFileFn,
|
||||||
countryRectFn,
|
countryRectFn,
|
||||||
std::move(numMwmIds),
|
numMwmIds,
|
||||||
std::move(numMwmTree),
|
std::move(numMwmTree),
|
||||||
//std::nullopt /* std::optional<traffic::TrafficCache> const & trafficCache */,
|
//std::nullopt /* std::optional<traffic::TrafficCache> const & trafficCache */,
|
||||||
|
std::make_shared<TraffEstimator>(&dataSource, numMwmIds, 120.0f /* maxWeighSpeedKMpH */,
|
||||||
|
routing::SpeedKMpH(0.01 /* weight */, routing::kNotUsed /* eta */) /* offroadSpeedKMpH */),
|
||||||
dataSource)
|
dataSource)
|
||||||
/* TODO build our own edge estimator for TraFF decoding purposes
|
|
||||||
, m_estimator(EdgeEstimator::Create(
|
|
||||||
VehicleType::Car, CalcMaxSpeed(*m_numMwmIds, *m_vehicleModelFactory, m_vehicleType),
|
|
||||||
CalcOffroadSpeed(*m_vehicleModelFactory), m_trafficStash,
|
|
||||||
&dataSource, m_numMwmIds))
|
|
||||||
*/
|
|
||||||
//, m_directionsEngine(CreateDirectionsEngine(m_vehicleType, m_numMwmIds, m_dataSource)) // TODO we don’t need directions, can we disable that?
|
//, m_directionsEngine(CreateDirectionsEngine(m_vehicleType, m_numMwmIds, m_dataSource)) // TODO we don’t need directions, can we disable that?
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user