source: osm/applications/editors/josm/plugins/public_transport/src/public_transport/PublicTransportAStar.java@ 33053

Last change on this file since 33053 was 33053, checked in by donvip, 8 years ago

checkstyle

File size: 4.3 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package public_transport;
3
4import java.util.Iterator;
5import java.util.Objects;
6import java.util.TreeMap;
7import java.util.TreeSet;
8import java.util.Vector;
9
10import org.openstreetmap.josm.Main;
11import org.openstreetmap.josm.data.osm.Node;
12import org.openstreetmap.josm.data.osm.Way;
13
14public class PublicTransportAStar extends AStarAlgorithm {
15 public PublicTransportAStar(Node start, Node end) {
16 super(new NodeVertex(start), new NodeVertex(end));
17 }
18
19 public static class NodeVertex extends AStarAlgorithm.Vertex {
20 public NodeVertex(Node node) {
21 this.node = node;
22 }
23
24 @Override
25 public int compareTo(AStarAlgorithm.Vertex v) {
26 return this.node.compareTo(((NodeVertex) v).node);
27 }
28
29 @Override
30 public boolean equals(Object o) {
31 if ((NodeVertex) o == null)
32 return false;
33 return node.equals(((NodeVertex) o).node);
34 }
35
36 @Override
37 public int hashCode() {
38 return Objects.hashCode(node);
39 }
40
41 public Node node;
42 }
43
44 public static class PartialWayEdge extends AStarAlgorithm.Edge {
45 public PartialWayEdge(Way way, int beginIndex, int endIndex) {
46 this.way = way;
47 this.beginIndex = beginIndex;
48 this.endIndex = endIndex;
49 }
50
51 @Override
52 public AStarAlgorithm.Vertex getBegin() {
53 return new NodeVertex(way.getNode(beginIndex));
54 }
55
56 @Override
57 public AStarAlgorithm.Vertex getEnd() {
58 return new NodeVertex(way.getNode(endIndex));
59 }
60
61 @Override
62 public double getLength() {
63 int min = beginIndex;
64 int max = endIndex;
65 if (endIndex < beginIndex) {
66 min = endIndex;
67 max = beginIndex;
68 }
69
70 double totalDistance = 0;
71 for (int i = min; i < max; ++i) {
72 totalDistance += way.getNode(i).getCoor().greatCircleDistance(way.getNode(i + 1).getCoor());
73 }
74 return totalDistance;
75 }
76
77 public Way way;
78
79 public int beginIndex;
80
81 public int endIndex;
82 }
83
84 @Override
85 public Vector<AStarAlgorithm.Edge> getNeighbors(AStarAlgorithm.Vertex vertex) {
86 if (waysPerNode == null) {
87 waysPerNode = new TreeMap<>();
88
89 Iterator<Way> iter = Main.getLayerManager().getEditDataSet().getWays().iterator();
90 while (iter.hasNext()) {
91 Way way = iter.next();
92
93 // Only consider ways that are usable
94 if (!way.isUsable())
95 continue;
96
97 // Further tests whether the way is eligible.
98
99 for (int i = 0; i < way.getNodesCount(); ++i) {
100 if (waysPerNode.get(way.getNode(i)) == null)
101 waysPerNode.put(way.getNode(i), new TreeSet<Way>());
102 waysPerNode.get(way.getNode(i)).add(way);
103 }
104 }
105 }
106
107 NodeVertex nodeVertex = (NodeVertex) vertex;
108 System.out.println(nodeVertex.node.getUniqueId());
109
110 Vector<AStarAlgorithm.Edge> result = new Vector<>();
111 // Determine all ways in which nodeVertex.node is contained.
112 Iterator<Way> iter = waysPerNode.get(nodeVertex.node).iterator();
113 while (iter.hasNext()) {
114 Way way = iter.next();
115
116 // Only consider ways that are usable
117 if (!way.isUsable())
118 continue;
119
120 // Further tests whether the way is eligible.
121
122 for (int i = 0; i < way.getNodesCount(); ++i) {
123 if (way.getNode(i).equals(nodeVertex.node)) {
124 if (i > 0)
125 result.add(new PartialWayEdge(way, i, i - 1));
126 if (i < way.getNodesCount() - 1)
127 result.add(new PartialWayEdge(way, i, i + 1));
128 }
129 }
130 }
131
132 return result;
133 }
134
135 TreeMap<Node, TreeSet<Way>> waysPerNode = null;
136
137 @Override
138 public double estimateDistance(AStarAlgorithm.Vertex vertex) {
139 NodeVertex nodeVertex = (NodeVertex) vertex;
140 return ((NodeVertex) super.end).node.getCoor()
141 .greatCircleDistance(nodeVertex.node.getCoor());
142 }
143}
Note: See TracBrowser for help on using the repository browser.