Replace descriptor code with code that generates only geometry
This commit is contained in:
		
							parent
							
								
									adbca39fef
								
							
						
					
					
						commit
						e8e637c4f2
					
				@ -52,7 +52,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
template <class DataFacadeT> class MapMatchingPlugin : public BasePlugin
 | 
			
		||||
{
 | 
			
		||||
  private:
 | 
			
		||||
    std::unordered_map<std::string, unsigned> descriptor_table;
 | 
			
		||||
    std::shared_ptr<SearchEngine<DataFacadeT>> search_engine_ptr;
 | 
			
		||||
 | 
			
		||||
    using ClassifierT = BayesClassifier<LaplaceDistribution, LaplaceDistribution, double>;
 | 
			
		||||
@ -68,7 +67,6 @@ template <class DataFacadeT> 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<SearchEngine<DataFacadeT>>(facade);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -97,7 +95,7 @@ template <class DataFacadeT> class MapMatchingPlugin : public BasePlugin
 | 
			
		||||
        return label_with_confidence;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool get_candiates(const std::vector<FixedPointCoordinate>& input_coords, std::vector<double>& sub_trace_lengths, Matching::CandidateLists& candidates_lists)
 | 
			
		||||
    bool getCandiates(const std::vector<FixedPointCoordinate>& input_coords, std::vector<double>& sub_trace_lengths, Matching::CandidateLists& candidates_lists)
 | 
			
		||||
    {
 | 
			
		||||
        double last_distance = coordinate_calculation::great_circle_distance(
 | 
			
		||||
            input_coords[0],
 | 
			
		||||
@ -168,6 +166,54 @@ template <class DataFacadeT> 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<std::size_t>(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 DataFacadeT> 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 DataFacadeT> 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 DataFacadeT> class MapMatchingPlugin : public BasePlugin
 | 
			
		||||
                std::vector<bool>(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<BaseDescriptor<DataFacadeT>> descriptor;
 | 
			
		||||
            switch (descriptor_type)
 | 
			
		||||
            {
 | 
			
		||||
            // case 0:
 | 
			
		||||
            //     descriptor = std::make_shared<JSONDescriptor<DataFacadeT>>();
 | 
			
		||||
            //     break;
 | 
			
		||||
            case 1:
 | 
			
		||||
                descriptor = std::make_shared<GPXDescriptor<DataFacadeT>>(facade);
 | 
			
		||||
                break;
 | 
			
		||||
            // case 2:
 | 
			
		||||
            //      descriptor = std::make_shared<GEOJSONDescriptor<DataFacadeT>>();
 | 
			
		||||
            //      break;
 | 
			
		||||
            default:
 | 
			
		||||
                descriptor = std::make_shared<JSONDescriptor<DataFacadeT>>(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;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user