From 33f083b213063c547c82493ef0dc5ddf4ec8074e Mon Sep 17 00:00:00 2001 From: Patrick Niklaus Date: Fri, 4 Mar 2016 00:36:36 +0100 Subject: [PATCH] Fix numerical problems with polyline --- src/engine/polyline_compressor.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/engine/polyline_compressor.cpp b/src/engine/polyline_compressor.cpp index 7f3fd2cc3..31907cb5b 100644 --- a/src/engine/polyline_compressor.cpp +++ b/src/engine/polyline_compressor.cpp @@ -68,16 +68,16 @@ std::string encodePolyline(CoordVectorForwardIter begin, CoordVectorForwardIter std::vector delta_numbers; BOOST_ASSERT(size > 0); delta_numbers.reserve((size - 1) * 2); - util::Coordinate previous_coordinate{util::FixedLongitude(0), util::FixedLatitude(0)}; - std::for_each(begin, end, [&delta_numbers, &previous_coordinate](const util::Coordinate loc) + int current_lat = 0; + int current_lon = 0; + std::for_each(begin, end, [&delta_numbers, ¤t_lat, ¤t_lon](const util::Coordinate loc) { - const int lat_diff = static_cast(loc.lat - previous_coordinate.lat) * - detail::COORDINATE_TO_POLYLINE; - const int lon_diff = static_cast(loc.lon - previous_coordinate.lon) * - detail::COORDINATE_TO_POLYLINE; + const int lat_diff = std::round(static_cast(loc.lat) * detail::COORDINATE_TO_POLYLINE) - current_lat; + const int lon_diff = std::round(static_cast(loc.lon) * detail::COORDINATE_TO_POLYLINE) - current_lon; delta_numbers.emplace_back(lat_diff); delta_numbers.emplace_back(lon_diff); - previous_coordinate = loc; + current_lat += lat_diff; + current_lon += lon_diff; }); return encode(delta_numbers); }