Tidying prarameter for the map matching plugin.
This commit is contained in:
parent
bfc272f3e8
commit
441eae9df2
@ -274,6 +274,7 @@ In addition to the [general options](#general-options) the following options are
|
|||||||
|Option |Values |Description |
|
|Option |Values |Description |
|
||||||
|------------|------------------------------------------------|------------------------------------------------------------------------------------------|
|
|------------|------------------------------------------------|------------------------------------------------------------------------------------------|
|
||||||
|steps |`true`, `false` (default) |Return route steps for each route |
|
|steps |`true`, `false` (default) |Return route steps for each route |
|
||||||
|
|tidying |`true` (default), `false` |Allows the input track modification to obtain better matching quality for noisy tracks. |
|
||||||
|geometries |`polyline` (default), `polyline6`, `geojson` |Returned route geometry format (influences overview and per step) |
|
|geometries |`polyline` (default), `polyline6`, `geojson` |Returned route geometry format (influences overview and per step) |
|
||||||
|annotations |`true`, `false` (default), `nodes`, `distance`, `duration`, `datasources`, `weight`, `speed` |Returns additional metadata for each coordinate along the route geometry. |
|
|annotations |`true`, `false` (default), `nodes`, `distance`, `duration`, `datasources`, `weight`, `speed` |Returns additional metadata for each coordinate along the route geometry. |
|
||||||
|overview |`simplified` (default), `full`, `false` |Add overview geometry either full, simplified according to highest zoom level it could be display on, or not at all.|
|
|overview |`simplified` (default), `full`, `false` |Add overview geometry either full, simplified according to highest zoom level it could be display on, or not at all.|
|
||||||
|
@ -61,12 +61,13 @@ struct MatchParameters : public RouteParameters
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
MatchParameters(std::vector<unsigned> timestamps_, Args... args_)
|
MatchParameters(std::vector<unsigned> timestamps_, bool use_tidying_, Args... args_)
|
||||||
: RouteParameters{std::forward<Args>(args_)...}, timestamps{std::move(timestamps_)}
|
: RouteParameters{std::forward<Args>(args_)...}, timestamps{std::move(timestamps_)}, use_tidying(use_tidying_)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<unsigned> timestamps;
|
std::vector<unsigned> timestamps;
|
||||||
|
bool use_tidying = true;
|
||||||
bool IsValid() const
|
bool IsValid() const
|
||||||
{
|
{
|
||||||
return RouteParameters::IsValid() &&
|
return RouteParameters::IsValid() &&
|
||||||
|
@ -38,7 +38,8 @@ class RoutingAlgorithmsInterface
|
|||||||
MapMatching(const routing_algorithms::CandidateLists &candidates_list,
|
MapMatching(const routing_algorithms::CandidateLists &candidates_list,
|
||||||
const std::vector<util::Coordinate> &trace_coordinates,
|
const std::vector<util::Coordinate> &trace_coordinates,
|
||||||
const std::vector<unsigned> &trace_timestamps,
|
const std::vector<unsigned> &trace_timestamps,
|
||||||
const std::vector<boost::optional<double>> &trace_gps_precision) const = 0;
|
const std::vector<boost::optional<double>> &trace_gps_precision,
|
||||||
|
const bool use_tidying) const = 0;
|
||||||
|
|
||||||
virtual std::vector<routing_algorithms::TurnData>
|
virtual std::vector<routing_algorithms::TurnData>
|
||||||
GetTileTurns(const std::vector<datafacade::BaseDataFacade::RTreeLeaf> &edges,
|
GetTileTurns(const std::vector<datafacade::BaseDataFacade::RTreeLeaf> &edges,
|
||||||
@ -83,7 +84,8 @@ template <typename AlgorithmT> class RoutingAlgorithms final : public RoutingAlg
|
|||||||
const routing_algorithms::CandidateLists &candidates_list,
|
const routing_algorithms::CandidateLists &candidates_list,
|
||||||
const std::vector<util::Coordinate> &trace_coordinates,
|
const std::vector<util::Coordinate> &trace_coordinates,
|
||||||
const std::vector<unsigned> &trace_timestamps,
|
const std::vector<unsigned> &trace_timestamps,
|
||||||
const std::vector<boost::optional<double>> &trace_gps_precision) const final override;
|
const std::vector<boost::optional<double>> &trace_gps_precision,
|
||||||
|
const bool use_tidying) const final override;
|
||||||
|
|
||||||
std::vector<routing_algorithms::TurnData>
|
std::vector<routing_algorithms::TurnData>
|
||||||
GetTileTurns(const std::vector<datafacade::BaseDataFacade::RTreeLeaf> &edges,
|
GetTileTurns(const std::vector<datafacade::BaseDataFacade::RTreeLeaf> &edges,
|
||||||
@ -163,10 +165,11 @@ inline routing_algorithms::SubMatchingList RoutingAlgorithms<AlgorithmT>::MapMat
|
|||||||
const routing_algorithms::CandidateLists &candidates_list,
|
const routing_algorithms::CandidateLists &candidates_list,
|
||||||
const std::vector<util::Coordinate> &trace_coordinates,
|
const std::vector<util::Coordinate> &trace_coordinates,
|
||||||
const std::vector<unsigned> &trace_timestamps,
|
const std::vector<unsigned> &trace_timestamps,
|
||||||
const std::vector<boost::optional<double>> &trace_gps_precision) const
|
const std::vector<boost::optional<double>> &trace_gps_precision,
|
||||||
|
const bool use_tidying) const
|
||||||
{
|
{
|
||||||
return routing_algorithms::mapMatching(
|
return routing_algorithms::mapMatching(
|
||||||
heaps, facade, candidates_list, trace_coordinates, trace_timestamps, trace_gps_precision);
|
heaps, facade, candidates_list, trace_coordinates, trace_timestamps, trace_gps_precision, use_tidying);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename AlgorithmT>
|
template <typename AlgorithmT>
|
||||||
@ -207,7 +210,8 @@ inline routing_algorithms::SubMatchingList
|
|||||||
RoutingAlgorithms<algorithm::MLD>::MapMatching(const routing_algorithms::CandidateLists &,
|
RoutingAlgorithms<algorithm::MLD>::MapMatching(const routing_algorithms::CandidateLists &,
|
||||||
const std::vector<util::Coordinate> &,
|
const std::vector<util::Coordinate> &,
|
||||||
const std::vector<unsigned> &,
|
const std::vector<unsigned> &,
|
||||||
const std::vector<boost::optional<double>> &) const
|
const std::vector<boost::optional<double>> &,
|
||||||
|
const bool) const
|
||||||
{
|
{
|
||||||
throw util::exception("MapMatching is not implemented");
|
throw util::exception("MapMatching is not implemented");
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,8 @@ mapMatching(SearchEngineData &engine_working_data,
|
|||||||
const CandidateLists &candidates_list,
|
const CandidateLists &candidates_list,
|
||||||
const std::vector<util::Coordinate> &trace_coordinates,
|
const std::vector<util::Coordinate> &trace_coordinates,
|
||||||
const std::vector<unsigned> &trace_timestamps,
|
const std::vector<unsigned> &trace_timestamps,
|
||||||
const std::vector<boost::optional<double>> &trace_gps_precision);
|
const std::vector<boost::optional<double>> &trace_gps_precision,
|
||||||
|
const bool use_tidying);
|
||||||
|
|
||||||
SubMatchingList
|
SubMatchingList
|
||||||
mapMatching(SearchEngineData &engine_working_data,
|
mapMatching(SearchEngineData &engine_working_data,
|
||||||
@ -36,7 +37,8 @@ mapMatching(SearchEngineData &engine_working_data,
|
|||||||
const CandidateLists &candidates_list,
|
const CandidateLists &candidates_list,
|
||||||
const std::vector<util::Coordinate> &trace_coordinates,
|
const std::vector<util::Coordinate> &trace_coordinates,
|
||||||
const std::vector<unsigned> &trace_timestamps,
|
const std::vector<unsigned> &trace_timestamps,
|
||||||
const std::vector<boost::optional<double>> &trace_gps_precision);
|
const std::vector<boost::optional<double>> &trace_gps_precision,
|
||||||
|
const bool use_tidying);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,9 @@ struct MatchParametersGrammar final : public RouteParametersGrammar<Iterator, Si
|
|||||||
';')[ph::bind(&engine::api::MatchParameters::timestamps, qi::_r1) = qi::_1];
|
';')[ph::bind(&engine::api::MatchParameters::timestamps, qi::_r1) = qi::_1];
|
||||||
|
|
||||||
root_rule = BaseGrammar::query_rule(qi::_r1) > -qi::lit(".json") >
|
root_rule = BaseGrammar::query_rule(qi::_r1) > -qi::lit(".json") >
|
||||||
-('?' > (timestamps_rule(qi::_r1) | BaseGrammar::base_rule(qi::_r1)) % '&');
|
-('?' > (timestamps_rule(qi::_r1) | BaseGrammar::base_rule(qi::_r1) | (
|
||||||
|
qi::lit("tidying=") > qi::bool_[ph::bind(&engine::api::MatchParameters::use_tidying,
|
||||||
|
qi::_r1) = qi::_1])) % '&');
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -189,7 +189,7 @@ Status MatchPlugin::HandleRequest(const datafacade::ContiguousInternalMemoryData
|
|||||||
|
|
||||||
// call the actual map matching
|
// call the actual map matching
|
||||||
SubMatchingList sub_matchings = algorithms.MapMatching(
|
SubMatchingList sub_matchings = algorithms.MapMatching(
|
||||||
candidates_lists, parameters.coordinates, parameters.timestamps, parameters.radiuses);
|
candidates_lists, parameters.coordinates, parameters.timestamps, parameters.radiuses, parameters.use_tidying);
|
||||||
|
|
||||||
if (sub_matchings.size() == 0)
|
if (sub_matchings.size() == 0)
|
||||||
{
|
{
|
||||||
|
@ -54,7 +54,8 @@ mapMatchingImpl(SearchEngineData &engine_working_data,
|
|||||||
const CandidateLists &candidates_list,
|
const CandidateLists &candidates_list,
|
||||||
const std::vector<util::Coordinate> &trace_coordinates,
|
const std::vector<util::Coordinate> &trace_coordinates,
|
||||||
const std::vector<unsigned> &trace_timestamps,
|
const std::vector<unsigned> &trace_timestamps,
|
||||||
const std::vector<boost::optional<double>> &trace_gps_precision)
|
const std::vector<boost::optional<double>> &trace_gps_precision,
|
||||||
|
const bool use_tidying)
|
||||||
{
|
{
|
||||||
map_matching::MatchingConfidence confidence;
|
map_matching::MatchingConfidence confidence;
|
||||||
map_matching::EmissionLogProbability default_emission_log_probability(DEFAULT_GPS_PRECISION);
|
map_matching::EmissionLogProbability default_emission_log_probability(DEFAULT_GPS_PRECISION);
|
||||||
@ -156,16 +157,24 @@ mapMatchingImpl(SearchEngineData &engine_working_data,
|
|||||||
for (auto t = initial_timestamp + 1; t < candidates_list.size(); ++t)
|
for (auto t = initial_timestamp + 1; t < candidates_list.size(); ++t)
|
||||||
{
|
{
|
||||||
|
|
||||||
const bool gap_in_trace = [&, use_timestamps]() {
|
const bool gap_in_trace = [&]() {
|
||||||
// use temporal information if available to determine a split
|
// do not determine split if wasn't asked about it
|
||||||
if (use_timestamps)
|
if (!use_tidying)
|
||||||
{
|
{
|
||||||
return trace_timestamps[t] - trace_timestamps[prev_unbroken_timestamps.back()] >
|
return false;
|
||||||
max_broken_time;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return t - prev_unbroken_timestamps.back() > MAX_BROKEN_STATES;
|
// use temporal information if available to determine a split
|
||||||
|
if (use_timestamps)
|
||||||
|
{
|
||||||
|
return trace_timestamps[t] - trace_timestamps[prev_unbroken_timestamps.back()] >
|
||||||
|
max_broken_time;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return t - prev_unbroken_timestamps.back() > MAX_BROKEN_STATES;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}();
|
}();
|
||||||
|
|
||||||
@ -416,14 +425,16 @@ mapMatching(SearchEngineData &engine_working_data,
|
|||||||
const CandidateLists &candidates_list,
|
const CandidateLists &candidates_list,
|
||||||
const std::vector<util::Coordinate> &trace_coordinates,
|
const std::vector<util::Coordinate> &trace_coordinates,
|
||||||
const std::vector<unsigned> &trace_timestamps,
|
const std::vector<unsigned> &trace_timestamps,
|
||||||
const std::vector<boost::optional<double>> &trace_gps_precision)
|
const std::vector<boost::optional<double>> &trace_gps_precision,
|
||||||
|
const bool use_tidying)
|
||||||
{
|
{
|
||||||
return mapMatchingImpl(engine_working_data,
|
return mapMatchingImpl(engine_working_data,
|
||||||
facade,
|
facade,
|
||||||
candidates_list,
|
candidates_list,
|
||||||
trace_coordinates,
|
trace_coordinates,
|
||||||
trace_timestamps,
|
trace_timestamps,
|
||||||
trace_gps_precision);
|
trace_gps_precision,
|
||||||
|
use_tidying);
|
||||||
}
|
}
|
||||||
|
|
||||||
SubMatchingList
|
SubMatchingList
|
||||||
@ -432,7 +443,8 @@ mapMatching(SearchEngineData &engine_working_data,
|
|||||||
const CandidateLists &candidates_list,
|
const CandidateLists &candidates_list,
|
||||||
const std::vector<util::Coordinate> &trace_coordinates,
|
const std::vector<util::Coordinate> &trace_coordinates,
|
||||||
const std::vector<unsigned> &trace_timestamps,
|
const std::vector<unsigned> &trace_timestamps,
|
||||||
const std::vector<boost::optional<double>> &trace_gps_precision)
|
const std::vector<boost::optional<double>> &trace_gps_precision,
|
||||||
|
const bool use_tidying)
|
||||||
{
|
{
|
||||||
|
|
||||||
return mapMatchingImpl(engine_working_data,
|
return mapMatchingImpl(engine_working_data,
|
||||||
@ -440,7 +452,8 @@ mapMatching(SearchEngineData &engine_working_data,
|
|||||||
candidates_list,
|
candidates_list,
|
||||||
trace_coordinates,
|
trace_coordinates,
|
||||||
trace_timestamps,
|
trace_timestamps,
|
||||||
trace_gps_precision);
|
trace_gps_precision,
|
||||||
|
use_tidying);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace routing_algorithms
|
} // namespace routing_algorithms
|
||||||
|
Loading…
Reference in New Issue
Block a user