From 9387f583fa5de0c6490214822bcc33181cc0a9b5 Mon Sep 17 00:00:00 2001 From: Patrick Niklaus Date: Sun, 9 Aug 2015 18:31:11 +0200 Subject: [PATCH] Add loading of .core file to InternalDataFacade --- server/data_structures/datafacade_base.hpp | 2 ++ .../data_structures/internal_datafacade.hpp | 33 +++++++++++++++++++ server/data_structures/shared_datafacade.hpp | 7 ++++ util/routed_options.hpp | 2 ++ 4 files changed, 44 insertions(+) diff --git a/server/data_structures/datafacade_base.hpp b/server/data_structures/datafacade_base.hpp index 20d043057..fc4519da2 100644 --- a/server/data_structures/datafacade_base.hpp +++ b/server/data_structures/datafacade_base.hpp @@ -113,6 +113,8 @@ template class BaseDataFacade virtual unsigned GetCheckSum() const = 0; + virtual bool IsCoreNode(const NodeID id) const = 0; + virtual unsigned GetNameIndexFromEdgeID(const unsigned id) const = 0; virtual std::string get_name_for_id(const unsigned name_id) const = 0; diff --git a/server/data_structures/internal_datafacade.hpp b/server/data_structures/internal_datafacade.hpp index 7439cb831..3493ebdab 100644 --- a/server/data_structures/internal_datafacade.hpp +++ b/server/data_structures/internal_datafacade.hpp @@ -73,6 +73,7 @@ template class InternalDataFacade final : public BaseDataFacad ShM::vector m_edge_is_compressed; ShM::vector m_geometry_indices; ShM::vector m_geometry_list; + ShM::vector m_is_core_node; boost::thread_specific_ptr< StaticRTree::vector, false>> m_static_rtree; @@ -171,6 +172,23 @@ template class InternalDataFacade final : public BaseDataFacad edges_input_stream.close(); } + void LoadCoreInformation(const boost::filesystem::path &core_data_file) + { + std::ifstream core_stream(core_data_file.string().c_str(), std::ios::binary); + unsigned number_of_markers; + core_stream.read((char *)&number_of_markers, sizeof(unsigned)); + + std::vector unpacked_core_markers(number_of_markers); + core_stream.read((char *)unpacked_core_markers.data(), sizeof(char)*number_of_markers); + + m_is_core_node.resize(number_of_markers); + for (auto i = 0u; i < number_of_markers; ++i) + { + BOOST_ASSERT(unpacked_core_markers[i] == 0 || unpacked_core_markers[i] == 1); + m_is_core_node[i] = unpacked_core_markers[i] == 1; + } + } + void LoadGeometries(const boost::filesystem::path &geometry_file) { std::ifstream geometry_stream(geometry_file.string().c_str(), std::ios::binary); @@ -255,6 +273,10 @@ template class InternalDataFacade final : public BaseDataFacad { throw osrm::exception("no nodes file given in ini file"); } + if (server_paths.find("coredata") == server_paths.end()) + { + throw osrm::exception("no core file given in ini file"); + } if (server_paths.find("edgesdata") == server_paths.end()) { throw osrm::exception("no edges file given in ini file"); @@ -288,6 +310,9 @@ template class InternalDataFacade final : public BaseDataFacad paths_iterator = server_paths.find("geometries"); BOOST_ASSERT(server_paths.end() != paths_iterator); const boost::filesystem::path &geometries_path = paths_iterator->second; + paths_iterator = server_paths.find("coredata"); + BOOST_ASSERT(server_paths.end() != paths_iterator); + const boost::filesystem::path &core_data_path = paths_iterator->second; // load data SimpleLogger().Write() << "loading graph data"; @@ -297,6 +322,9 @@ template class InternalDataFacade final : public BaseDataFacad AssertPathExists(nodes_data_path); AssertPathExists(edges_data_path); LoadNodeAndEdgeInformation(nodes_data_path, edges_data_path); + SimpleLogger().Write() << "loading core information"; + AssertPathExists(core_data_path); + LoadCoreInformation(core_data_path); SimpleLogger().Write() << "loading geometries"; AssertPathExists(geometries_path); LoadGeometries(geometries_path); @@ -464,6 +492,11 @@ template class InternalDataFacade final : public BaseDataFacad return m_via_node_list.at(id); } + virtual bool IsCoreNode(const NodeID id) const override final + { + return m_is_core_node[id]; + } + virtual void GetUncompressedGeometry(const unsigned id, std::vector &result_nodes) const override final { diff --git a/server/data_structures/shared_datafacade.hpp b/server/data_structures/shared_datafacade.hpp index b15642316..373da7fff 100644 --- a/server/data_structures/shared_datafacade.hpp +++ b/server/data_structures/shared_datafacade.hpp @@ -84,6 +84,7 @@ template class SharedDataFacade final : public BaseDataFacade< ShM::vector m_edge_is_compressed; ShM::vector m_geometry_indices; ShM::vector m_geometry_list; + ShM::vector m_is_core_node; boost::thread_specific_ptr>> m_static_rtree; boost::filesystem::path file_index_path; @@ -447,6 +448,12 @@ template class SharedDataFacade final : public BaseDataFacade< return result; } + bool IsCoreNode(const NodeID id) const override final + { + //return m_is_core_node[id]; + return false; + } + std::string GetTimestamp() const override final { return m_timestamp; } }; diff --git a/util/routed_options.hpp b/util/routed_options.hpp index 106ea23f2..5701514af 100644 --- a/util/routed_options.hpp +++ b/util/routed_options.hpp @@ -59,6 +59,8 @@ inline void populate_base_path(ServerPaths &server_paths) BOOST_ASSERT(server_paths.find("hsgrdata") != server_paths.end()); server_paths["nodesdata"] = base_string + ".nodes"; BOOST_ASSERT(server_paths.find("nodesdata") != server_paths.end()); + server_paths["coredata"] = base_string + ".core"; + BOOST_ASSERT(server_paths.find("coredata") != server_paths.end()); server_paths["edgesdata"] = base_string + ".edges"; BOOST_ASSERT(server_paths.find("edgesdata") != server_paths.end()); server_paths["geometries"] = base_string + ".geometry";