Merge branch 'develop'
This commit is contained in:
		
						commit
						fd6daa580a
					
				| @ -77,11 +77,15 @@ struct TurnRestriction | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * This is just a wrapper around TurnRestriction used in the extractor. | ||||
|  *  | ||||
|  * Could be merged with TurnRestriction. For now the type-destiction makes sense | ||||
|  * as the format in which the restriction is presented in the extractor and in the | ||||
|  * preprocessing is different. (see restriction_parser.cpp) | ||||
|  */ | ||||
| struct InputRestrictionContainer | ||||
| { | ||||
|     // EdgeID fromWay;
 | ||||
|     // EdgeID toWay;
 | ||||
|     // NodeID via_node;
 | ||||
|     TurnRestriction restriction; | ||||
| 
 | ||||
|     InputRestrictionContainer(EdgeID fromWay, EdgeID toWay, EdgeID vw) | ||||
|  | ||||
| @ -62,6 +62,17 @@ ExtractionContainers::~ExtractionContainers() | ||||
|     way_start_end_id_list.clear(); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Processes the collected data and serializes it. | ||||
|  * At this point nodes are still referenced by their OSM id. | ||||
|  * | ||||
|  * - map start-end nodes of ways to ways used int restrictions to compute compressed | ||||
|  *   trippe representation | ||||
|  * - filter nodes list to nodes that are referenced by ways | ||||
|  * - merge edges with nodes to include location of start/end points and serialize | ||||
|  * | ||||
|  * FIXME: Each of this step should be an own function for readability. | ||||
|  */ | ||||
| void ExtractionContainers::PrepareData(const std::string &output_file_name, | ||||
|                                        const std::string &restrictions_file_name) | ||||
| { | ||||
| @ -301,6 +312,7 @@ void ExtractionContainers::PrepareData(const std::string &output_file_name, | ||||
|         node_iterator = all_nodes_list.begin(); | ||||
|         edge_iterator = all_edges_list.begin(); | ||||
| 
 | ||||
|         // Also serializes the edges
 | ||||
|         while (edge_iterator != all_edges_list.end() && node_iterator != all_nodes_list.end()) | ||||
|         { | ||||
|             if (edge_iterator->target < node_iterator->node_id) | ||||
| @ -329,6 +341,8 @@ void ExtractionContainers::PrepareData(const std::string &output_file_name, | ||||
|                 int integer_weight = std::max( | ||||
|                     1, (int)std::floor( | ||||
|                            (edge_iterator->is_duration_set ? edge_iterator->speed : weight) + .5)); | ||||
|                 // FIXME: This means we have a _minimum_ edge length of 1m
 | ||||
|                 // maybe use dm as base unit?
 | ||||
|                 const int integer_distance = std::max(1, (int)distance); | ||||
|                 const short zero = 0; | ||||
|                 const short one = 1; | ||||
|  | ||||
| @ -36,6 +36,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| 
 | ||||
| #include <stxxl/vector> | ||||
| 
 | ||||
| /**
 | ||||
|  * Uses external memory containers from stxxl to store all the data that | ||||
|  * is collected by the extractor callbacks. | ||||
|  */ | ||||
| class ExtractionContainers | ||||
| { | ||||
| #ifndef _MSC_VER | ||||
|  | ||||
| @ -34,6 +34,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| #include <string> | ||||
| #include <vector> | ||||
| 
 | ||||
| /**
 | ||||
|  * This struct is the direct result of the call to ```way_function``` | ||||
|  * in the lua based profile. | ||||
|  * | ||||
|  * It is split into multiple edge segments in the ExtractorCallback. | ||||
|  */ | ||||
| struct ExtractionWay | ||||
| { | ||||
|     ExtractionWay() { clear(); } | ||||
|  | ||||
| @ -64,6 +64,24 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| #include <unordered_map> | ||||
| #include <vector> | ||||
| 
 | ||||
| /**
 | ||||
|  * TODO: Refactor this function into smaller functions for better readability. | ||||
|  * | ||||
|  * This function is the entry point for the whole extraction process. The goal of the extraction | ||||
|  * step is to filter and convert the OSM geometry to something more fitting for routing. | ||||
|  * That includes: | ||||
|  *  - extracting turn restrictions | ||||
|  *  - splitting ways into (directional!) edge segments | ||||
|  *  - checking if nodes are barriers or traffic signal | ||||
|  *  - discarding all tag information: All relevant type information for nodes/ways | ||||
|  *    is extracted at this point. | ||||
|  * | ||||
|  * The result of this process are the following files: | ||||
|  *  .names : Names of all streets, stored as long consecutive string with prefix sum based index | ||||
|  *  .osrm  : Nodes and edges in a intermediate format that easy to digest for osrm-prepare | ||||
|  *  .restrictions : Turn restrictions that are used my osrm-prepare to construct the edge-expanded graph | ||||
|  * | ||||
|  */ | ||||
| int extractor::run(const ExtractorConfig &extractor_config) | ||||
| { | ||||
|     try | ||||
| @ -83,12 +101,8 @@ int extractor::run(const ExtractorConfig &extractor_config) | ||||
|         // setup scripting environment
 | ||||
|         ScriptingEnvironment scripting_environment(extractor_config.profile_path.string().c_str()); | ||||
| 
 | ||||
|         std::unordered_map<std::string, NodeID> string_map; | ||||
|         string_map[""] = 0; | ||||
| 
 | ||||
|         ExtractionContainers extraction_containers; | ||||
|         auto extractor_callbacks = | ||||
|             osrm::make_unique<ExtractorCallbacks>(extraction_containers, string_map); | ||||
|         auto extractor_callbacks = osrm::make_unique<ExtractorCallbacks>(extraction_containers); | ||||
| 
 | ||||
|         const osmium::io::File input_file(extractor_config.input_path.string()); | ||||
|         osmium::io::Reader reader(input_file); | ||||
|  | ||||
| @ -41,13 +41,18 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| #include <string> | ||||
| #include <vector> | ||||
| 
 | ||||
| ExtractorCallbacks::ExtractorCallbacks(ExtractionContainers &extraction_containers, | ||||
|                                        std::unordered_map<std::string, NodeID> &string_map) | ||||
|     : string_map(string_map), external_memory(extraction_containers) | ||||
| ExtractorCallbacks::ExtractorCallbacks(ExtractionContainers &extraction_containers) | ||||
|     : external_memory(extraction_containers) | ||||
| { | ||||
|     string_map[""] = 0; | ||||
| } | ||||
| 
 | ||||
| /** warning: caller needs to take care of synchronization! */ | ||||
| /**
 | ||||
|  * Takes the node position from osmium and the filtered properties from the lua | ||||
|  * profile and saves them to external memory. | ||||
|  * | ||||
|  * warning: caller needs to take care of synchronization! | ||||
|  */ | ||||
| void ExtractorCallbacks::ProcessNode(const osmium::Node &input_node, | ||||
|                                      const ExtractionNode &result_node) | ||||
| { | ||||
| @ -72,7 +77,15 @@ void ExtractorCallbacks::ProcessRestriction( | ||||
|         //                           "y" : "n");
 | ||||
|     } | ||||
| } | ||||
| /** warning: caller needs to take care of synchronization! */ | ||||
| /**
 | ||||
|  * Takes the geometry contained in the ```input_way``` and the tags computed | ||||
|  * by the lua profile inside ```parsed_way``` and computes all edge segments. | ||||
|  * | ||||
|  * Depending on the forward/backwards weights the edges are split into forward | ||||
|  * and backward edges. | ||||
|  * | ||||
|  * warning: caller needs to take care of synchronization! | ||||
|  */ | ||||
| void ExtractorCallbacks::ProcessWay(const osmium::Way &input_way, const ExtractionWay &parsed_way) | ||||
| { | ||||
|     if (((0 >= parsed_way.forward_speed) || | ||||
|  | ||||
| @ -43,17 +43,24 @@ class ExtractionContainers; | ||||
| struct InputRestrictionContainer; | ||||
| struct ExtractionNode; | ||||
| 
 | ||||
| /**
 | ||||
|  * This class is uses by the extractor with the results of the | ||||
|  * osmium based parsing and the customization through the lua profile. | ||||
|  * | ||||
|  * It mediates between the multi-threaded extraction process and the external memory containers. | ||||
|  * Thus the synchronization is handled inside of the extractor. | ||||
|  */ | ||||
| class ExtractorCallbacks | ||||
| { | ||||
|   private: | ||||
|     std::unordered_map<std::string, NodeID> &string_map; | ||||
|     // used to deduplicate street names: actually maps to name ids
 | ||||
|     std::unordered_map<std::string, NodeID> string_map; | ||||
|     ExtractionContainers &external_memory; | ||||
| 
 | ||||
|   public: | ||||
|     ExtractorCallbacks() = delete; | ||||
|     ExtractorCallbacks(const ExtractorCallbacks &) = delete; | ||||
|     explicit ExtractorCallbacks(ExtractionContainers &extraction_containers, | ||||
|                                 std::unordered_map<std::string, NodeID> &string_map); | ||||
|     explicit ExtractorCallbacks(ExtractionContainers &extraction_containers); | ||||
| 
 | ||||
|     // warning: caller needs to take care of synchronization!
 | ||||
|     void ProcessNode(const osmium::Node ¤t_node, const ExtractionNode &result_node); | ||||
|  | ||||
| @ -27,7 +27,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| 
 | ||||
| #include "restriction_parser.hpp" | ||||
| #include "extraction_way.hpp" | ||||
| #include "scripting_environment.hpp" | ||||
| 
 | ||||
| #include "../data_structures/external_memory_node.hpp" | ||||
| #include "../util/lua_util.hpp" | ||||
| @ -53,7 +52,7 @@ int lua_error_callback(lua_State *lua_state) | ||||
| } | ||||
| 
 | ||||
| RestrictionParser::RestrictionParser(lua_State *lua_state) | ||||
|     : /*lua_state(scripting_environment.getLuaState()),*/ use_turn_restrictions(true) | ||||
|     : use_turn_restrictions(true) | ||||
| { | ||||
|     ReadUseRestrictionsSetting(lua_state); | ||||
| 
 | ||||
| @ -103,6 +102,13 @@ void RestrictionParser::ReadRestrictionExceptions(lua_State *lua_state) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Tries to parse an relation as turn restriction. This can fail for a number of | ||||
|  * reasons, this the return type is a mapbox::util::optional<>. | ||||
|  * | ||||
|  * Some restrictions can also be ignored: See the ```get_exceptions``` function | ||||
|  * in the corresponding profile. | ||||
|  */ | ||||
| mapbox::util::optional<InputRestrictionContainer> | ||||
| RestrictionParser::TryParse(const osmium::Relation &relation) const | ||||
| { | ||||
|  | ||||
| @ -41,10 +41,27 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| struct lua_State; | ||||
| class ScriptingEnvironment; | ||||
| 
 | ||||
| /**
 | ||||
|  * Parses the relations that represents turn restrictions. | ||||
|  * | ||||
|  * Currently only restrictions where the via objects is a node are supported. | ||||
|  *  from   via   to | ||||
|  * ------->(x)--------> | ||||
|  * | ||||
|  * While this class does not directly invoke any lua code _per relation_ it does | ||||
|  * load configuration values from the profile, that are saved in variables. | ||||
|  * Namely ```use_turn_restrictions``` and ```get_exceptions```. | ||||
|  * | ||||
|  * The restriction is represented by the osm id of the from way, the osm id of the | ||||
|  * to way and the osm id of the via node. This representation must be post-processed | ||||
|  * in the extractor to work with the edge-based data-model of OSRM: | ||||
|  * Since the from and to way share the via-node a turn will have the following form: | ||||
|  * ...----(a)-----(via)------(b)----... | ||||
|  * So it can be represented by the tripe (a, via, b). | ||||
|  */ | ||||
| class RestrictionParser | ||||
| { | ||||
|   public: | ||||
|     // RestrictionParser(ScriptingEnvironment &scripting_environment);
 | ||||
|     RestrictionParser(lua_State *lua_state); | ||||
|     mapbox::util::optional<InputRestrictionContainer> | ||||
|     TryParse(const osmium::Relation &relation) const; | ||||
| @ -54,7 +71,6 @@ class RestrictionParser | ||||
|     void ReadRestrictionExceptions(lua_State *lua_state); | ||||
|     bool ShouldIgnoreRestriction(const std::string &except_tag_string) const; | ||||
| 
 | ||||
|     // lua_State *lua_state;
 | ||||
|     std::vector<std::string> restriction_exceptions; | ||||
|     bool use_turn_restrictions; | ||||
| }; | ||||
|  | ||||
| @ -35,6 +35,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| 
 | ||||
| struct lua_State; | ||||
| 
 | ||||
| /**
 | ||||
|  * Creates a lua context and binds osmium way, node and relation objects and | ||||
|  * ExtractionWay and ExtractionNode to lua objects. | ||||
|  * | ||||
|  * Each thread has its own lua state which is implemented with thread specific | ||||
|  * storage from TBB. | ||||
|  */ | ||||
| class ScriptingEnvironment | ||||
| { | ||||
|   public: | ||||
|  | ||||
| @ -35,13 +35,13 @@ struct libosrm_config | ||||
|     libosrm_config(const libosrm_config &) = delete; | ||||
|     libosrm_config() | ||||
|         : max_locations_distance_table(100), max_locations_map_matching(-1), | ||||
|           use_shared_memory(false) | ||||
|           use_shared_memory(true) | ||||
|     { | ||||
|     } | ||||
| 
 | ||||
|     libosrm_config(const ServerPaths &paths, const bool flag, const int max_table, const int max_matching) | ||||
|     libosrm_config(const ServerPaths &paths, const bool sharedmemory_flag, const int max_table, const int max_matching) | ||||
|         : server_paths(paths), max_locations_distance_table(max_table), | ||||
|           max_locations_map_matching(max_matching), use_shared_memory(flag) | ||||
|           max_locations_map_matching(max_matching), use_shared_memory(sharedmemory_flag) | ||||
|     { | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -74,6 +74,8 @@ int main(int argc, const char *argv[]) | ||||
|         int ip_port, requested_thread_num; | ||||
| 
 | ||||
|         libosrm_config lib_config; | ||||
|         // make the behaviour of routed backward compatible
 | ||||
|         lib_config.use_shared_memory = false; | ||||
| 
 | ||||
|         const unsigned init_result = GenerateServerProgramOptions( | ||||
|             argc, argv, lib_config.server_paths, ip_address, ip_port, requested_thread_num, | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user