/src/osmdb/RoadNetworkCreator.cpp

https://github.com/martin-kolinek/OpenStreetNav · C++ · 76 lines · 60 code · 10 blank · 6 comment · 4 complexity · bdae3039dae3cb9cca1eaa0bd4dd3dd3 MD5 · raw file

  1. /*
  2. * RoadNetworkCreator.cpp
  3. *
  4. * Created on: Mar 3, 2012
  5. * Author: martin
  6. */
  7. #include "RoadNetworkCreator.h"
  8. #include "../sqllib/sqllib.h"
  9. #include "../util/groupingiterator.h"
  10. #include "AllWayLister.h"
  11. #include "../cost/LengthAssigner.h"
  12. #include "RoadEdgeCopy.h"
  13. namespace osmdb
  14. {
  15. RoadNetworkCreator::RoadNetworkCreator(OsmDatabase& full, OsmDatabase& reduced, OsmDatabase& destination, std::multimap<std::string, std::string> const& attributes):
  16. full(full),
  17. reduced(reduced),
  18. destination(destination),
  19. attributes(attributes)
  20. {
  21. }
  22. void RoadNetworkCreator::create_road_network_table()
  23. {
  24. sqllib::get_create_road_edges_table(destination.get_db()).execute();
  25. sqllib::get_create_road_edges_pkey(destination.get_db()).execute();
  26. sqllib::get_create_road_edges_fkey(destination.get_db()).execute();
  27. sqllib::get_create_road_edges_view(destination.get_db()).execute();
  28. }
  29. void group_way_nodes(osm::Way& w, std::tuple<int64_t, int64_t, int> const& row)
  30. {
  31. w.id = std::get<0>(row);
  32. w.add_node(osm::Node(std::get<1>(row)), std::get<2>(row));
  33. }
  34. std::pair<osm::Way, osm::Way> comb(osm::Way const& w1, osm::Way const& w2)
  35. {
  36. return std::make_pair(w1, w2);
  37. }
  38. void RoadNetworkCreator::copy_road_network_data()
  39. {
  40. sqllib::get_drop_road_edges_fkey(destination.get_db()).execute();
  41. RoadEdgeCopy cp(destination);
  42. cp.start_copy();
  43. auto red_st = sqllib::get_select_ways_with_nodes(reduced.get_db());
  44. auto reduced_rows = psql::exec_statement(red_st);
  45. auto reduced_ways = reduced_rows |
  46. util::groupped(util::get_tuple_comparer<0>(), group_way_nodes, osm::Way(0));
  47. full.get_db().begin_transaction();
  48. AllWayLister list(full, attributes);
  49. auto combined = util::sorted_combine(reduced_ways, list.get_range(), comb, osm::LtByID());
  50. cost::LengthAssigner la;
  51. for (auto it = combined.begin(); it != combined.end(); ++it)
  52. {
  53. auto v = la.extract_edges(it->first, it->second);
  54. for (auto it2 = v.begin(); it2 != v.end(); ++it2)
  55. {
  56. cp.copy_edge(*it2);
  57. }
  58. }
  59. full.get_db().rollback_transaction();
  60. cp.end_copy();
  61. sqllib::get_create_road_edges_fkey(destination.get_db()).execute();
  62. }
  63. RoadNetworkCreator::~RoadNetworkCreator()
  64. {
  65. }
  66. } /* namespace util */