From 5f9ccadd6c551b84ede162573573ce5436b7bdcd Mon Sep 17 00:00:00 2001 From: Patrick Niklaus Date: Wed, 20 Apr 2016 20:49:54 +0200 Subject: [PATCH] If geometry is only one point, encode as Point not as LineString --- include/engine/api/json_factory.hpp | 21 ++++++++++++++++----- include/engine/api/route_api.hpp | 4 ++-- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/include/engine/api/json_factory.hpp b/include/engine/api/json_factory.hpp index 0b1e5f382..15a49f07e 100644 --- a/include/engine/api/json_factory.hpp +++ b/include/engine/api/json_factory.hpp @@ -48,13 +48,24 @@ template util::json::String makePolyline(ForwardIter begi } template -util::json::Object makeGeoJSONLineString(ForwardIter begin, ForwardIter end) +util::json::Object makeGeoJSONGeometry(ForwardIter begin, ForwardIter end) { + auto distance = std::distance(begin, end); util::json::Object geojson; - geojson.values["type"] = "LineString"; - util::json::Array coordinates; - std::transform(begin, end, std::back_inserter(coordinates.values), &detail::coordinateToLonLat); - geojson.values["coordinates"] = std::move(coordinates); + if (distance > 1) + { + geojson.values["type"] = "LineString"; + util::json::Array coordinates; + std::transform(begin, end, std::back_inserter(coordinates.values), &detail::coordinateToLonLat); + geojson.values["coordinates"] = std::move(coordinates); + } + else if (distance > 0) + { + geojson.values["type"] = "Point"; + util::json::Array coordinates; + coordinates.values.push_back(detail::coordinateToLonLat(*begin)); + geojson.values["coordinates"] = std::move(coordinates); + } return geojson; } diff --git a/include/engine/api/route_api.hpp b/include/engine/api/route_api.hpp index f2b7a730d..b7040ad2e 100644 --- a/include/engine/api/route_api.hpp +++ b/include/engine/api/route_api.hpp @@ -69,7 +69,7 @@ class RouteAPI : public BaseAPI } BOOST_ASSERT(parameters.geometries == RouteParameters::GeometriesType::GeoJSON); - return json::makeGeoJSONLineString(begin, end); + return json::makeGeoJSONGeometry(begin, end); } util::json::Object MakeRoute(const std::vector &segment_end_coordinates, @@ -169,7 +169,7 @@ class RouteAPI : public BaseAPI leg_geometry.locations.begin() + step.geometry_end)); } BOOST_ASSERT(parameters.geometries == RouteParameters::GeometriesType::GeoJSON); - return static_cast(json::makeGeoJSONLineString( + return static_cast(json::makeGeoJSONGeometry( leg_geometry.locations.begin() + step.geometry_begin, leg_geometry.locations.begin() + step.geometry_end)); });