module; #include #include #include #include export module routemon:datex2; import std; import :geo; import :time; import :util; using namespace std::literals::string_view_literals; namespace routemon::datex2 { export struct situation; export struct road_closure { std::weak_ptr parent; std::optional validity; std::vector relevant_points = {}; std::vector> relevant_line_strings = {}; }; export struct situation { std::string id; std::optional location = std::nullopt; // as shown on the map, not used for querying std::vector comments = {}; std::vector> road_closures = {}; }; export struct situation_publication { time::timestamp publication_time; std::vector> situations; }; export class loader { // ETRS 89 (EPSG:4258) -> WGS 84 (EPSG:4326) bgeo::srs:: transformation, bgeo::srs::static_epsg<4326>> etrs89_to_wgs84_{}; std::multiset warnings_; auto add_location_from_xml(road_closure& rc, pugi::xml_node const& loc_xml) -> void; auto handle_road_or_carriageway_or_lane_management( pugi::xml_node const& record_xml, std::weak_ptr parent) -> std::optional>; public: [[nodiscard]] auto load_situation_publication(std::string const& filename) -> situation_publication; [[nodiscard]] auto warnings() const -> std::multiset const&; }; } // namespace routemon::datex2