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:
parent
0817cd6dfd
commit
24b01fae00
@ -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);
|
|
||||||
|
|
||||||
coordinates.back() = util::coordinate_calculation::interpolateLinear(
|
if (distance_between_last_coordinates > 0)
|
||||||
interpolation_factor, *(coordinates.end() - 2), coordinates.back());
|
{
|
||||||
|
const auto interpolation_factor = ComputeInterpolationFactor(
|
||||||
|
length_cache.back(), 0, distance_between_last_coordinates);
|
||||||
|
|
||||||
|
coordinates.back() = util::coordinate_calculation::interpolateLinear(
|
||||||
|
interpolation_factor, *(coordinates.end() - 2), coordinates.back());
|
||||||
|
}
|
||||||
return coordinates;
|
return coordinates;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user