/srv/osrm/osrm-backend/include/engine
NameSizeModeActions
api/-0755rm
datafacade/-0755rm
guidance/-0755rm
map_matching/-0755rm
plugins/-0755rm
routing_algorithms/-0755rm
trip/-0755rm
algorithm.hpp29740644editdlrm
approach.hpp15300644editdlrm
base64.hpp46000644editdlrm
bearing.hpp18060644editdlrm
datafacade.hpp4080644editdlrm
datafacade_factory.hpp54490644editdlrm
datafacade_provider.hpp34680644editdlrm
data_watchdog.hpp61400644editdlrm
douglas_peucker.hpp26060644editdlrm
engine.hpp54530644editdlrm
engine_config.hpp32140644editdlrm
geospatial_query.hpp273930644editdlrm
hint.hpp29420644editdlrm
internal_route_result.hpp60200644editdlrm
phantom_node.hpp109380644editdlrm
polyline_compressor.hpp28750644editdlrm
routing_algorithms.hpp93990644editdlrm
search_engine_data.hpp43800644editdlrm
status.hpp15340644editdlrm
Edit: /srv/osrm/osrm-backend/include/engine/polyline_compressor.hpp (2875B)
#ifndef POLYLINECOMPRESSOR_H_ #define POLYLINECOMPRESSOR_H_ #include "util/coordinate.hpp" #include #include #include #include namespace osrm::engine { namespace detail { std::string encode(std::vector &numbers); std::int32_t decode_polyline_integer(std::string::const_iterator &first, std::string::const_iterator last); } // namespace detail using CoordVectorForwardIter = std::vector::const_iterator; // Encodes geometry into polyline format. // See: https://developers.google.com/maps/documentation/utilities/polylinealgorithm template std::string encodePolyline(CoordVectorForwardIter begin, CoordVectorForwardIter end) { double coordinate_to_polyline = POLYLINE_PRECISION / COORDINATE_PRECISION; auto size = std::distance(begin, end); if (size == 0) { return {}; } std::vector delta_numbers; BOOST_ASSERT(size > 0); delta_numbers.reserve((size - 1) * 2); int current_lat = 0; int current_lon = 0; std::for_each( begin, end, [&delta_numbers, ¤t_lat, ¤t_lon, coordinate_to_polyline]( const util::Coordinate loc) { const int lat_diff = std::round(static_cast(loc.lat) * coordinate_to_polyline) - current_lat; const int lon_diff = std::round(static_cast(loc.lon) * coordinate_to_polyline) - current_lon; delta_numbers.emplace_back(lat_diff); delta_numbers.emplace_back(lon_diff); current_lat += lat_diff; current_lon += lon_diff; }); return detail::encode(delta_numbers); } // Decodes geometry from polyline format // See: https://developers.google.com/maps/documentation/utilities/polylinealgorithm template std::vector decodePolyline(const std::string &polyline) { double polyline_to_coordinate = COORDINATE_PRECISION / POLYLINE_PRECISION; std::vector coordinates; std::int32_t latitude = 0, longitude = 0; std::string::const_iterator first = polyline.begin(); const std::string::const_iterator last = polyline.end(); while (first != last) { const auto dlat = detail::decode_polyline_integer(first, last); const auto dlon = detail::decode_polyline_integer(first, last); latitude += dlat; longitude += dlon; coordinates.emplace_back(util::Coordinate{ util::FixedLongitude{static_cast(longitude * polyline_to_coordinate)}, util::FixedLatitude{static_cast(latitude * polyline_to_coordinate)}}); } return coordinates; } } // namespace osrm::engine #endif /* POLYLINECOMPRESSOR_H_ */