Fix non-overlap logic for simplified geometries.

This commit is contained in:
Patrick Niklaus 2016-11-01 20:00:52 +00:00 committed by Patrick Niklaus
parent 8a3aec301a
commit 8f00936790

View File

@ -43,37 +43,11 @@ unsigned calculateOverviewZoomLevel(const std::vector<LegGeometry> &leg_geometri
return util::viewport::getFittedZoom(south_west, north_east); return util::viewport::getFittedZoom(south_west, north_east);
} }
std::vector<util::Coordinate> simplifyGeometry(const std::vector<LegGeometry> &leg_geometries,
const unsigned zoom_level)
{
std::vector<util::Coordinate> overview_geometry;
auto leg_index = 0UL;
for (const auto &geometry : leg_geometries)
{
auto simplified_geometry =
douglasPeucker(geometry.locations.begin(), geometry.locations.end(), zoom_level);
// not the last leg
if (leg_index < leg_geometries.size() - 1)
{
simplified_geometry.pop_back();
}
overview_geometry.insert(
overview_geometry.end(), simplified_geometry.begin(), simplified_geometry.end());
}
return overview_geometry;
}
} }
std::vector<util::Coordinate> assembleOverview(const std::vector<LegGeometry> &leg_geometries, std::vector<util::Coordinate> assembleOverview(const std::vector<LegGeometry> &leg_geometries,
const bool use_simplification) const bool use_simplification)
{ {
if (use_simplification)
{
const auto zoom_level = std::min(18u, calculateOverviewZoomLevel(leg_geometries));
return simplifyGeometry(leg_geometries, zoom_level);
}
BOOST_ASSERT(!use_simplification);
auto overview_size = auto overview_size =
std::accumulate(leg_geometries.begin(), std::accumulate(leg_geometries.begin(),
leg_geometries.end(), leg_geometries.end(),
@ -85,16 +59,37 @@ std::vector<util::Coordinate> assembleOverview(const std::vector<LegGeometry> &l
std::vector<util::Coordinate> overview_geometry; std::vector<util::Coordinate> overview_geometry;
overview_geometry.reserve(overview_size); overview_geometry.reserve(overview_size);
using GeometryIter = decltype(overview_geometry)::const_iterator;
auto leg_reverse_index = leg_geometries.size(); auto leg_reverse_index = leg_geometries.size();
for (const auto &geometry : leg_geometries) const auto insert_without_overlap = [&leg_reverse_index, &overview_geometry](GeometryIter begin, GeometryIter end) {
{ // not the last leg
auto begin = geometry.locations.begin();
auto end = geometry.locations.end();
if (--leg_reverse_index > 0) if (--leg_reverse_index > 0)
{ {
end = std::prev(end); end = std::prev(end);
} }
overview_geometry.insert(overview_geometry.end(), begin, end); overview_geometry.insert(overview_geometry.end(), begin, end);
};
if (use_simplification)
{
const auto zoom_level = std::min(18u, calculateOverviewZoomLevel(leg_geometries));
for (const auto &geometry : leg_geometries)
{
auto simplified = douglasPeucker(geometry.locations.begin(), geometry.locations.end(), zoom_level);
auto begin = simplified.cbegin();
auto end = simplified.cend();
insert_without_overlap(begin, end);
}
}
else
{
for (const auto &geometry : leg_geometries)
{
auto begin = geometry.locations.begin();
auto end = geometry.locations.end();
insert_without_overlap(begin, end);
}
} }
return overview_geometry; return overview_geometry;