diff --git a/include/engine/api/json_factory.hpp b/include/engine/api/json_factory.hpp index bbf60603a..cb7ee51b8 100644 --- a/include/engine/api/json_factory.hpp +++ b/include/engine/api/json_factory.hpp @@ -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 &&legs, - const std::vector &leg_geometries); + std::vector step_geometries); } } } // namespace engine diff --git a/include/engine/api/route_api.hpp b/include/engine/api/route_api.hpp index c9bd69866..c240fa29c 100644 --- a/include/engine/api/route_api.hpp +++ b/include/engine/api/route_api.hpp @@ -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 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( + 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(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)); } diff --git a/src/engine/api/josn_factory.cpp b/src/engine/api/json_factory.cpp similarity index 89% rename from src/engine/api/josn_factory.cpp rename to src/engine/api/json_factory.cpp index fb0309d74..c0a52dc02 100644 --- a/src/engine/api/josn_factory.cpp +++ b/src/engine/api/json_factory.cpp @@ -133,7 +133,7 @@ util::json::Object makeStepManeuver(const guidance::StepManeuver &maneuver) } util::json::Object makeRouteStep(guidance::RouteStep &&step, - boost::optional 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 &&legs, - const std::vector &leg_geometries) + std::vector 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( - 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))); }