~valhalla-routing/+junk/valhalla_2.1.9-0ubuntu1

« back to all changes in this revision

Viewing changes to libvalhalla/src/mjolnir/node_expander.cc

  • Committer: valhalla
  • Date: 2017-04-24 20:20:53 UTC
  • Revision ID: valhalla@mapzen.com-20170424202053-7o69b9nwx9ee0tw3
PackagingĀ forĀ 2.1.9-0ubuntu1.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "mjolnir/node_expander.h"
 
2
 
 
3
namespace valhalla {
 
4
namespace mjolnir {
 
5
 
 
6
node_bundle collect_node_edges(const sequence<Node>::iterator& node_itr,
 
7
                               sequence<Node>& nodes,
 
8
                               sequence<Edge>& edges) {
 
9
  //copy out the first nodes attributes (as they are the correctly merged one)
 
10
  auto itr = node_itr;
 
11
  node_bundle bundle(*itr);
 
12
  Node node;
 
13
  //for each node with the same id (duplicate)
 
14
  for(; itr != nodes.end() && (node = *itr).node.osmid == bundle.node.osmid; ++itr) {
 
15
    ++bundle.node_count;
 
16
    if(node.is_start()) {
 
17
      auto edge_itr = edges[node.start_of];
 
18
      auto edge = *edge_itr;
 
19
      // Set driveforward - this edge is traversed in forward direction
 
20
      edge.attributes.driveforward = edge.attributes.driveableforward;
 
21
      bundle.node_edges.emplace(std::make_pair(edge, node.start_of));
 
22
      bundle.node.attributes_.link_edge = bundle.node.attributes_.link_edge || edge.attributes.link;
 
23
      bundle.node.attributes_.ferry_edge = bundle.node.attributes_.ferry_edge || edge.attributes.driveable_ferry;
 
24
      bundle.node.attributes_.shortlink |= edge.attributes.shortlink;
 
25
      // Do not count non-driveable (e.g. emergency service roads) as a
 
26
      // non-link edge or non-ferry edge
 
27
      if (edge.attributes.driveableforward || edge.attributes.driveablereverse) {
 
28
        bundle.node.attributes_.non_link_edge = bundle.node.attributes_.non_link_edge || !edge.attributes.link;
 
29
        bundle.node.attributes_.non_ferry_edge = bundle.node.attributes_.non_ferry_edge || !edge.attributes.driveable_ferry;
 
30
      }
 
31
      if (edge.attributes.link) {
 
32
        bundle.link_count++;
 
33
      } else {
 
34
        bundle.non_link_count++;
 
35
      }
 
36
      if (edge.attributes.driveforward) {
 
37
        bundle.driveforward_count++;
 
38
      }
 
39
    }
 
40
    if(node.is_end()) {
 
41
      auto edge_itr = edges[node.end_of];
 
42
      auto edge = *edge_itr;
 
43
      // Set driveforward - this edge is traversed in reverse direction
 
44
      edge.attributes.driveforward = edge.attributes.driveablereverse;
 
45
      bundle.node_edges.emplace(std::make_pair(edge, node.end_of));
 
46
      bundle.node.attributes_.link_edge = bundle.node.attributes_.link_edge || edge.attributes.link;
 
47
      bundle.node.attributes_.ferry_edge = bundle.node.attributes_.ferry_edge || edge.attributes.driveable_ferry;
 
48
      bundle.node.attributes_.shortlink |= edge.attributes.shortlink;
 
49
      // Do not count non-driveable (e.g. emergency service roads) as a non-link edge
 
50
      if (edge.attributes.driveableforward || edge.attributes.driveablereverse) {
 
51
        bundle.node.attributes_.non_link_edge = bundle.node.attributes_.non_link_edge || !edge.attributes.link;
 
52
        bundle.node.attributes_.non_ferry_edge = bundle.node.attributes_.non_ferry_edge || !edge.attributes.driveable_ferry;
 
53
      }
 
54
      if (edge.attributes.link) {
 
55
        bundle.link_count++;
 
56
      } else {
 
57
        bundle.non_link_count++;
 
58
      }
 
59
      if (edge.attributes.driveforward) {
 
60
        bundle.driveforward_count++;
 
61
      }
 
62
    }
 
63
  }
 
64
  return bundle;
 
65
}
 
66
 
 
67
}
 
68
}