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