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 inline point(class zone zone, double x, double y) : prim::point{x, y}, zone{zone} { } }; struct linestring : public prim::linestring { zone zone; explicit inline 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