From e8e637c4f2bb7247800808a32b8600d01c1cb537 Mon Sep 17 00:00:00 2001 From: Patrick Niklaus Date: Fri, 27 Feb 2015 10:59:36 +0100 Subject: [PATCH] Replace descriptor code with code that generates only geometry --- plugins/map_matching.hpp | 105 ++++++++++++++++++++------------------- 1 file changed, 53 insertions(+), 52 deletions(-) diff --git a/plugins/map_matching.hpp b/plugins/map_matching.hpp index d3fcccac3..3868572ff 100644 --- a/plugins/map_matching.hpp +++ b/plugins/map_matching.hpp @@ -52,7 +52,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. template class MapMatchingPlugin : public BasePlugin { private: - std::unordered_map descriptor_table; std::shared_ptr> search_engine_ptr; using ClassifierT = BayesClassifier; @@ -68,7 +67,6 @@ template class MapMatchingPlugin : public BasePlugin LaplaceDistribution(0.11467696742821254, 0.49918444000368756), 0.7977883096366508) // valid apriori probability { - descriptor_table.emplace("json", 0); search_engine_ptr = std::make_shared>(facade); } @@ -97,7 +95,7 @@ template class MapMatchingPlugin : public BasePlugin return label_with_confidence; } - bool get_candiates(const std::vector& input_coords, std::vector& sub_trace_lengths, Matching::CandidateLists& candidates_lists) + bool getCandiates(const std::vector& input_coords, std::vector& sub_trace_lengths, Matching::CandidateLists& candidates_lists) { double last_distance = coordinate_calculation::great_circle_distance( input_coords[0], @@ -168,6 +166,54 @@ template class MapMatchingPlugin : public BasePlugin return true; } + osrm::json::Object submatchingToJSON(const Matching::SubMatching& sub, const RouteParameters& route_parameters, const InternalRouteResult& raw_route) + { + osrm::json::Object subtrace; + + subtrace.values["confidence"] = sub.confidence; + + if (route_parameters.geometry) + { + DescriptionFactory factory; + FixedPointCoordinate current_coordinate; + factory.SetStartSegment( + raw_route.segment_end_coordinates.front().source_phantom, + raw_route.source_traversed_in_reverse.front()); + for (const auto i : osrm::irange(0, raw_route.unpacked_path_segments.size())) + { + for (const PathData &path_data : raw_route.unpacked_path_segments[i]) + { + current_coordinate = facade->GetCoordinateOfNode(path_data.node); + factory.AppendSegment(current_coordinate, path_data); + } + factory.SetEndSegment(raw_route.segment_end_coordinates[i].target_phantom, + raw_route.target_traversed_in_reverse[i], + raw_route.is_via_leg(i)); + } + subtrace.values["geometry"] = factory.AppendGeometryString(route_parameters.compression); + } + + osrm::json::Array indices; + for (const auto& i : sub.indices) + { + indices.values.emplace_back(i); + } + subtrace.values["indices"] = indices; + + + osrm::json::Array points; + for (const auto& node : sub.nodes) + { + osrm::json::Array coordinate; + coordinate.values.emplace_back(node.location.lat / COORDINATE_PRECISION); + coordinate.values.emplace_back(node.location.lon / COORDINATE_PRECISION); + points.values.emplace_back(coordinate); + } + subtrace.values["matched_points"] = points; + + return subtrace; + } + int HandleRequest(const RouteParameters &route_parameters, osrm::json::Object &json_result) final { // check number of parameters @@ -184,7 +230,7 @@ template class MapMatchingPlugin : public BasePlugin { return 400; } - bool found_candidates = get_candiates(input_coords, sub_trace_lengths, candidates_lists); + bool found_candidates = getCandiates(input_coords, sub_trace_lengths, candidates_lists); if (!found_candidates) { return 400; @@ -219,9 +265,8 @@ template class MapMatchingPlugin : public BasePlugin BOOST_ASSERT(sub.nodes.size() > 1); - // FIXME this is a pretty bad hack. Geometries should obtained directly - // from map_matching. - // run shortest path routing to obtain geometry + // FIXME we only run this to obtain the geometry + // The clean way would be to get this directly from the map matching plugin InternalRouteResult raw_route; PhantomNodes current_phantom_node_pair; for (unsigned i = 0; i < sub.nodes.size() - 1; ++i) @@ -235,51 +280,7 @@ template class MapMatchingPlugin : public BasePlugin std::vector(raw_route.segment_end_coordinates.size(), true), raw_route); - - DescriptorConfig descriptor_config; - - auto iter = descriptor_table.find(route_parameters.output_format); - unsigned descriptor_type = (iter != descriptor_table.end() ? iter->second : 0); - - descriptor_config.zoom_level = route_parameters.zoom_level; - descriptor_config.instructions = false; - descriptor_config.geometry = route_parameters.geometry; - descriptor_config.encode_geometry = route_parameters.compression; - - std::shared_ptr> descriptor; - switch (descriptor_type) - { - // case 0: - // descriptor = std::make_shared>(); - // break; - case 1: - descriptor = std::make_shared>(facade); - break; - // case 2: - // descriptor = std::make_shared>(); - // break; - default: - descriptor = std::make_shared>(facade); - break; - } - - osrm::json::Object temp_result; - descriptor->SetConfig(descriptor_config); - descriptor->Run(raw_route, temp_result); - - osrm::json::Array indices; - for (const auto& i : sub.indices) - { - indices.values.emplace_back(i); - } - - osrm::json::Object subtrace; - subtrace.values["geometry"] = temp_result.values["route_geometry"]; - subtrace.values["confidence"] = sub.confidence; - subtrace.values["indices"] = indices; - subtrace.values["matched_points"] = temp_result.values["via_points"]; - - matchings.values.push_back(subtrace); + matchings.values.emplace_back(submatchingToJSON(sub, route_parameters, raw_route)); } json_result.values["debug"] = debug_info;