From 973aec43ea54bbf95b64fbcb636403401d1ca60e Mon Sep 17 00:00:00 2001 From: Rutger Broekhoff Date: Fri, 28 Aug 2026 18:03:05 +0200 Subject: Import from e4b104792206ee7ea64bf39c6b7d2c0c230f9d14 --- server/src/geo.cppm | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 server/src/geo.cppm (limited to 'server/src/geo.cppm') diff --git a/server/src/geo.cppm b/server/src/geo.cppm new file mode 100644 index 0000000..5cdbdd9 --- /dev/null +++ b/server/src/geo.cppm @@ -0,0 +1,40 @@ +module; + +#include + +export module routemon:geo; + +export namespace bgeo = boost::geometry; + +export namespace routemon::geo { + + using point = bgeo::model::point>; + using linestring = bgeo::model::linestring; + using box = bgeo::model::box; + using stype = bgeo::srs::spheroid; + using vincenty_strategy = bgeo::strategy::distance::vincenty; + + auto split_linestring_with_overlap_segments(linestring const& ls, double max_split_distance_m, std::vector& append_to) -> void { + if (bgeo::is_empty(ls)) + return; + + auto current_ls = linestring{}; + auto current_ls_length = 0.0; + auto previous = std::optional{}; + bgeo::for_each_point(ls, [&](point p) -> void { + bgeo::append(current_ls, p); + if (previous) { + auto d = bgeo::distance(*previous, p, vincenty_strategy()); + current_ls_length += d; + if (current_ls_length > max_split_distance_m) { + append_to.push_back(std::move(current_ls)); + current_ls = linestring{*previous, p}; + current_ls_length = d; + } + } + previous = p; + }); + append_to.emplace_back(std::move(current_ls)); + } + +} // namespace routemon::geo -- cgit v1.3