#ifndef OSRM_EXTRACTOR_NODE_BASED_GRAPH_FACTORY_HPP_ #define OSRM_EXTRACTOR_NODE_BASED_GRAPH_FACTORY_HPP_ #include "extractor/compressed_edge_container.hpp" #include "extractor/maneuver_override.hpp" #include "extractor/node_based_edge.hpp" #include "extractor/node_data_container.hpp" #include "extractor/packed_osm_ids.hpp" #include "extractor/scripting_environment.hpp" #include "util/coordinate.hpp" #include "util/node_based_graph.hpp" #include #include #include #include #include namespace osrm { namespace extractor { // Turn the output of the extraction process into a graph that represents junctions as nodes and // ways as edges between these nodes. The graph forms the further input for OSRMs creation of the // edge-based graph and is also the basic concept for annotating paths. All information from ways // that is transferred into the API response is connected to the edges of the node-based graph. // // The input to the graph creation is the set of edges, traffic signals, barriers, meta-data,... // which is generated during extraction and stored within the extraction containers. class NodeBasedGraphFactory { public: // The node-based graph factory loads the *.osrm file and transforms the data within into the // node-based graph to represent the OSM network. This includes geometry compression, annotation // data optimisation and many other aspects. After this step, the edge-based graph factory can // turn the graph into the routing graph to be used with the navigation algorithms. NodeBasedGraphFactory(const boost::filesystem::path &input_file, ScriptingEnvironment &scripting_environment, std::vector &turn_restrictions, std::vector &conditional_turn_restrictions, std::vector &maneuver_overrides); auto const &GetGraph() const { return compressed_output_graph; } auto const &GetBarriers() const { return barriers; } auto const &GetTrafficSignals() const { return traffic_signals; } auto const &GetCompressedEdges() const { return compressed_edge_container; } auto const &GetCoordinates() const { return coordinates; } auto const &GetAnnotationData() const { return annotation_data; } auto const &GetOsmNodes() const { return osm_node_ids; } auto &GetCompressedEdges() { return compressed_edge_container; } auto &GetCoordinates() { return coordinates; } auto &GetAnnotationData() { return annotation_data; } auto &GetOsmNodes() { return osm_node_ids; } // to reduce the memory footprint, the node-based graph factory allows releasing memory after it // might have been used for the last time: void ReleaseOsmNodes(); private: // Get the information from the *.osrm file (direct product of the extractor callback/extraction // containers) and prepare the graph creation process void LoadDataFromFile(const boost::filesystem::path &input_file); // Compress the node-based graph into a compact representation of itself. This removes storing a // single edge for every part of the geometry and might also combine meta-data for multiple // edges into a single representative form void Compress(ScriptingEnvironment &scripting_environment, std::vector &turn_restrictions, std::vector &conditional_turn_restrictions, std::vector &maneuver_overrides); // Most ways are bidirectional, making the geometry in forward and backward direction the same, // except for reversal. We make use of this fact by keeping only one representation of the // geometry around void CompressGeometry(); // After graph compression, some of the annotation entries might not be referenced anymore. We // compress the annotation data by relabeling the node-based graph references and removing all // unreferenced entries void CompressAnnotationData(); // After produce, this will contain a compressed version of the node-based graph util::NodeBasedDynamicGraph compressed_output_graph; // To store the meta-data for the graph that is purely annotative / not used for the navigation // itself. Since the edges of a node-based graph form the nodes of the edge based graphs, we // transform this data into the EdgeBasedNodeDataContainer as output storage. std::vector annotation_data; // General Information about the graph, not used outside of extractor std::unordered_set barriers; std::unordered_set traffic_signals; std::vector coordinates; // data to keep in sync with the node-based graph extractor::PackedOSMIDs osm_node_ids; // for the compressed geometry extractor::CompressedEdgeContainer compressed_edge_container; }; } // namespace extractor } // namespace osrm #endif // OSRM_EXTRACTOR_NODE_BASED_GRAPH_FACTORY_HPP_