@wemap/geo 4.0.13 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +18 -11
- package/package.json +4 -4
- package/src/Utils.spec.js +38 -0
- package/src/graph/{Edge.js → GraphEdge.js} +33 -94
- package/src/graph/GraphEdge.spec.js +91 -0
- package/src/graph/{Node.js → GraphNode.js} +29 -67
- package/src/graph/GraphNode.spec.js +203 -0
- package/src/graph/{Projection.js → GraphProjection.js} +4 -4
- package/src/graph/GraphUtils.js +17 -0
- package/src/graph/MapMatching.js +7 -5
- package/src/graph/MapMatching.spec.js +26 -26
- package/src/graph/Network.js +85 -48
- package/src/graph/Network.spec.js +66 -15
- package/src/router/GraphItinerary.js +70 -0
- package/src/router/GraphItinerary.spec.js +18 -0
- package/src/{graph → router}/GraphRouter.js +52 -52
- package/src/{graph → router}/GraphRouter.spec.js +54 -96
- package/src/router/GraphRouterOptions.js +19 -0
- package/src/{graph → router}/NoRouteFoundError.js +1 -1
- package/tests/CommonTest.js +6 -6
- package/src/graph/Edge.spec.js +0 -131
- package/src/graph/Itinerary.js +0 -529
- package/src/graph/Itinerary.spec.js +0 -811
- package/src/graph/ItineraryInfo.js +0 -29
- package/src/graph/LevelChange.js +0 -43
- package/src/graph/Node.spec.js +0 -227
- package/src/graph/Step.js +0 -99
- package/src/graph/StepsGeneration.js +0 -119
- package/src/graph/Utils.js +0 -7
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import Projection from './Projection.js';
|
|
2
|
-
import Step from './Step.js';
|
|
3
|
-
|
|
4
|
-
class ItineraryInfo {
|
|
5
|
-
|
|
6
|
-
/** @type {Step} */
|
|
7
|
-
nextStep;
|
|
8
|
-
|
|
9
|
-
/** @type {Step} */
|
|
10
|
-
previousStep;
|
|
11
|
-
|
|
12
|
-
/** @type {Projection} */
|
|
13
|
-
projection;
|
|
14
|
-
|
|
15
|
-
/** @type {number} */
|
|
16
|
-
traveledDistance;
|
|
17
|
-
|
|
18
|
-
/** @type {number} */
|
|
19
|
-
traveledPercentage;
|
|
20
|
-
|
|
21
|
-
/** @type {number} */
|
|
22
|
-
remainingDistance;
|
|
23
|
-
|
|
24
|
-
/** @type {number} */
|
|
25
|
-
remainingPercentage;
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export default ItineraryInfo;
|
package/src/graph/LevelChange.js
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import Level from '../coordinates/Level.js';
|
|
2
|
-
import Network from './Network.js';
|
|
3
|
-
import Node from './Node.js';
|
|
4
|
-
|
|
5
|
-
class LevelChange {
|
|
6
|
-
|
|
7
|
-
/** @type {String} [up|down] */
|
|
8
|
-
direction;
|
|
9
|
-
|
|
10
|
-
/** @type {number} [-2, -1, 1, ...] */
|
|
11
|
-
difference;
|
|
12
|
-
|
|
13
|
-
/** @type {string} [elevator|conveyor|stairs] */
|
|
14
|
-
type = null;
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* @param {Node} firstNode
|
|
18
|
-
* @param {Node} secondNode
|
|
19
|
-
* @returns {LevelChange}
|
|
20
|
-
*/
|
|
21
|
-
static fromTwoNodes(firstNode, secondNode) {
|
|
22
|
-
|
|
23
|
-
const levelChange = new LevelChange();
|
|
24
|
-
|
|
25
|
-
const edge = Network.getEdgeByNodes(firstNode.edges, firstNode, secondNode);
|
|
26
|
-
|
|
27
|
-
if (edge.isElevator) {
|
|
28
|
-
levelChange.type = 'elevator';
|
|
29
|
-
} else if (edge.isConveying) {
|
|
30
|
-
levelChange.type = 'conveyor';
|
|
31
|
-
} else if (edge.isStairs) {
|
|
32
|
-
levelChange.type = 'stairs';
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
levelChange.difference = Level.diff(firstNode.coords.level, secondNode.coords.level);
|
|
36
|
-
levelChange.direction = levelChange.difference > 0 ? 'up' : 'down';
|
|
37
|
-
|
|
38
|
-
return levelChange;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export default LevelChange;
|
package/src/graph/Node.spec.js
DELETED
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-new */
|
|
2
|
-
import chai from 'chai';
|
|
3
|
-
|
|
4
|
-
import Logger from '@wemap/logger';
|
|
5
|
-
|
|
6
|
-
import Coordinates from '../coordinates/Coordinates.js';
|
|
7
|
-
import Level from '../coordinates/Level.js';
|
|
8
|
-
|
|
9
|
-
import Node from './Node.js';
|
|
10
|
-
import Edge from './Edge.js';
|
|
11
|
-
|
|
12
|
-
Logger.enable(false);
|
|
13
|
-
|
|
14
|
-
const { expect } = chai;
|
|
15
|
-
|
|
16
|
-
describe('Node', () => {
|
|
17
|
-
|
|
18
|
-
it('creation', () => {
|
|
19
|
-
|
|
20
|
-
expect(() => new Node()).throw(Error);
|
|
21
|
-
expect(() => new Node({
|
|
22
|
-
lat: 45,
|
|
23
|
-
lng: 5
|
|
24
|
-
})).throw(Error);
|
|
25
|
-
expect(() => new Node(new Coordinates(0, 0))).not.throw(Error);
|
|
26
|
-
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const pos1 = new Coordinates(45, 5);
|
|
31
|
-
const pos2 = new Coordinates(46, 5);
|
|
32
|
-
const node1 = new Node(pos1);
|
|
33
|
-
const node2 = new Node(pos2);
|
|
34
|
-
|
|
35
|
-
it('distanceTo', () => {
|
|
36
|
-
expect(node1.distanceTo(node2)).equals(pos1.distanceTo(pos2));
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it('bearingTo', () => {
|
|
40
|
-
expect(node1.bearingTo(node2)).equals(pos1.bearingTo(pos2));
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it('equalsTo', () => {
|
|
44
|
-
expect(node1.equalsTo(node2)).equals(pos1.equalsTo(pos2));
|
|
45
|
-
|
|
46
|
-
const fullNode = new Node(pos1);
|
|
47
|
-
fullNode.name = 'foobar';
|
|
48
|
-
|
|
49
|
-
const testedNode = new Node(pos1);
|
|
50
|
-
|
|
51
|
-
expect(testedNode.equalsTo(node1)).true;
|
|
52
|
-
expect(testedNode.equalsTo(fullNode)).false;
|
|
53
|
-
|
|
54
|
-
testedNode.name = 'foobar';
|
|
55
|
-
expect(testedNode.equalsTo(node1)).false;
|
|
56
|
-
expect(testedNode.equalsTo(fullNode)).true;
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
it('clone', () => {
|
|
60
|
-
|
|
61
|
-
const node = new Node(pos1);
|
|
62
|
-
|
|
63
|
-
let nodeBis = node.clone();
|
|
64
|
-
expect(nodeBis.coords.equalsTo(node.coords)).true;
|
|
65
|
-
expect(nodeBis.name).equal(node.name);
|
|
66
|
-
|
|
67
|
-
node.name = 'foobar';
|
|
68
|
-
nodeBis = node.clone();
|
|
69
|
-
expect(nodeBis.coords.equalsTo(node.coords)).true;
|
|
70
|
-
expect(nodeBis.name).equal(node.name);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it('toJson / fromJson', () => {
|
|
74
|
-
|
|
75
|
-
const node = new Node(pos1);
|
|
76
|
-
|
|
77
|
-
let jsonNode = node.toJson();
|
|
78
|
-
expect(jsonNode.coords).deep.equals([45, 5]);
|
|
79
|
-
expect(jsonNode.name).is.undefined;
|
|
80
|
-
|
|
81
|
-
let nodeBis = Node.fromJson(jsonNode);
|
|
82
|
-
expect(nodeBis.coords.equalsTo(node.coords)).true;
|
|
83
|
-
expect(nodeBis.name).equal(node.name);
|
|
84
|
-
|
|
85
|
-
node.name = 'foobar';
|
|
86
|
-
|
|
87
|
-
jsonNode = node.toJson();
|
|
88
|
-
expect(jsonNode.coords).deep.equals([45, 5]);
|
|
89
|
-
expect(jsonNode.name).equal('foobar');
|
|
90
|
-
|
|
91
|
-
nodeBis = Node.fromJson(jsonNode);
|
|
92
|
-
expect(nodeBis.coords.equalsTo(node.coords)).true;
|
|
93
|
-
expect(nodeBis.name).equal(node.name);
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
// eslint-disable-next-line max-statements
|
|
97
|
-
it('generateNodesLevels', () => {
|
|
98
|
-
|
|
99
|
-
const cleanNodes = count => [...Array(count)].map((_ignore, idx) => new Node(new Coordinates(0, 0), 'n' + idx));
|
|
100
|
-
const cleanNodesWithAdjEdges = (...levelEdges) => {
|
|
101
|
-
const _nodes = cleanNodes(levelEdges.length + 1);
|
|
102
|
-
levelEdges.forEach((level, idx) => new Edge(_nodes[0], _nodes[idx + 1], level));
|
|
103
|
-
return _nodes;
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
let nodes;
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Simple case with only adjacent nodes
|
|
110
|
-
*/
|
|
111
|
-
|
|
112
|
-
nodes = cleanNodesWithAdjEdges(new Level(1), new Level(0));
|
|
113
|
-
expect(Node.generateNodesLevels(nodes)).false;
|
|
114
|
-
expect(nodes[0].coords.level).is.null;
|
|
115
|
-
|
|
116
|
-
nodes = cleanNodesWithAdjEdges(new Level(1), new Level(1));
|
|
117
|
-
expect(Node.generateNodesLevels(nodes)).true;
|
|
118
|
-
expect(Level.equalsTo(nodes[0].coords.level, new Level(1))).true;
|
|
119
|
-
|
|
120
|
-
nodes = cleanNodesWithAdjEdges(new Level(1), new Level(1, 2));
|
|
121
|
-
expect(Node.generateNodesLevels(nodes)).true;
|
|
122
|
-
expect(Level.equalsTo(nodes[0].coords.level, new Level(1))).true;
|
|
123
|
-
|
|
124
|
-
nodes = cleanNodesWithAdjEdges(new Level(0, 1), new Level(1, 2));
|
|
125
|
-
expect(Node.generateNodesLevels(nodes)).true;
|
|
126
|
-
expect(Level.equalsTo(nodes[0].coords.level, new Level(1))).true;
|
|
127
|
-
|
|
128
|
-
nodes = cleanNodesWithAdjEdges(new Level(0, 1));
|
|
129
|
-
expect(Node.generateNodesLevels(nodes)).true;
|
|
130
|
-
expect(Level.equalsTo(nodes[0].coords.level, new Level(0, 1))).true;
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* More complex cases with no adjacent edges
|
|
134
|
-
*/
|
|
135
|
-
|
|
136
|
-
nodes = cleanNodes(4);
|
|
137
|
-
new Edge(nodes[0], nodes[1], new Level(1), 'e0');
|
|
138
|
-
new Edge(nodes[1], nodes[2], new Level(1, 2), 'e1');
|
|
139
|
-
new Edge(nodes[2], nodes[3], new Level(1, 2), 'e2');
|
|
140
|
-
expect(Node.generateNodesLevels(nodes)).true;
|
|
141
|
-
expect(Level.equalsTo(nodes[0].coords.level, new Level(1))).true;
|
|
142
|
-
expect(Level.equalsTo(nodes[1].coords.level, new Level(1))).true;
|
|
143
|
-
expect(Level.equalsTo(nodes[2].coords.level, new Level(1, 2))).true;
|
|
144
|
-
expect(Level.equalsTo(nodes[3].coords.level, new Level(2))).true;
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
nodes = cleanNodes(5);
|
|
148
|
-
new Edge(nodes[0], nodes[1], new Level(1), 'e0');
|
|
149
|
-
new Edge(nodes[1], nodes[2], new Level(1, 2), 'e1');
|
|
150
|
-
new Edge(nodes[2], nodes[3], new Level(1, 2), 'e2');
|
|
151
|
-
new Edge(nodes[2], nodes[4], null, 'e3');
|
|
152
|
-
expect(Node.generateNodesLevels(nodes)).true;
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
nodes = cleanNodes(4);
|
|
156
|
-
new Edge(nodes[0], nodes[1], new Level(1), 'e0');
|
|
157
|
-
new Edge(nodes[1], nodes[2], new Level(0, 1), 'e1');
|
|
158
|
-
new Edge(nodes[2], nodes[3], new Level(0, 1), 'e2');
|
|
159
|
-
expect(Node.generateNodesLevels(nodes)).true;
|
|
160
|
-
expect(Level.equalsTo(nodes[0].coords.level, new Level(1))).true;
|
|
161
|
-
expect(Level.equalsTo(nodes[1].coords.level, new Level(1))).true;
|
|
162
|
-
expect(Level.equalsTo(nodes[2].coords.level, new Level(0, 1))).true;
|
|
163
|
-
expect(Level.equalsTo(nodes[3].coords.level, new Level(0))).true;
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
nodes = cleanNodes(4);
|
|
167
|
-
new Edge(nodes[0], nodes[1], new Level(1), 'e0');
|
|
168
|
-
new Edge(nodes[1], nodes[2], new Level(1, 2), 'e1');
|
|
169
|
-
new Edge(nodes[2], nodes[3], new Level(1, 2), 'e2');
|
|
170
|
-
new Edge(nodes[1], nodes[3], new Level(1), 'e3');
|
|
171
|
-
expect(Node.generateNodesLevels(nodes)).true;
|
|
172
|
-
expect(Level.equalsTo(nodes[0].coords.level, new Level(1))).true;
|
|
173
|
-
expect(Level.equalsTo(nodes[1].coords.level, new Level(1))).true;
|
|
174
|
-
expect(Level.equalsTo(nodes[2].coords.level, new Level(2))).true;
|
|
175
|
-
expect(Level.equalsTo(nodes[3].coords.level, new Level(1))).true;
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
nodes = cleanNodes(4);
|
|
179
|
-
new Edge(nodes[0], nodes[1], new Level(1), 'e0');
|
|
180
|
-
new Edge(nodes[1], nodes[2], new Level(0, 1), 'e1');
|
|
181
|
-
new Edge(nodes[2], nodes[3], new Level(0, 1), 'e2');
|
|
182
|
-
new Edge(nodes[1], nodes[3], new Level(1), 'e3');
|
|
183
|
-
expect(Node.generateNodesLevels(nodes)).true;
|
|
184
|
-
expect(Level.equalsTo(nodes[0].coords.level, new Level(1))).true;
|
|
185
|
-
expect(Level.equalsTo(nodes[1].coords.level, new Level(1))).true;
|
|
186
|
-
expect(Level.equalsTo(nodes[2].coords.level, new Level(0))).true;
|
|
187
|
-
expect(Level.equalsTo(nodes[3].coords.level, new Level(1))).true;
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
nodes = cleanNodes(6);
|
|
191
|
-
new Edge(nodes[0], nodes[1], new Level(1), 'e0');
|
|
192
|
-
new Edge(nodes[1], nodes[2], new Level(1, 2), 'e1');
|
|
193
|
-
new Edge(nodes[2], nodes[3], new Level(1, 2), 'e2');
|
|
194
|
-
new Edge(nodes[2], nodes[4], new Level(1, 2), 'e3');
|
|
195
|
-
new Edge(nodes[4], nodes[5], new Level(2), 'e4');
|
|
196
|
-
expect(Node.generateNodesLevels(nodes)).false;
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
nodes = cleanNodes(5);
|
|
200
|
-
new Edge(nodes[0], nodes[1], new Level(1, 2));
|
|
201
|
-
new Edge(nodes[1], nodes[2], new Level(1, 2));
|
|
202
|
-
new Edge(nodes[2], nodes[3], new Level(1, 2));
|
|
203
|
-
new Edge(nodes[3], nodes[4], new Level(1));
|
|
204
|
-
expect(Node.generateNodesLevels(nodes)).true;
|
|
205
|
-
expect(Level.equalsTo(nodes[0].coords.level, new Level(2))).true;
|
|
206
|
-
expect(Level.equalsTo(nodes[1].coords.level, new Level(1, 2))).true;
|
|
207
|
-
expect(Level.equalsTo(nodes[2].coords.level, new Level(1, 2))).true;
|
|
208
|
-
expect(Level.equalsTo(nodes[3].coords.level, new Level(1))).true;
|
|
209
|
-
expect(Level.equalsTo(nodes[4].coords.level, new Level(1))).true;
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
nodes = cleanNodes(6);
|
|
213
|
-
new Edge(nodes[0], nodes[1], new Level(0), 'e0');
|
|
214
|
-
new Edge(nodes[1], nodes[2], new Level(0, 1), 'e1');
|
|
215
|
-
new Edge(nodes[2], nodes[3], new Level(0, 1), 'e2');
|
|
216
|
-
new Edge(nodes[3], nodes[4], new Level(0, 1), 'e3');
|
|
217
|
-
new Edge(nodes[4], nodes[5], new Level(1), 'e4');
|
|
218
|
-
expect(Node.generateNodesLevels(nodes)).true;
|
|
219
|
-
expect(Level.equalsTo(nodes[1].coords.level, new Level(0))).true;
|
|
220
|
-
expect(Level.equalsTo(nodes[1].coords.level, new Level(0))).true;
|
|
221
|
-
expect(Level.equalsTo(nodes[2].coords.level, new Level(0, 1))).true;
|
|
222
|
-
expect(Level.equalsTo(nodes[3].coords.level, new Level(0, 1))).true;
|
|
223
|
-
expect(Level.equalsTo(nodes[4].coords.level, new Level(1))).true;
|
|
224
|
-
expect(Level.equalsTo(nodes[5].coords.level, new Level(1))).true;
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
});
|
package/src/graph/Step.js
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import Coordinates from '../coordinates/Coordinates.js';
|
|
2
|
-
|
|
3
|
-
import Edge from './Edge.js';
|
|
4
|
-
import LevelChange from './LevelChange.js';
|
|
5
|
-
import Node from './Node.js';
|
|
6
|
-
import { getDurationFromLength } from './Utils.js';
|
|
7
|
-
|
|
8
|
-
class Step {
|
|
9
|
-
|
|
10
|
-
/** @type {number} */
|
|
11
|
-
number;
|
|
12
|
-
|
|
13
|
-
/** @type {Node[]} */
|
|
14
|
-
nodes = [];
|
|
15
|
-
|
|
16
|
-
/** @type {Edge[]} */
|
|
17
|
-
edges = [];
|
|
18
|
-
|
|
19
|
-
/** @type {number} */
|
|
20
|
-
angle;
|
|
21
|
-
|
|
22
|
-
/** @type {number} */
|
|
23
|
-
previousBearing;
|
|
24
|
-
|
|
25
|
-
/** @type {number} */
|
|
26
|
-
nextBearing;
|
|
27
|
-
|
|
28
|
-
/** @type {boolean} */
|
|
29
|
-
firstStep = false;
|
|
30
|
-
|
|
31
|
-
/** @type {boolean} */
|
|
32
|
-
lastStep = false;
|
|
33
|
-
|
|
34
|
-
/** @type {LevelChange} */
|
|
35
|
-
levelChange = null;
|
|
36
|
-
|
|
37
|
-
/** @type {number} */
|
|
38
|
-
_length = 0;
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* @param {object} obj
|
|
43
|
-
*/
|
|
44
|
-
constructor(obj) {
|
|
45
|
-
if (typeof obj === 'object') {
|
|
46
|
-
Object.assign(this, obj);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/** @type {Node} */
|
|
51
|
-
get node() {
|
|
52
|
-
return this.nodes[0];
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/** @type {Edge} */
|
|
56
|
-
get nextEdge() {
|
|
57
|
-
if (this.edges.length === 0) {
|
|
58
|
-
return null;
|
|
59
|
-
}
|
|
60
|
-
return this.edges[0];
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Get route length
|
|
65
|
-
* @type {number}
|
|
66
|
-
*/
|
|
67
|
-
get length() {
|
|
68
|
-
if (!this._length) {
|
|
69
|
-
this._length = this.edges.reduce((acc, edge) => acc + edge.length, 0);
|
|
70
|
-
}
|
|
71
|
-
return this._length;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Get route duration with default speed
|
|
76
|
-
* @type {number}
|
|
77
|
-
*/
|
|
78
|
-
get duration() {
|
|
79
|
-
return this.getDuration();
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Get route duration
|
|
84
|
-
* @param {number} speed in km/h
|
|
85
|
-
*/
|
|
86
|
-
getDuration(speed) {
|
|
87
|
-
return getDurationFromLength(this.length, speed);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Get step location
|
|
92
|
-
* @type {!Coordinates}
|
|
93
|
-
*/
|
|
94
|
-
get location() {
|
|
95
|
-
return this.nodes[0].coords;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
export default Step;
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
/* eslint-disable complexity */
|
|
2
|
-
/* eslint-disable max-statements */
|
|
3
|
-
import {
|
|
4
|
-
diffAngle, deg2rad
|
|
5
|
-
} from '@wemap/maths';
|
|
6
|
-
|
|
7
|
-
import Coordinates from '../coordinates/Coordinates.js';
|
|
8
|
-
import Itinerary from './Itinerary.js';
|
|
9
|
-
import LevelChange from './LevelChange.js';
|
|
10
|
-
|
|
11
|
-
import Step from './Step.js';
|
|
12
|
-
|
|
13
|
-
const SKIP_STEP_ANGLE_MAX = deg2rad(20);
|
|
14
|
-
|
|
15
|
-
class StepsGeneration {
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* @param {Itinerary} itinerary
|
|
19
|
-
* @returns {object}
|
|
20
|
-
*/
|
|
21
|
-
static fromItinerary(itinerary) {
|
|
22
|
-
|
|
23
|
-
const steps = [];
|
|
24
|
-
const nextStepsIndexes = [];
|
|
25
|
-
|
|
26
|
-
let indexOfCurrentStep;
|
|
27
|
-
let numberOfNodesToFill;
|
|
28
|
-
|
|
29
|
-
let currentStep, previousStep;
|
|
30
|
-
let previousBearing = itinerary.start.bearingTo(itinerary.nodes[0].coords);
|
|
31
|
-
|
|
32
|
-
for (let i = 0; i < itinerary.nodes.length - 1; i++) {
|
|
33
|
-
|
|
34
|
-
const isFirstStep = !currentStep;
|
|
35
|
-
|
|
36
|
-
const node = itinerary.nodes[i];
|
|
37
|
-
const nextNode = itinerary.nodes[i + 1];
|
|
38
|
-
const edge = itinerary.edges[i];
|
|
39
|
-
|
|
40
|
-
const bearing = edge.bearing + (edge.node1 !== node ? Math.PI : 0);
|
|
41
|
-
const angle = diffAngle(previousBearing, bearing + Math.PI);
|
|
42
|
-
|
|
43
|
-
if (!isFirstStep) {
|
|
44
|
-
currentStep.nodes.push(node);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
let splitByAngle = Math.abs(diffAngle(Math.PI, angle)) >= SKIP_STEP_ANGLE_MAX;
|
|
48
|
-
|
|
49
|
-
const splitByLevel = edge.level && edge.level.isRange
|
|
50
|
-
&& node.coords.level && !node.coords.level.isRange;
|
|
51
|
-
splitByAngle = splitByAngle && !(node.coords.level && node.coords.level.isRange);
|
|
52
|
-
|
|
53
|
-
const splitStepCondition = splitByAngle || splitByLevel;
|
|
54
|
-
|
|
55
|
-
// New step creation
|
|
56
|
-
if (isFirstStep || splitStepCondition || node.subwayEntrance) {
|
|
57
|
-
|
|
58
|
-
previousStep = currentStep;
|
|
59
|
-
|
|
60
|
-
currentStep = new Step();
|
|
61
|
-
currentStep.number = steps.length + 1;
|
|
62
|
-
currentStep.angle = angle;
|
|
63
|
-
currentStep.previousBearing = previousBearing;
|
|
64
|
-
currentStep.nextBearing = bearing;
|
|
65
|
-
|
|
66
|
-
if (splitByLevel) {
|
|
67
|
-
currentStep.levelChange = LevelChange.fromTwoNodes(node, nextNode);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
currentStep.nodes.push(node);
|
|
71
|
-
steps.push(currentStep);
|
|
72
|
-
|
|
73
|
-
if (!previousStep) {
|
|
74
|
-
currentStep.firstStep = true;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
indexOfCurrentStep = steps.length - 1;
|
|
78
|
-
numberOfNodesToFill = previousStep ? previousStep.nodes.length - 1 : 1;
|
|
79
|
-
for (let j = 0; j < numberOfNodesToFill; j++) {
|
|
80
|
-
nextStepsIndexes.push(indexOfCurrentStep);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
currentStep.edges.push(edge);
|
|
85
|
-
|
|
86
|
-
if (i === itinerary.nodes.length - 2) {
|
|
87
|
-
currentStep.nodes.push(nextNode);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
previousBearing = bearing;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
const lastNode = itinerary.nodes[itinerary.nodes.length - 1];
|
|
94
|
-
const lastStep = new Step();
|
|
95
|
-
lastStep.number = steps.length + 1;
|
|
96
|
-
lastStep._length = 0;
|
|
97
|
-
lastStep.previousBearing = previousBearing;
|
|
98
|
-
if (!Coordinates.equalsTo(lastNode.coords, itinerary.end)) {
|
|
99
|
-
lastStep.nextBearing = lastNode.coords.bearingTo(itinerary.end);
|
|
100
|
-
lastStep.angle = diffAngle(lastStep.previousBearing, lastStep.nextBearing + Math.PI);
|
|
101
|
-
}
|
|
102
|
-
lastStep.lastStep = true;
|
|
103
|
-
lastStep.nodes.push(lastNode);
|
|
104
|
-
steps.push(lastStep);
|
|
105
|
-
|
|
106
|
-
indexOfCurrentStep = steps.length - 1;
|
|
107
|
-
numberOfNodesToFill = itinerary.nodes.length - nextStepsIndexes.length;
|
|
108
|
-
for (let j = 0; j < numberOfNodesToFill; j++) {
|
|
109
|
-
nextStepsIndexes.push(indexOfCurrentStep);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
return {
|
|
113
|
-
steps,
|
|
114
|
-
nextStepsIndexes
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
}
|
|
119
|
-
export default StepsGeneration;
|