From 441eae9df2297634dc28a5bf515de22c6db688ae Mon Sep 17 00:00:00 2001 From: Lev Dragunov Date: Mon, 6 Mar 2017 16:11:38 +0300 Subject: [PATCH] Tidying prarameter for the map matching plugin. --- docs/http.md | 1 + include/engine/api/match_parameters.hpp | 5 +-- include/engine/routing_algorithms.hpp | 14 +++++--- .../routing_algorithms/map_matching.hpp | 6 ++-- .../server/api/match_parameter_grammar.hpp | 4 ++- src/engine/plugins/match.cpp | 2 +- .../routing_algorithms/map_matching.cpp | 35 +++++++++++++------ 7 files changed, 45 insertions(+), 22 deletions(-) diff --git a/docs/http.md b/docs/http.md index af5c1e119..fe7d81fb1 100644 --- a/docs/http.md +++ b/docs/http.md @@ -274,6 +274,7 @@ In addition to the [general options](#general-options) the following options are |Option |Values |Description | |------------|------------------------------------------------|------------------------------------------------------------------------------------------| |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) | |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.| diff --git a/include/engine/api/match_parameters.hpp b/include/engine/api/match_parameters.hpp index 87e67ebbb..45336aba8 100644 --- a/include/engine/api/match_parameters.hpp +++ b/include/engine/api/match_parameters.hpp @@ -61,12 +61,13 @@ struct MatchParameters : public RouteParameters } template - MatchParameters(std::vector timestamps_, Args... args_) - : RouteParameters{std::forward(args_)...}, timestamps{std::move(timestamps_)} + MatchParameters(std::vector timestamps_, bool use_tidying_, Args... args_) + : RouteParameters{std::forward(args_)...}, timestamps{std::move(timestamps_)}, use_tidying(use_tidying_) { } std::vector timestamps; + bool use_tidying = true; bool IsValid() const { return RouteParameters::IsValid() && diff --git a/include/engine/routing_algorithms.hpp b/include/engine/routing_algorithms.hpp index eefe06833..5bc8bd75d 100644 --- a/include/engine/routing_algorithms.hpp +++ b/include/engine/routing_algorithms.hpp @@ -38,7 +38,8 @@ class RoutingAlgorithmsInterface MapMatching(const routing_algorithms::CandidateLists &candidates_list, const std::vector &trace_coordinates, const std::vector &trace_timestamps, - const std::vector> &trace_gps_precision) const = 0; + const std::vector> &trace_gps_precision, + const bool use_tidying) const = 0; virtual std::vector GetTileTurns(const std::vector &edges, @@ -83,7 +84,8 @@ template class RoutingAlgorithms final : public RoutingAlg const routing_algorithms::CandidateLists &candidates_list, const std::vector &trace_coordinates, const std::vector &trace_timestamps, - const std::vector> &trace_gps_precision) const final override; + const std::vector> &trace_gps_precision, + const bool use_tidying) const final override; std::vector GetTileTurns(const std::vector &edges, @@ -163,10 +165,11 @@ inline routing_algorithms::SubMatchingList RoutingAlgorithms::MapMat const routing_algorithms::CandidateLists &candidates_list, const std::vector &trace_coordinates, const std::vector &trace_timestamps, - const std::vector> &trace_gps_precision) const + const std::vector> &trace_gps_precision, + const bool use_tidying) const { 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 @@ -207,7 +210,8 @@ inline routing_algorithms::SubMatchingList RoutingAlgorithms::MapMatching(const routing_algorithms::CandidateLists &, const std::vector &, const std::vector &, - const std::vector> &) const + const std::vector> &, + const bool) const { throw util::exception("MapMatching is not implemented"); } diff --git a/include/engine/routing_algorithms/map_matching.hpp b/include/engine/routing_algorithms/map_matching.hpp index 00e763e57..1bc5ebea4 100644 --- a/include/engine/routing_algorithms/map_matching.hpp +++ b/include/engine/routing_algorithms/map_matching.hpp @@ -28,7 +28,8 @@ mapMatching(SearchEngineData &engine_working_data, const CandidateLists &candidates_list, const std::vector &trace_coordinates, const std::vector &trace_timestamps, - const std::vector> &trace_gps_precision); + const std::vector> &trace_gps_precision, + const bool use_tidying); SubMatchingList mapMatching(SearchEngineData &engine_working_data, @@ -36,7 +37,8 @@ mapMatching(SearchEngineData &engine_working_data, const CandidateLists &candidates_list, const std::vector &trace_coordinates, const std::vector &trace_timestamps, - const std::vector> &trace_gps_precision); + const std::vector> &trace_gps_precision, + const bool use_tidying); } } } diff --git a/include/server/api/match_parameter_grammar.hpp b/include/server/api/match_parameter_grammar.hpp index ac4c02c67..56db73c3d 100644 --- a/include/server/api/match_parameter_grammar.hpp +++ b/include/server/api/match_parameter_grammar.hpp @@ -34,7 +34,9 @@ struct MatchParametersGrammar final : public RouteParametersGrammar -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: diff --git a/src/engine/plugins/match.cpp b/src/engine/plugins/match.cpp index e4a32df2c..11cb46f8e 100644 --- a/src/engine/plugins/match.cpp +++ b/src/engine/plugins/match.cpp @@ -189,7 +189,7 @@ Status MatchPlugin::HandleRequest(const datafacade::ContiguousInternalMemoryData // call the actual map matching 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) { diff --git a/src/engine/routing_algorithms/map_matching.cpp b/src/engine/routing_algorithms/map_matching.cpp index e5cbb5469..a1c41d39a 100644 --- a/src/engine/routing_algorithms/map_matching.cpp +++ b/src/engine/routing_algorithms/map_matching.cpp @@ -54,7 +54,8 @@ mapMatchingImpl(SearchEngineData &engine_working_data, const CandidateLists &candidates_list, const std::vector &trace_coordinates, const std::vector &trace_timestamps, - const std::vector> &trace_gps_precision) + const std::vector> &trace_gps_precision, + const bool use_tidying) { map_matching::MatchingConfidence confidence; 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) { - const bool gap_in_trace = [&, use_timestamps]() { - // use temporal information if available to determine a split - if (use_timestamps) + const bool gap_in_trace = [&]() { + // do not determine split if wasn't asked about it + if (!use_tidying) { - return trace_timestamps[t] - trace_timestamps[prev_unbroken_timestamps.back()] > - max_broken_time; + return false; } 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 std::vector &trace_coordinates, const std::vector &trace_timestamps, - const std::vector> &trace_gps_precision) + const std::vector> &trace_gps_precision, + const bool use_tidying) { return mapMatchingImpl(engine_working_data, facade, candidates_list, trace_coordinates, trace_timestamps, - trace_gps_precision); + trace_gps_precision, + use_tidying); } SubMatchingList @@ -432,7 +443,8 @@ mapMatching(SearchEngineData &engine_working_data, const CandidateLists &candidates_list, const std::vector &trace_coordinates, const std::vector &trace_timestamps, - const std::vector> &trace_gps_precision) + const std::vector> &trace_gps_precision, + const bool use_tidying) { return mapMatchingImpl(engine_working_data, @@ -440,7 +452,8 @@ mapMatching(SearchEngineData &engine_working_data, candidates_list, trace_coordinates, trace_timestamps, - trace_gps_precision); + trace_gps_precision, + use_tidying); } } // namespace routing_algorithms