From 9b0d3dfaeb259ed9bb22fb4fe462d6397ce8ab65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Gru=C3=9F?= Date: Sun, 31 May 2015 13:57:27 +0200 Subject: [PATCH] polyline string as parameter added --- algorithms/polyline_compressor.cpp | 38 ++++++++++++++++++++++++++++ algorithms/polyline_compressor.hpp | 4 +++ data_structures/route_parameters.cpp | 8 ++++++ include/osrm/route_parameters.hpp | 2 ++ server/api_grammar.hpp | 7 +++-- 5 files changed, 57 insertions(+), 2 deletions(-) diff --git a/algorithms/polyline_compressor.cpp b/algorithms/polyline_compressor.cpp index d5fd5828b..f4eca7350 100644 --- a/algorithms/polyline_compressor.cpp +++ b/algorithms/polyline_compressor.cpp @@ -88,3 +88,41 @@ PolylineCompressor::get_encoded_string(const std::vector &po } return encode_vector(delta_numbers); } + +std::vector PolylineCompressor::decode_string(const std::string geometry_string) const +{ + std::vector new_coordinates; + int index = 0, len = geometry_string.size(); + int lat = 0, lng = 0; + + while (index < len) + { + int b, shift = 0, result = 0; + do + { + b = geometry_string.at(index++) - 63; + result |= (b & 0x1f) << shift; + shift += 5; + } while (b >= 0x20); + int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); + lat += dlat; + + shift = 0; + result = 0; + do + { + b = geometry_string.at(index++) - 63; + result |= (b & 0x1f) << shift; + shift += 5; + } while (b >= 0x20); + int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); + lng += dlng; + + FixedPointCoordinate p; + p.lat = COORDINATE_PRECISION * (((double) lat / 1E5)); + p.lon = COORDINATE_PRECISION * (((double) lng / 1E5)); + new_coordinates.push_back(p); + } + + return new_coordinates; +} diff --git a/algorithms/polyline_compressor.hpp b/algorithms/polyline_compressor.hpp index 933ac7afa..82440d9e2 100644 --- a/algorithms/polyline_compressor.hpp +++ b/algorithms/polyline_compressor.hpp @@ -30,6 +30,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. struct SegmentInformation; +#include + #include #include @@ -42,6 +44,8 @@ class PolylineCompressor public: std::string get_encoded_string(const std::vector &polyline) const; + + std::vector decode_string(const std::string geometry_string) const; }; #endif /* POLYLINECOMPRESSOR_H_ */ diff --git a/data_structures/route_parameters.cpp b/data_structures/route_parameters.cpp index 3b615e2c4..86b955358 100644 --- a/data_structures/route_parameters.cpp +++ b/data_structures/route_parameters.cpp @@ -31,6 +31,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include +#include "../algorithms/polyline_compressor.hpp" + RouteParameters::RouteParameters() : zoom_level(18), print_instructions(false), alternate_route(true), geometry(true), compression(true), deprecatedAPI(false), uturn_default(false), classify(false), @@ -131,3 +133,9 @@ void RouteParameters::addCoordinate( static_cast(COORDINATE_PRECISION * boost::fusion::at_c<0>(received_coordinates)), static_cast(COORDINATE_PRECISION * boost::fusion::at_c<1>(received_coordinates))); } + +void RouteParameters::getCoordinatesFromGeometry(const std::string geometry_string) +{ + PolylineCompressor pc; + coordinates = pc.decode_string(geometry_string); +} diff --git a/include/osrm/route_parameters.hpp b/include/osrm/route_parameters.hpp index 9babbd763..bc413d73b 100644 --- a/include/osrm/route_parameters.hpp +++ b/include/osrm/route_parameters.hpp @@ -78,6 +78,8 @@ struct RouteParameters void setCompressionFlag(const bool flag); void addCoordinate(const boost::fusion::vector &received_coordinates); + + void getCoordinatesFromGeometry(const std::string geometry_string); short zoom_level; bool print_instructions; diff --git a/server/api_grammar.hpp b/server/api_grammar.hpp index a629cfbf7..158f1f7cc 100644 --- a/server/api_grammar.hpp +++ b/server/api_grammar.hpp @@ -42,7 +42,7 @@ template struct APIGrammar : qi::grammar> -(uturns); query = ('?') >> (+(zoom | output | jsonp | checksum | location | hint | timestamp | u | cmp | language | instruction | geometry | alt_route | old_API | num_results | - matching_beta | gps_precision | classify)); + matching_beta | gps_precision | classify | geometry_string)); zoom = (-qi::lit('&')) >> qi::lit('z') >> '=' >> qi::short_[boost::bind(&HandlerT::setZoomLevel, handler, ::_1)]; @@ -83,17 +83,20 @@ template struct APIGrammar : qi::grammar> qi::lit("classify") >> '=' >> qi::bool_[boost::bind(&HandlerT::setClassify, handler, ::_1)]; + geometry_string = (-qi::lit('&')) >> qi::lit("geometry_string") >> '=' >> + stringforPolyline[boost::bind(&HandlerT::getCoordinatesFromGeometry, handler, ::_1)]; string = +(qi::char_("a-zA-Z")); stringwithDot = +(qi::char_("a-zA-Z0-9_.-")); stringwithPercent = +(qi::char_("a-zA-Z0-9_.-") | qi::char_('[') | qi::char_(']') | (qi::char_('%') >> qi::char_("0-9A-Z") >> qi::char_("0-9A-Z"))); + stringforPolyline = +(qi::char_("a-zA-Z0-9_.-[]{}@?|\\%~`^")); } qi::rule api_call, query; qi::rule service, zoom, output, string, jsonp, checksum, location, hint, timestamp, stringwithDot, stringwithPercent, language, instruction, geometry, cmp, alt_route, u, - uturns, old_API, num_results, matching_beta, gps_precision, classify; + uturns, old_API, num_results, matching_beta, gps_precision, classify, geometry_string, stringforPolyline; HandlerT *handler; };