Fix geometries type in steps
This commit is contained in:
		
							parent
							
								
									ee8302bf27
								
							
						
					
					
						commit
						77a4530433
					
				| @ -81,7 +81,7 @@ makeWaypoint(const util::Coordinate location, std::string &&name, const Hint &hi | ||||
| util::json::Object makeRouteLeg(guidance::RouteLeg &&leg, util::json::Array &&steps); | ||||
| 
 | ||||
| util::json::Array makeRouteLegs(std::vector<guidance::RouteLeg> &&legs, | ||||
|                                 const std::vector<guidance::LegGeometry> &leg_geometries); | ||||
|                                 std::vector<util::json::Value> step_geometries); | ||||
| } | ||||
| } | ||||
| } // namespace engine
 | ||||
|  | ||||
| @ -112,7 +112,29 @@ class RouteAPI : public BaseAPI | ||||
|             json_overview = MakeGeometry(overview.begin(), overview.end()); | ||||
|         } | ||||
| 
 | ||||
|         return json::makeRoute(route, json::makeRouteLegs(std::move(legs), leg_geometries), | ||||
|         std::vector<util::json::Value> step_geometries; | ||||
|         for (const auto idx : util::irange(0UL, legs.size())) | ||||
|         { | ||||
|             auto &leg_geometry = leg_geometries[idx]; | ||||
|             std::transform( | ||||
|                 legs[idx].steps.begin(), legs[idx].steps.end(), std::back_inserter(step_geometries), | ||||
|                 [this, &leg_geometry](const guidance::RouteStep &step) | ||||
|                 { | ||||
|                     if (parameters.geometries == RouteParameters::GeometriesType::Polyline) | ||||
|                     { | ||||
|                         return static_cast<util::json::Value>( | ||||
|                             json::makePolyline(leg_geometry.locations.begin() + step.geometry_begin, | ||||
|                                                leg_geometry.locations.begin() + step.geometry_end)); | ||||
|                     } | ||||
|                     BOOST_ASSERT(parameters.geometries == RouteParameters::GeometriesType::GeoJSON); | ||||
|                     return static_cast<util::json::Value>(json::makeGeoJSONLineString( | ||||
|                         leg_geometry.locations.begin() + step.geometry_begin, | ||||
|                         leg_geometry.locations.begin() + step.geometry_end)); | ||||
|                 }); | ||||
|         } | ||||
| 
 | ||||
|         return json::makeRoute(route, | ||||
|                                json::makeRouteLegs(std::move(legs), std::move(step_geometries)), | ||||
|                                std::move(json_overview)); | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -133,7 +133,7 @@ util::json::Object makeStepManeuver(const guidance::StepManeuver &maneuver) | ||||
| } | ||||
| 
 | ||||
| util::json::Object makeRouteStep(guidance::RouteStep &&step, | ||||
|                                  boost::optional<util::json::Value> geometry) | ||||
|                                  util::json::Value geometry) | ||||
| { | ||||
|     util::json::Object route_step; | ||||
|     route_step.values["distance"] = step.distance; | ||||
| @ -141,10 +141,7 @@ util::json::Object makeRouteStep(guidance::RouteStep &&step, | ||||
|     route_step.values["name"] = std::move(step.name); | ||||
|     route_step.values["mode"] = detail::modeToString(step.mode); | ||||
|     route_step.values["maneuver"] = makeStepManeuver(step.maneuver); | ||||
|     if (geometry) | ||||
|     { | ||||
|         route_step.values["geometry"] = std::move(*geometry); | ||||
|     } | ||||
|     route_step.values["geometry"] = std::move(geometry); | ||||
|     return route_step; | ||||
| } | ||||
| 
 | ||||
| @ -184,24 +181,20 @@ util::json::Object makeRouteLeg(guidance::RouteLeg &&leg, util::json::Array &&st | ||||
| } | ||||
| 
 | ||||
| util::json::Array makeRouteLegs(std::vector<guidance::RouteLeg> &&legs, | ||||
|                                 const std::vector<guidance::LegGeometry> &leg_geometries) | ||||
|                                 std::vector<util::json::Value> step_geometries) | ||||
| { | ||||
|     util::json::Array json_legs; | ||||
|     auto step_geometry_iter = step_geometries.begin(); | ||||
|     for (const auto idx : boost::irange(0UL, legs.size())) | ||||
|     { | ||||
|         auto &&leg = std::move(legs[idx]); | ||||
|         const auto &leg_geometry = leg_geometries[idx]; | ||||
|         util::json::Array json_steps; | ||||
|         json_steps.values.reserve(leg.steps.size()); | ||||
|         const auto begin_iter = leg_geometry.locations.begin(); | ||||
|         std::transform( | ||||
|             std::make_move_iterator(leg.steps.begin()), std::make_move_iterator(leg.steps.end()), | ||||
|             std::back_inserter(json_steps.values), [&begin_iter](guidance::RouteStep &&step) | ||||
|             std::back_inserter(json_steps.values), [&step_geometry_iter](guidance::RouteStep &&step) | ||||
|             { | ||||
|                 // FIXME we only support polyline here
 | ||||
|                 auto geometry = boost::make_optional<util::json::Value>( | ||||
|                     makePolyline(begin_iter + step.geometry_begin, begin_iter + step.geometry_end)); | ||||
|                 return makeRouteStep(std::move(step), std::move(geometry)); | ||||
|                 return makeRouteStep(std::move(step), std::move(*step_geometry_iter++)); | ||||
|             }); | ||||
|         json_legs.values.push_back(makeRouteLeg(std::move(leg), std::move(json_steps))); | ||||
|     } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user