syncronize geometry and steps after post-processing
This commit is contained in:
		
							parent
							
								
									83e6679d61
								
							
						
					
					
						commit
						cac1298864
					
				@ -127,6 +127,7 @@ class RouteAPI : public BaseAPI
 | 
				
			|||||||
                 */
 | 
					                 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                 leg.steps = guidance::postProcess(std::move(steps));
 | 
					                 leg.steps = guidance::postProcess(std::move(steps));
 | 
				
			||||||
 | 
					                 leg_geometry = guidance::resyncGeometry(std::move(leg_geometry),leg.steps);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            leg_geometries.push_back(std::move(leg_geometry));
 | 
					            leg_geometries.push_back(std::move(leg_geometry));
 | 
				
			||||||
 | 
				
			|||||||
@ -51,7 +51,7 @@ LegGeometry assembleGeometry(const DataFacadeT &facade,
 | 
				
			|||||||
        current_distance +=
 | 
					        current_distance +=
 | 
				
			||||||
            util::coordinate_calculation::haversineDistance(prev_coordinate, coordinate);
 | 
					            util::coordinate_calculation::haversineDistance(prev_coordinate, coordinate);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //all changes to this check have to be matched with assemble_steps
 | 
					        // all changes to this check have to be matched with assemble_steps
 | 
				
			||||||
        if (path_point.turn_instruction.type != extractor::guidance::TurnType::NoTurn)
 | 
					        if (path_point.turn_instruction.type != extractor::guidance::TurnType::NoTurn)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            geometry.segment_distances.push_back(current_distance);
 | 
					            geometry.segment_distances.push_back(current_distance);
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,7 @@
 | 
				
			|||||||
#define ENGINE_GUIDANCE_POST_PROCESSING_HPP
 | 
					#define ENGINE_GUIDANCE_POST_PROCESSING_HPP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "engine/guidance/route_step.hpp"
 | 
					#include "engine/guidance/route_step.hpp"
 | 
				
			||||||
 | 
					#include "engine/guidance/leg_geometry.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <vector>
 | 
					#include <vector>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -12,9 +13,16 @@ namespace engine
 | 
				
			|||||||
namespace guidance
 | 
					namespace guidance
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//passed as none-reference to modify in-place and move out again
 | 
					// passed as none-reference to modify in-place and move out again
 | 
				
			||||||
std::vector<RouteStep> postProcess(std::vector<RouteStep> steps);
 | 
					std::vector<RouteStep> postProcess(std::vector<RouteStep> steps);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// postProcess will break the connection between the leg geometry
 | 
				
			||||||
 | 
					// for which a segment is supposed to represent exactly the coordinates
 | 
				
			||||||
 | 
					// between routing maneuvers and the route steps itself.
 | 
				
			||||||
 | 
					// If required, we can get both in sync again using this function.
 | 
				
			||||||
 | 
					// Move in LegGeometry for modification in place.
 | 
				
			||||||
 | 
					LegGeometry resyncGeometry(LegGeometry leg_geometry, const std::vector<RouteStep> &steps);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace guidance
 | 
					} // namespace guidance
 | 
				
			||||||
} // namespace engine
 | 
					} // namespace engine
 | 
				
			||||||
} // namespace osrm
 | 
					} // namespace osrm
 | 
				
			||||||
 | 
				
			|||||||
@ -150,10 +150,10 @@ util::json::Object makeStepManeuver(const guidance::StepManeuver &maneuver)
 | 
				
			|||||||
    if (maneuver.exit != 0)
 | 
					    if (maneuver.exit != 0)
 | 
				
			||||||
        step_maneuver.values["exit"] = maneuver.exit;
 | 
					        step_maneuver.values["exit"] = maneuver.exit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //TODO currently we need this to comply with the api.
 | 
					    // TODO currently we need this to comply with the api.
 | 
				
			||||||
    //We should move this to an additional entry, the moment we
 | 
					    // We should move this to an additional entry, the moment we
 | 
				
			||||||
    //actually compute the correct locations of the intersections
 | 
					    // actually compute the correct locations of the intersections
 | 
				
			||||||
    if (!maneuver.intersections.empty() && maneuver.exit == 0 )
 | 
					    if (!maneuver.intersections.empty() && maneuver.exit == 0)
 | 
				
			||||||
        step_maneuver.values["exit"] = maneuver.intersections.size();
 | 
					        step_maneuver.values["exit"] = maneuver.intersections.size();
 | 
				
			||||||
    return step_maneuver;
 | 
					    return step_maneuver;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -54,9 +54,9 @@ void fixFinalRoundabout(std::vector<RouteStep> &steps)
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        else if (propagation_step.maneuver.instruction.type == TurnType::StayOnRoundabout)
 | 
					        else if (propagation_step.maneuver.instruction.type == TurnType::StayOnRoundabout)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            //TODO this operates on the data that is in the instructions.
 | 
					            // TODO this operates on the data that is in the instructions.
 | 
				
			||||||
            //We are missing out on the final segment after the last stay-on-roundabout
 | 
					            // We are missing out on the final segment after the last stay-on-roundabout
 | 
				
			||||||
            //instruction though. it is not contained somewhere until now
 | 
					            // instruction though. it is not contained somewhere until now
 | 
				
			||||||
            steps[propagation_index - 1] =
 | 
					            steps[propagation_index - 1] =
 | 
				
			||||||
                forwardInto(std::move(steps[propagation_index - 1]), propagation_step);
 | 
					                forwardInto(std::move(steps[propagation_index - 1]), propagation_step);
 | 
				
			||||||
            propagation_step.maneuver.instruction =
 | 
					            propagation_step.maneuver.instruction =
 | 
				
			||||||
@ -292,6 +292,29 @@ std::vector<RouteStep> postProcess(std::vector<RouteStep> steps)
 | 
				
			|||||||
    return steps;
 | 
					    return steps;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LegGeometry resyncGeometry(LegGeometry leg_geometry, const std::vector<RouteStep> &steps)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    // The geometry uses an adjacency array-like structure for representation.
 | 
				
			||||||
 | 
					    // To sync it back up with the steps, we cann add a segment for every step.
 | 
				
			||||||
 | 
					    leg_geometry.segment_offsets.clear();
 | 
				
			||||||
 | 
					    leg_geometry.segment_distances.clear();
 | 
				
			||||||
 | 
					    leg_geometry.segment_offsets.push_back(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (const auto &step : steps)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        leg_geometry.segment_distances.push_back(step.distance);
 | 
				
			||||||
 | 
					        // the leg geometry does not follow the begin/end-convetion. So we have to subtract one
 | 
				
			||||||
 | 
					        // to get the back-index.
 | 
				
			||||||
 | 
					        leg_geometry.segment_offsets.push_back(step.geometry_end - 1);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //remove the data fromt the reached-target step again
 | 
				
			||||||
 | 
					    leg_geometry.segment_offsets.pop_back();
 | 
				
			||||||
 | 
					    leg_geometry.segment_distances.pop_back();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return leg_geometry;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace guidance
 | 
					} // namespace guidance
 | 
				
			||||||
} // namespace engine
 | 
					} // namespace engine
 | 
				
			||||||
} // namespace osrm
 | 
					} // namespace osrm
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user