From 3e8ce840c70ee00925210b96738696d1dc445f8f Mon Sep 17 00:00:00 2001 From: Rutger Broekhoff Date: Tue, 8 Sep 2026 01:36:38 +0200 Subject: UTM projection --- server/src/geo/utm_zone_local.cppm | 74 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 server/src/geo/utm_zone_local.cppm (limited to 'server/src/geo/utm_zone_local.cppm') diff --git a/server/src/geo/utm_zone_local.cppm b/server/src/geo/utm_zone_local.cppm new file mode 100644 index 0000000..98a1344 --- /dev/null +++ b/server/src/geo/utm_zone_local.cppm @@ -0,0 +1,74 @@ +module; + +#include +#include + +export module routemon:geo.utm.zone_local; + +import :geo; +import :geo.utm; + +// Coordinates that are local to some known UTM zone. +namespace routemon::geo::utm::zone_local { + + using cs = bgeo::cs::cartesian; + + namespace prim { + + using point = bgeo::model::d2::point_xy; + using linestring = bgeo::model::linestring; + using box = bgeo::model::box; + + } // namespace prim + + struct point : public prim::point + { + zone zone; + + explicit point(class zone zone, double x, double y) + : prim::point{x, y}, zone{zone} + { + } + }; + + struct linestring : public prim::linestring + { + zone zone; + + explicit linestring(class zone zone) + : zone{zone} + { + } + }; + +} // namespace routemon::geo::utm::zone_local + +BOOST_GEOMETRY_REGISTER_LINESTRING(routemon::geo::utm::zone_local::linestring) + +namespace boost::geometry::traits { + + namespace { + + using zone_local_point = routemon::geo::utm::zone_local::point; + + } // namespace + + template<> struct tag { using type = point_tag; }; + template<> struct dimension : boost::mpl::int_<2> {}; + template<> struct coordinate_type { using type = double; }; + template<> struct coordinate_system { using type = routemon::geo::utm::zone_local::cs; }; + + template + struct access { + static inline auto get(zone_local_point const& p) -> double + { + return bgeo::get(static_cast(p)); + } + + static inline auto set(zone_local_point& p, double v) -> void + { + return bgeo::set(static_cast(p), v); + } + }; + +} // namespace boost::geometry::traits -- cgit v1.3