diff --git a/include/engine/polyline_compressor.hpp b/include/engine/polyline_compressor.hpp index 9a7ba4d02..8f7b695bf 100644 --- a/include/engine/polyline_compressor.hpp +++ b/include/engine/polyline_compressor.hpp @@ -2,6 +2,7 @@ #define POLYLINECOMPRESSOR_H_ #include "osrm/coordinate.hpp" +#include "engine/segment_information.hpp" #include #include @@ -10,21 +11,13 @@ namespace osrm { namespace engine { +// Encodes geometry into polyline format. +// See: https://developers.google.com/maps/documentation/utilities/polylinealgorithm +std::string polylineEncode(const std::vector &geometry); -struct SegmentInformation; - -class PolylineCompressor -{ - private: - std::string encode_vector(std::vector &numbers) const; - - std::string encode_number(const int number_to_encode) const; - - public: - std::string get_encoded_string(const std::vector &polyline) const; - - std::vector decode_string(const std::string &geometry_string) const; -}; +// Decodes geometry from polyline format +// See: https://developers.google.com/maps/documentation/utilities/polylinealgorithm +std::vector polylineDecode(const std::string &polyline); } } diff --git a/src/engine/polyline_compressor.cpp b/src/engine/polyline_compressor.cpp index 042653084..2af6735a3 100644 --- a/src/engine/polyline_compressor.cpp +++ b/src/engine/polyline_compressor.cpp @@ -1,33 +1,15 @@ #include "engine/polyline_compressor.hpp" -#include "engine/segment_information.hpp" -#include "osrm/coordinate.hpp" +#include namespace osrm { namespace engine { - -std::string PolylineCompressor::encode_vector(std::vector &numbers) const +namespace /*detail*/ // anonymous to keep TU local { - std::string output; - const auto end = numbers.size(); - for (std::size_t i = 0; i < end; ++i) - { - numbers[i] <<= 1; - if (numbers[i] < 0) - { - numbers[i] = ~(numbers[i]); - } - } - for (const int number : numbers) - { - output += encode_number(number); - } - return output; -} -std::string PolylineCompressor::encode_number(int number_to_encode) const +std::string encode(int number_to_encode) { std::string output; while (number_to_encode >= 0x20) @@ -42,8 +24,27 @@ std::string PolylineCompressor::encode_number(int number_to_encode) const return output; } -std::string -PolylineCompressor::get_encoded_string(const std::vector &polyline) const +std::string encode(std::vector &numbers) +{ + std::string output; + const auto end = numbers.size(); + for (std::size_t i = 0; i < end; ++i) + { + numbers[i] <<= 1; + if (numbers[i] < 0) + { + numbers[i] = ~(numbers[i]); + } + } + for (const int number : numbers) + { + output += encode(number); + } + return output; +} +} // anonymous ns + +std::string polylineEncode(const std::vector &polyline) { if (polyline.empty()) { @@ -64,11 +65,10 @@ PolylineCompressor::get_encoded_string(const std::vector &po previous_coordinate = segment.location; } } - return encode_vector(delta_numbers); + return encode(delta_numbers); } -std::vector -PolylineCompressor::decode_string(const std::string &geometry_string) const +std::vector polylineDecode(const std::string &geometry_string) { std::vector new_coordinates; int index = 0, len = geometry_string.size(); diff --git a/src/engine/polyline_formatter.cpp b/src/engine/polyline_formatter.cpp index 0b22ddb24..617ef7977 100644 --- a/src/engine/polyline_formatter.cpp +++ b/src/engine/polyline_formatter.cpp @@ -5,6 +5,8 @@ #include "osrm/coordinate.hpp" +#include + namespace osrm { namespace engine @@ -13,7 +15,7 @@ namespace engine util::json::String PolylineFormatter::printEncodedString(const std::vector &polyline) const { - return util::json::String(PolylineCompressor().get_encoded_string(polyline)); + return util::json::String(polylineEncode(polyline)); } util::json::Array diff --git a/src/engine/route_parameters.cpp b/src/engine/route_parameters.cpp index 6565896f3..bbcf40def 100644 --- a/src/engine/route_parameters.cpp +++ b/src/engine/route_parameters.cpp @@ -7,6 +7,9 @@ #include "engine/polyline_compressor.hpp" +#include +#include + namespace osrm { namespace engine @@ -153,8 +156,7 @@ void RouteParameters::AddSource(const boost::fusion::vector &rec void RouteParameters::SetCoordinatesFromGeometry(const std::string &geometry_string) { - PolylineCompressor pc; - coordinates = pc.decode_string(geometry_string); + coordinates = polylineDecode(geometry_string); } } } diff --git a/unit_tests/engine/geometry_string.cpp b/unit_tests/engine/geometry_string.cpp index 182cabda8..235df9b6b 100644 --- a/unit_tests/engine/geometry_string.cpp +++ b/unit_tests/engine/geometry_string.cpp @@ -18,8 +18,7 @@ BOOST_AUTO_TEST_CASE(decode) { // Polyline string for the 5 coordinates const std::string polyline = "_gjaR_gjaR_pR_ibE_pR_ibE_pR_ibE_pR_ibE"; - PolylineCompressor pc; - std::vector coords = pc.decode_string(polyline); + const auto coords = polylineDecode(polyline); // Test coordinates; these would be the coordinates we give the loc parameter, // e.g. loc=10.00,10.0&loc=10.01,10.1...