fix extraction of coordinate along a way (#3397)

Also fix interpolation when coordinates are duplicated at the end of the vector
This commit is contained in:
Moritz Kobitzsch 2016-12-02 22:11:04 +01:00 committed by Daniel Patterson
parent 0817cd6dfd
commit 24b01fae00

View File

@ -447,18 +447,17 @@ CoordinateExtractor::ExtractCoordinateAtLength(const double distance,
// find the beginning fo the segment (begin here and above for the length cache need to match // find the beginning fo the segment (begin here and above for the length cache need to match
// up!) // up!)
const auto coordinate_base = const auto coordinate_after =
std::find_if(coordinates.begin() + 1, coordinates.end(), find_coordinate_at_distance) - 1; std::find_if(coordinates.begin() + 1, coordinates.end(), find_coordinate_at_distance);
if (static_cast<std::size_t>(std::distance(coordinates.begin(), coordinate_base) + 1) >= if (coordinate_after == coordinates.end())
coordinates.size())
return coordinates.back(); return coordinates.back();
const auto interpolation_factor = const auto interpolation_factor =
ComputeInterpolationFactor(distance - accumulated_distance, 0, *length_cache_itr); ComputeInterpolationFactor(distance - accumulated_distance, 0, *length_cache_itr);
return util::coordinate_calculation::interpolateLinear( return util::coordinate_calculation::interpolateLinear(
interpolation_factor, *coordinate_base, *(coordinate_base + 1)); interpolation_factor, *std::prev(coordinate_after), *coordinate_after);
} }
util::Coordinate CoordinateExtractor::ExtractCoordinateAtLength( util::Coordinate CoordinateExtractor::ExtractCoordinateAtLength(
@ -475,26 +474,29 @@ util::Coordinate CoordinateExtractor::ExtractCoordinateAtLength(
util::coordinate_calculation::haversineDistance(last_coordinate, coordinate); util::coordinate_calculation::haversineDistance(last_coordinate, coordinate);
const auto result = (accumulated_distance + segment_distance) >= distance; const auto result = (accumulated_distance + segment_distance) >= distance;
if (!result) if (!result)
{
accumulated_distance += segment_distance; accumulated_distance += segment_distance;
last_coordinate = coordinate;
}
return result; return result;
}; };
// find the begin of the segment containing the coordinate // find the begin of the segment containing the coordinate
const auto coordinate_base = const auto coordinate_after =
std::find_if(coordinates.begin() + 1, coordinates.end(), coordinate_at_distance) - 1; std::find_if(coordinates.begin() + 1, coordinates.end(), coordinate_at_distance);
if (static_cast<std::size_t>(std::distance(coordinates.begin(), coordinate_base) + 1) >= if (coordinate_after == coordinates.end())
coordinates.size())
return coordinates.back(); return coordinates.back();
const auto interpolation_factor = ComputeInterpolationFactor( const auto interpolation_factor =
distance - accumulated_distance, ComputeInterpolationFactor(distance - accumulated_distance,
0, 0,
util::coordinate_calculation::haversineDistance(*coordinate_base, *(coordinate_base + 1))); util::coordinate_calculation::haversineDistance(
*std::prev(coordinate_after), *coordinate_after));
return util::coordinate_calculation::interpolateLinear( return util::coordinate_calculation::interpolateLinear(
interpolation_factor, *coordinate_base, *(coordinate_base + 1)); interpolation_factor, *std::prev(coordinate_after), *coordinate_after);
} }
util::Coordinate CoordinateExtractor::GetCoordinateCloseToTurn(const NodeID from_node, util::Coordinate CoordinateExtractor::GetCoordinateCloseToTurn(const NodeID from_node,
@ -928,11 +930,15 @@ CoordinateExtractor::TrimCoordinatesToLength(std::vector<util::Coordinate> coord
const auto distance_between_last_coordinates = const auto distance_between_last_coordinates =
util::coordinate_calculation::haversineDistance(*(coordinates.end() - 2), util::coordinate_calculation::haversineDistance(*(coordinates.end() - 2),
*(coordinates.end() - 1)); *(coordinates.end() - 1));
const auto interpolation_factor =
ComputeInterpolationFactor(length_cache.back(), 0, distance_between_last_coordinates); if (distance_between_last_coordinates > 0)
{
const auto interpolation_factor = ComputeInterpolationFactor(
length_cache.back(), 0, distance_between_last_coordinates);
coordinates.back() = util::coordinate_calculation::interpolateLinear( coordinates.back() = util::coordinate_calculation::interpolateLinear(
interpolation_factor, *(coordinates.end() - 2), coordinates.back()); interpolation_factor, *(coordinates.end() - 2), coordinates.back());
}
return coordinates; return coordinates;
} }
else else