MCPcopy Create free account
hub / github.com/Project-OSRM/osrm-backend / assembleOverview

Function assembleOverview

src/engine/guidance/assemble_overview.cpp:38–84  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

36} // namespace
37
38std::vector<util::Coordinate> assembleOverview(const std::vector<LegGeometry> &leg_geometries,
39 const bool use_simplification)
40{
41 auto overview_size = std::accumulate(leg_geometries.begin(),
42 leg_geometries.end(),
43 0,
44 [](const std::size_t sum, const LegGeometry &leg_geometry)
45 { return sum + leg_geometry.locations.size(); }) -
46 leg_geometries.size() + 1;
47 std::vector<util::Coordinate> overview_geometry;
48 overview_geometry.reserve(overview_size);
49
50 using GeometryIter = decltype(overview_geometry)::const_iterator;
51
52 auto leg_reverse_index = leg_geometries.size();
53 const auto insert_without_overlap =
54 [&leg_reverse_index, &overview_geometry](GeometryIter begin, GeometryIter end)
55 {
56 // not the last leg
57 if (leg_reverse_index > 1)
58 {
59 --leg_reverse_index;
60 end = std::prev(end);
61 }
62 overview_geometry.insert(overview_geometry.end(), begin, end);
63 };
64
65 if (use_simplification)
66 {
67 const auto zoom_level = std::min(18u, calculateOverviewZoomLevel(leg_geometries));
68 for (const auto &geometry : leg_geometries)
69 {
70 const auto simplified =
71 douglasPeucker(geometry.locations.begin(), geometry.locations.end(), zoom_level);
72 insert_without_overlap(simplified.begin(), simplified.end());
73 }
74 }
75 else
76 {
77 for (const auto &geometry : leg_geometries)
78 {
79 insert_without_overlap(geometry.locations.begin(), geometry.locations.end());
80 }
81 }
82
83 return overview_geometry;
84}
85
86} // namespace osrm::engine::guidance

Callers 1

MakeOverviewMethod · 0.85

Calls 7

insertMethod · 0.80
douglasPeuckerFunction · 0.50
beginMethod · 0.45
endMethod · 0.45
sizeMethod · 0.45
reserveMethod · 0.45

Tested by

no test coverage detected