From 52b3cd46c76fd4be18aeb8422a08a073484b9fad Mon Sep 17 00:00:00 2001 From: Rutger Broekhoff Date: Sat, 29 Aug 2026 12:01:42 +0200 Subject: More module implementation partition units --- server/src/geo.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 server/src/geo.cpp (limited to 'server/src/geo.cpp') diff --git a/server/src/geo.cpp b/server/src/geo.cpp new file mode 100644 index 0000000..1776f3c --- /dev/null +++ b/server/src/geo.cpp @@ -0,0 +1,42 @@ +module; + +#include + +module routemon:geo$impl; + +import :geo; + +namespace routemon::geo { + +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