@wemap/osm 3.2.17 → 4.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/assets/bureaux-wemap-montpellier-network.osm +10 -0
- package/assets/network-elevator.osm +26 -26
- package/index.js +7 -19
- package/package.json +5 -6
- package/src/model/OsmModel.js +1 -0
- package/src/model/OsmWay.js +4 -2
- package/src/network/OsmNetworkUtils.js +159 -0
- package/src/network/OsmNetworkUtils.spec.js +130 -0
- package/src/network/OsmRouter.spec.js +29 -18
- package/src/osrm/OsrmUtils.js +224 -256
- package/src/osrm/OsrmUtils.spec.js +46 -31
- package/src/network/OsmNetwork.js +0 -156
- package/src/network/OsmNetwork.spec.js +0 -107
- package/src/network/OsmRouter.js +0 -75
|
@@ -81,6 +81,7 @@
|
|
|
81
81
|
<nd ref='-440474' />
|
|
82
82
|
<tag k='highway' v='footway' />
|
|
83
83
|
<tag k='level' v='2' />
|
|
84
|
+
<tag k='name' v='w2' />
|
|
84
85
|
</way>
|
|
85
86
|
<way id='-440500' action='modify' visible='true'>
|
|
86
87
|
<nd ref='-440464' />
|
|
@@ -91,6 +92,7 @@
|
|
|
91
92
|
<nd ref='-440480' />
|
|
92
93
|
<tag k='highway' v='footway' />
|
|
93
94
|
<tag k='level' v='2' />
|
|
95
|
+
<tag k='name' v='w3' />
|
|
94
96
|
</way>
|
|
95
97
|
<way id='-440501' action='modify' visible='true'>
|
|
96
98
|
<nd ref='-440472' />
|
|
@@ -102,6 +104,7 @@
|
|
|
102
104
|
<nd ref='-440478' />
|
|
103
105
|
<tag k='highway' v='footway' />
|
|
104
106
|
<tag k='level' v='2' />
|
|
107
|
+
<tag k='name' v='w1' />
|
|
105
108
|
</way>
|
|
106
109
|
<way id='-440502' action='modify' visible='true'>
|
|
107
110
|
<nd ref='-440486' />
|
|
@@ -110,12 +113,14 @@
|
|
|
110
113
|
<nd ref='-440492' />
|
|
111
114
|
<tag k='highway' v='steps' />
|
|
112
115
|
<tag k='level' v='1;2' />
|
|
116
|
+
<tag k='name' v='w6' />
|
|
113
117
|
</way>
|
|
114
118
|
<way id='-440503' action='modify' visible='true'>
|
|
115
119
|
<nd ref='-440484' />
|
|
116
120
|
<nd ref='-440486' />
|
|
117
121
|
<tag k='highway' v='footway' />
|
|
118
122
|
<tag k='level' v='2' />
|
|
123
|
+
<tag k='name' v='w5' />
|
|
119
124
|
</way>
|
|
120
125
|
<way id='-440504' action='modify' visible='true'>
|
|
121
126
|
<nd ref='-440492' />
|
|
@@ -124,29 +129,34 @@
|
|
|
124
129
|
<nd ref='-440496' />
|
|
125
130
|
<tag k='highway' v='footway' />
|
|
126
131
|
<tag k='level' v='1' />
|
|
132
|
+
<tag k='name' v='w7' />
|
|
127
133
|
</way>
|
|
128
134
|
<way id='-440505' action='modify' visible='true'>
|
|
129
135
|
<nd ref='-440494' />
|
|
130
136
|
<nd ref='-440498' />
|
|
131
137
|
<tag k='highway' v='footway' />
|
|
132
138
|
<tag k='level' v='1' />
|
|
139
|
+
<tag k='name' v='w9' />
|
|
133
140
|
</way>
|
|
134
141
|
<way id='-441188' action='modify' visible='true'>
|
|
135
142
|
<nd ref='-441184' />
|
|
136
143
|
<nd ref='-441187' />
|
|
137
144
|
<tag k='highway' v='footway' />
|
|
138
145
|
<tag k='level' v='2' />
|
|
146
|
+
<tag k='name' v='w4' />
|
|
139
147
|
</way>
|
|
140
148
|
<way id='-441214' action='modify' visible='true'>
|
|
141
149
|
<nd ref='-441210' />
|
|
142
150
|
<nd ref='-441187' />
|
|
143
151
|
<tag k='highway' v='footway' />
|
|
144
152
|
<tag k='level' v='1' />
|
|
153
|
+
<tag k='name' v='w8' />
|
|
145
154
|
</way>
|
|
146
155
|
<way id='-441263' action='modify' visible='true'>
|
|
147
156
|
<nd ref='-441187' />
|
|
148
157
|
<nd ref='-441262' />
|
|
149
158
|
<tag k='highway' v='footway' />
|
|
150
159
|
<tag k='level' v='0' />
|
|
160
|
+
<tag k='name' v='w10' />
|
|
151
161
|
</way>
|
|
152
162
|
</osm>
|
|
@@ -1,47 +1,47 @@
|
|
|
1
1
|
<?xml version='1.0' encoding='UTF-8'?>
|
|
2
|
-
<osm>
|
|
3
|
-
<node id='1' lat='43.60933232537' lon='3.88424831515'>
|
|
2
|
+
<osm version='0.6'>
|
|
3
|
+
<node id='-1' lat='43.60933232537' lon='3.88424831515' version='1'>
|
|
4
4
|
<tag k='highway' v='elevator' />
|
|
5
5
|
<tag k='level' v='1;3' />
|
|
6
|
-
<tag k='name' v='
|
|
6
|
+
<tag k='name' v='px' />
|
|
7
7
|
</node>
|
|
8
|
-
<node id='
|
|
8
|
+
<node id='1' lat='43.60932786117' lon='3.88427765877' version='1'>
|
|
9
9
|
<tag k='name' v='p1' />
|
|
10
10
|
</node>
|
|
11
|
-
<node id='
|
|
12
|
-
<tag k='name' v='
|
|
11
|
+
<node id='2' lat='43.60932786111' lon='3.8842776591' version='1'>
|
|
12
|
+
<tag k='name' v='p2' />
|
|
13
13
|
</node>
|
|
14
|
-
<node id='
|
|
15
|
-
<tag k='name' v='
|
|
14
|
+
<node id='3' lat='43.60932198746' lon='3.8843159771' version='1'>
|
|
15
|
+
<tag k='name' v='p3-1' />
|
|
16
16
|
</node>
|
|
17
|
-
<node id='
|
|
18
|
-
<tag k='name' v='
|
|
17
|
+
<node id='4' lat='43.60932198746' lon='3.8843159771' version='1'>
|
|
18
|
+
<tag k='name' v='p3-2' />
|
|
19
19
|
</node>
|
|
20
|
-
<way id='101'>
|
|
20
|
+
<way id='101' version='1'>
|
|
21
|
+
<nd ref='-1' />
|
|
21
22
|
<nd ref='1' />
|
|
22
|
-
<
|
|
23
|
-
<tag k='highway' v='footway'>
|
|
23
|
+
<tag k='highway' v='footway' />
|
|
24
24
|
<tag k='level' v='1' />
|
|
25
25
|
<tag k='name' v='w1' />
|
|
26
26
|
</way>
|
|
27
|
-
<way id='102'>
|
|
28
|
-
<nd ref='1' />
|
|
29
|
-
<nd ref='
|
|
30
|
-
<tag k='highway' v='footway'
|
|
27
|
+
<way id='102' version='1'>
|
|
28
|
+
<nd ref='-1' />
|
|
29
|
+
<nd ref='2' />
|
|
30
|
+
<tag k='highway' v='footway' />
|
|
31
31
|
<tag k='level' v='2' />
|
|
32
32
|
<tag k='name' v='w2' />
|
|
33
33
|
</way>
|
|
34
|
-
<way id='103'>
|
|
35
|
-
<nd ref='1' />
|
|
36
|
-
<nd ref='
|
|
37
|
-
<tag k='highway' v='footway'
|
|
34
|
+
<way id='103' version='1'>
|
|
35
|
+
<nd ref='-1' />
|
|
36
|
+
<nd ref='3' />
|
|
37
|
+
<tag k='highway' v='footway' />
|
|
38
38
|
<tag k='level' v='3' />
|
|
39
|
-
<tag k='name' v='w3' />
|
|
39
|
+
<tag k='name' v='w3-1' />
|
|
40
40
|
</way>
|
|
41
|
-
<way id='104'>
|
|
42
|
-
<nd ref='1' />
|
|
43
|
-
<nd ref='
|
|
44
|
-
<tag k='highway' v='footway'
|
|
41
|
+
<way id='104' version='1'>
|
|
42
|
+
<nd ref='-1' />
|
|
43
|
+
<nd ref='4' />
|
|
44
|
+
<tag k='highway' v='footway' />
|
|
45
45
|
<tag k='level' v='3' />
|
|
46
46
|
<tag k='name' v='w3-2' />
|
|
47
47
|
</way>
|
package/index.js
CHANGED
|
@@ -1,19 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
import OsrmUtils from './src/osrm/OsrmUtils.js';
|
|
9
|
-
|
|
10
|
-
export {
|
|
11
|
-
OsmElement,
|
|
12
|
-
OsmModel,
|
|
13
|
-
OsmNetwork,
|
|
14
|
-
OsmNode,
|
|
15
|
-
OsmParser,
|
|
16
|
-
OsmRouter,
|
|
17
|
-
OsmWay,
|
|
18
|
-
OsrmUtils
|
|
19
|
-
};
|
|
1
|
+
export { default as OsmElement } from './src/model/OsmElement.js';
|
|
2
|
+
export { default as OsmModel } from './src/model/OsmModel.js';
|
|
3
|
+
export { default as OsmNetworkUtils } from './src/network/OsmNetworkUtils.js';
|
|
4
|
+
export { default as OsmNode } from './src/model/OsmNode.js';
|
|
5
|
+
export { default as OsmParser } from './src/model/OsmParser.js';
|
|
6
|
+
export { default as OsmWay } from './src/model/OsmWay.js';
|
|
7
|
+
export * as OsrmUtils from './src/osrm/OsrmUtils.js';
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"directory": "packages/osm"
|
|
12
12
|
},
|
|
13
13
|
"name": "@wemap/osm",
|
|
14
|
-
"version": "
|
|
14
|
+
"version": "4.0.0",
|
|
15
15
|
"bugs": {
|
|
16
16
|
"url": "https://github.com/wemap/wemap-modules-js/issues"
|
|
17
17
|
},
|
|
@@ -25,11 +25,10 @@
|
|
|
25
25
|
],
|
|
26
26
|
"license": "ISC",
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@wemap/geo": "^
|
|
29
|
-
"@wemap/
|
|
30
|
-
"@wemap/
|
|
31
|
-
"@wemap/maths": "^3.2.17",
|
|
28
|
+
"@wemap/geo": "^4.0.0",
|
|
29
|
+
"@wemap/logger": "^4.0.0",
|
|
30
|
+
"@wemap/maths": "^4.0.0",
|
|
32
31
|
"sax": "^1.2.4"
|
|
33
32
|
},
|
|
34
|
-
"gitHead": "
|
|
33
|
+
"gitHead": "8b72858590fc2ff33fbea4f090de8cd353a7445f"
|
|
35
34
|
}
|
package/src/model/OsmModel.js
CHANGED
package/src/model/OsmWay.js
CHANGED
|
@@ -8,15 +8,17 @@ class OsmWay extends OsmElement {
|
|
|
8
8
|
/** @type {OsmNode[]} */
|
|
9
9
|
nodes = [];
|
|
10
10
|
|
|
11
|
-
/** @type {Level} */
|
|
11
|
+
/** @type {?Level} */
|
|
12
12
|
level = null;
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* @param {number} id
|
|
16
16
|
* @param {object} tags
|
|
17
|
+
* @param {?Level} level
|
|
17
18
|
*/
|
|
18
|
-
constructor(id, tags) {
|
|
19
|
+
constructor(id, tags, level) {
|
|
19
20
|
super(id, tags);
|
|
21
|
+
this.level = level || null;
|
|
20
22
|
}
|
|
21
23
|
|
|
22
24
|
/**
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { Level, Edge, Node, Network } from '@wemap/geo';
|
|
2
|
+
|
|
3
|
+
import OsmModel from '../model/OsmModel.js';
|
|
4
|
+
import OsmNode from '../model/OsmNode.js';
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class OsmNetworkUtils {
|
|
8
|
+
|
|
9
|
+
static HIGHWAYS_PEDESTRIANS = ['footway', 'steps', 'pedestrian', 'living_street', 'path', 'track', 'sidewalk'];
|
|
10
|
+
static DEFAULT_WAY_SELECTOR = way => this.HIGHWAYS_PEDESTRIANS.includes(way.tags.highway) || way.tags.footway === 'sidewalk';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @param {OsmModel} osmModel
|
|
14
|
+
* @param {function} _waySelectionFilter
|
|
15
|
+
* @returns {Network}
|
|
16
|
+
*/
|
|
17
|
+
static createNetworkFromOsmModel(osmModel, waySelectionFilter = this.DEFAULT_WAY_SELECTOR) {
|
|
18
|
+
|
|
19
|
+
const networkModel = new Network();
|
|
20
|
+
|
|
21
|
+
const nodesCreated = {};
|
|
22
|
+
const elevatorNodes = [];
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @param {OsmNode} osmNode
|
|
26
|
+
*/
|
|
27
|
+
const getOrCreateNode = osmNode => {
|
|
28
|
+
let node = nodesCreated[osmNode.id];
|
|
29
|
+
if (!node) {
|
|
30
|
+
node = new Node(osmNode.coords);
|
|
31
|
+
this._applyNodePropertiesFromTags(node, osmNode.tags);
|
|
32
|
+
nodesCreated[osmNode.id] = node;
|
|
33
|
+
networkModel.nodes.push(node);
|
|
34
|
+
|
|
35
|
+
if (osmNode.tags.highway === 'elevator') {
|
|
36
|
+
elevatorNodes.push(node);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return node;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
osmModel.ways.forEach(way => {
|
|
43
|
+
if (!waySelectionFilter(way)) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
let firstNode = getOrCreateNode(way.nodes[0]);
|
|
48
|
+
for (let i = 1; i < way.nodes.length; i++) {
|
|
49
|
+
const secondNode = getOrCreateNode(way.nodes[i]);
|
|
50
|
+
|
|
51
|
+
const edge = new Edge(firstNode, secondNode);
|
|
52
|
+
edge.level = way.level;
|
|
53
|
+
this._applyEdgePropertiesFromTags(edge, way.tags);
|
|
54
|
+
networkModel.edges.push(edge);
|
|
55
|
+
|
|
56
|
+
firstNode = secondNode;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
elevatorNodes.forEach(node => {
|
|
62
|
+
// We have to clone this node for each connected edge
|
|
63
|
+
this._createNodesAndEdgesFromElevator(networkModel, node);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
Node.generateNodesLevels(networkModel.nodes);
|
|
67
|
+
|
|
68
|
+
return networkModel;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* @param {node} node
|
|
74
|
+
* @param {object} tags
|
|
75
|
+
*/
|
|
76
|
+
static _applyNodePropertiesFromTags(node, tags) {
|
|
77
|
+
node.name = tags.name || null;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* @param {Edge} edge
|
|
82
|
+
* @param {object} tags
|
|
83
|
+
*/
|
|
84
|
+
static _applyEdgePropertiesFromTags(edge, tags) {
|
|
85
|
+
const { highway, oneway, conveying, name } = tags;
|
|
86
|
+
edge.name = name || null;
|
|
87
|
+
edge.isStairs = highway === 'steps';
|
|
88
|
+
edge.isConveying = 'conveying' in tags;
|
|
89
|
+
edge.isOneway = Boolean((oneway === 'yes' || oneway === 'true' || oneway === '1')
|
|
90
|
+
|| (conveying && highway && ['yes', 'forward', 'backward'].includes(conveying)));
|
|
91
|
+
|
|
92
|
+
if (conveying === 'backward') {
|
|
93
|
+
const tmpNode = edge.node1;
|
|
94
|
+
edge.node1 = edge.node2;
|
|
95
|
+
edge.node2 = tmpNode;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* @param {Network} networkModel
|
|
102
|
+
* @param {Node} node
|
|
103
|
+
*/
|
|
104
|
+
static _createNodesAndEdgesFromElevator(networkModel, node) {
|
|
105
|
+
|
|
106
|
+
/** @type {Node[]} */
|
|
107
|
+
const createdNodes = [];
|
|
108
|
+
const getOrCreateLevelNode = level => {
|
|
109
|
+
let levelNode = createdNodes.find(({ coords }) => Level.equalsTo(level, coords.level));
|
|
110
|
+
if (!levelNode) {
|
|
111
|
+
levelNode = node.clone();
|
|
112
|
+
levelNode.applyProperties(node.extractProperties());
|
|
113
|
+
levelNode.coords.level = level;
|
|
114
|
+
createdNodes.push(levelNode);
|
|
115
|
+
networkModel.nodes.push(levelNode);
|
|
116
|
+
}
|
|
117
|
+
return levelNode;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// Create nodes from node.edges
|
|
121
|
+
node.edges.forEach(edge => {
|
|
122
|
+
if (edge.level.isRange) {
|
|
123
|
+
throw new Error('Cannot handle this elevator edge due to ambiguity');
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const levelNode = getOrCreateLevelNode(edge.level);
|
|
127
|
+
if (edge.node1 === node) {
|
|
128
|
+
edge.node1 = levelNode;
|
|
129
|
+
} else {
|
|
130
|
+
edge.node2 = levelNode;
|
|
131
|
+
}
|
|
132
|
+
levelNode.edges.push(edge);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
// Create edges from createdNodes
|
|
136
|
+
for (let i = 0; i < createdNodes.length; i++) {
|
|
137
|
+
for (let j = i + 1; j < createdNodes.length; j++) {
|
|
138
|
+
|
|
139
|
+
const createdNode1 = createdNodes[i];
|
|
140
|
+
const createdNode2 = createdNodes[j];
|
|
141
|
+
|
|
142
|
+
const newEdge = new Edge(
|
|
143
|
+
createdNode1,
|
|
144
|
+
createdNode2,
|
|
145
|
+
new Level(createdNode1.coords.level.val, createdNode2.coords.level.val)
|
|
146
|
+
);
|
|
147
|
+
newEdge.name = node.name;
|
|
148
|
+
newEdge.isElevator = true;
|
|
149
|
+
networkModel.edges.push(newEdge);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Remove the historical elevator node from the network
|
|
154
|
+
networkModel.nodes = networkModel.nodes.filter(_node => _node !== node);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export default OsmNetworkUtils;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/* eslint-disable max-statements */
|
|
2
|
+
import chai from 'chai';
|
|
3
|
+
import fs from 'fs';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
|
|
7
|
+
import { Network } from '@wemap/geo';
|
|
8
|
+
import { verifyCoherence } from '@wemap/geo/tests/CommonTest.js';
|
|
9
|
+
|
|
10
|
+
import OsmParser from '../model/OsmParser.js';
|
|
11
|
+
import OsmModel from '../model/OsmModel.js';
|
|
12
|
+
import OsmNetworkUtils from './OsmNetworkUtils.js';
|
|
13
|
+
|
|
14
|
+
const { expect } = chai;
|
|
15
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
const loadFile = fileName => {
|
|
19
|
+
const filePath = path.resolve(__dirname, '../../assets/' + fileName);
|
|
20
|
+
return fs.readFileSync(filePath, 'utf8');
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
describe('OsmNetwork - simple', () => {
|
|
24
|
+
|
|
25
|
+
/** @type {OsmModel} */
|
|
26
|
+
let osmModel;
|
|
27
|
+
|
|
28
|
+
/** @type {Network} */
|
|
29
|
+
let network;
|
|
30
|
+
const osmXmlString = loadFile('network-simple.osm');
|
|
31
|
+
|
|
32
|
+
it('Network creation', () => {
|
|
33
|
+
|
|
34
|
+
osmModel = OsmParser.parseOsmXmlString(osmXmlString);
|
|
35
|
+
network = OsmNetworkUtils.createNetworkFromOsmModel(osmModel);
|
|
36
|
+
|
|
37
|
+
verifyCoherence(network);
|
|
38
|
+
expect(network.nodes.length).equals(3);
|
|
39
|
+
expect(network.edges.length).equals(2);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
it('Network creation - waySelectionFilter', () => {
|
|
44
|
+
|
|
45
|
+
const selectionNetwork = OsmNetworkUtils.createNetworkFromOsmModel(osmModel, () => true);
|
|
46
|
+
|
|
47
|
+
verifyCoherence(selectionNetwork);
|
|
48
|
+
expect(selectionNetwork.nodes.length).equals(4);
|
|
49
|
+
expect(selectionNetwork.edges.length).equals(3);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('Network creation - elevator', () => {
|
|
53
|
+
|
|
54
|
+
const elevatorModel = OsmParser.parseOsmXmlString(loadFile('network-elevator.osm'));
|
|
55
|
+
const elevatorNetwork = OsmNetworkUtils.createNetworkFromOsmModel(elevatorModel);
|
|
56
|
+
|
|
57
|
+
verifyCoherence(elevatorNetwork);
|
|
58
|
+
expect(elevatorNetwork.nodes.length).equals(7);
|
|
59
|
+
expect(elevatorNetwork.edges.length).equals(7);
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
const osmModel2 = OsmParser.parseOsmXmlString(`
|
|
63
|
+
<osm>
|
|
64
|
+
<node id='1' lat='43' lon='4'>
|
|
65
|
+
<tag k='highway' v='elevator' />
|
|
66
|
+
<tag k='level' v='0;1' />
|
|
67
|
+
</node>
|
|
68
|
+
<node id='2' lat='43' lon='3' />
|
|
69
|
+
<way id='3'>
|
|
70
|
+
<nd ref='1' />
|
|
71
|
+
<nd ref='2' />
|
|
72
|
+
<tag k='highway' v='footway' />
|
|
73
|
+
<tag k='level' v='0;1' />
|
|
74
|
+
</way>
|
|
75
|
+
</osm>
|
|
76
|
+
`);
|
|
77
|
+
expect(() => OsmNetworkUtils.fromOsmModel(osmModel2)).throw(Error);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('getNodeByName', () => {
|
|
81
|
+
let node = network.getNodeByName('p1');
|
|
82
|
+
expect(node).not.undefined;
|
|
83
|
+
expect(node.name).equal('p1');
|
|
84
|
+
|
|
85
|
+
node = network.getNodeByName('p5');
|
|
86
|
+
expect(node).undefined;
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('toCompressedJson / fromCompressedJson', () => {
|
|
90
|
+
|
|
91
|
+
// const elevatorModel = OsmParser.parseOsmXmlString(loadFile('network-elevator.osm'));
|
|
92
|
+
// const elevatorNetwork = OsmNetworkUtils.fromOsmModel(elevatorModel);
|
|
93
|
+
|
|
94
|
+
// const json = elevatorNetwork.toCompressedJson();
|
|
95
|
+
// expect(() => JSON.stringify(json)).not.throw(Error);
|
|
96
|
+
|
|
97
|
+
// const elevatorNetworkBis = Network.fromCompressedJson(json);
|
|
98
|
+
|
|
99
|
+
// verifyCoherence(elevatorNetwork);
|
|
100
|
+
// expect(elevatorNetwork.edges.length).equal(elevatorNetworkBis.edges.length);
|
|
101
|
+
// expect(elevatorNetwork.nodes.length).equal(elevatorNetworkBis.nodes.length);
|
|
102
|
+
// elevatorNetwork.edges.forEach((edge, idx) => {
|
|
103
|
+
// expect(edge.properties.id).equal(elevatorNetworkBis.edges[idx].properties.id);
|
|
104
|
+
// expect(edge.properties.tags).deep.equal(elevatorNetworkBis.edges[idx].properties.tags);
|
|
105
|
+
// });
|
|
106
|
+
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
describe('OsmNetwork - with stairs', () => {
|
|
112
|
+
|
|
113
|
+
/** @type {OsmModel} */
|
|
114
|
+
let osmModel;
|
|
115
|
+
|
|
116
|
+
/** @type {Network} */
|
|
117
|
+
let network;
|
|
118
|
+
const osmXmlString = loadFile('bureaux-wemap-montpellier-network.osm');
|
|
119
|
+
|
|
120
|
+
it('Network creation', () => {
|
|
121
|
+
|
|
122
|
+
osmModel = OsmParser.parseOsmXmlString(osmXmlString);
|
|
123
|
+
network = OsmNetworkUtils.createNetworkFromOsmModel(osmModel);
|
|
124
|
+
|
|
125
|
+
verifyCoherence(network);
|
|
126
|
+
|
|
127
|
+
expect(network.getEdgeByName('w6').isStairs).true;
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
});
|
|
@@ -5,13 +5,12 @@ import path from 'path';
|
|
|
5
5
|
import { fileURLToPath } from 'url';
|
|
6
6
|
|
|
7
7
|
import {
|
|
8
|
-
Level, Coordinates
|
|
8
|
+
Level, Coordinates, Node, Network, GraphRouter, Itinerary
|
|
9
9
|
} from '@wemap/geo';
|
|
10
|
-
import {
|
|
10
|
+
import { verifyCoherence } from '@wemap/geo/tests/CommonTest.js';
|
|
11
11
|
|
|
12
12
|
import OsmParser from '../model/OsmParser.js';
|
|
13
|
-
import
|
|
14
|
-
import OsmNetwork from './OsmNetwork.js';
|
|
13
|
+
import OsmNetworkUtils from './OsmNetworkUtils.js';
|
|
15
14
|
|
|
16
15
|
const { expect } = chai;
|
|
17
16
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
@@ -20,20 +19,24 @@ const itineraryStart = new Coordinates(43.6092754, 3.8842306, null, new Level(2)
|
|
|
20
19
|
const itineraryEnd = new Coordinates(43.6092602, 3.8842669, null, new Level(1));
|
|
21
20
|
|
|
22
21
|
|
|
22
|
+
/**
|
|
23
|
+
* @param {string} fileName
|
|
24
|
+
* @returns {Network}
|
|
25
|
+
*/
|
|
23
26
|
const loadNetwork = fileName => {
|
|
24
27
|
const filePath = path.resolve(__dirname, '../../assets/' + fileName);
|
|
25
28
|
const osmXmlString = fs.readFileSync(filePath, 'utf8');
|
|
26
29
|
const osmModel = OsmParser.parseOsmXmlString(osmXmlString);
|
|
27
|
-
return
|
|
30
|
+
return OsmNetworkUtils.createNetworkFromOsmModel(osmModel);
|
|
28
31
|
};
|
|
29
32
|
|
|
30
33
|
const verifyNodesOrder = (nodes, names) => {
|
|
31
34
|
expect(nodes.length).equals(names.length);
|
|
32
35
|
for (let i = 0; i < names.length; i++) {
|
|
33
|
-
if (!nodes[i].
|
|
36
|
+
if (!nodes[i].name) {
|
|
34
37
|
expect(names[i]).is.null;
|
|
35
38
|
} else {
|
|
36
|
-
expect(names[i]).equals(nodes[i].
|
|
39
|
+
expect(names[i]).equals(nodes[i].name);
|
|
37
40
|
}
|
|
38
41
|
}
|
|
39
42
|
};
|
|
@@ -44,7 +47,7 @@ const generateNodeNames = (start, end) =>
|
|
|
44
47
|
describe('OsmRouter - Multi-level itinerary', () => {
|
|
45
48
|
|
|
46
49
|
const networkModel = loadNetwork('bureaux-wemap-montpellier-network.osm');
|
|
47
|
-
const router = new
|
|
50
|
+
const router = new GraphRouter(networkModel);
|
|
48
51
|
|
|
49
52
|
const itinerary = router.getShortestPath(itineraryStart, itineraryEnd);
|
|
50
53
|
|
|
@@ -58,7 +61,7 @@ describe('OsmRouter - Multi-level itinerary', () => {
|
|
|
58
61
|
|
|
59
62
|
it('Router return shortest path', () => {
|
|
60
63
|
expect(itinerary.nodes.length).equal(11);
|
|
61
|
-
verifyNodesOrder(itinerary.nodes, [
|
|
64
|
+
verifyNodesOrder(itinerary.nodes, ['w2', ...generateNodeNames(7, 16)]);
|
|
62
65
|
});
|
|
63
66
|
|
|
64
67
|
it('Verify steps', () => {
|
|
@@ -66,7 +69,7 @@ describe('OsmRouter - Multi-level itinerary', () => {
|
|
|
66
69
|
const steps = itinerary.steps;
|
|
67
70
|
expect(steps.length).equal(8);
|
|
68
71
|
|
|
69
|
-
verifyNodesOrder(steps[0].nodes, [
|
|
72
|
+
verifyNodesOrder(steps[0].nodes, ['w2', 'p7', 'p8']);
|
|
70
73
|
verifyNodesOrder(steps[1].nodes, ['p8', 'p9']);
|
|
71
74
|
verifyNodesOrder(steps[2].nodes, ['p9', 'p10']);
|
|
72
75
|
verifyNodesOrder(steps[3].nodes, ['p10', 'p11']);
|
|
@@ -84,16 +87,24 @@ describe('OsmRouter - Multi-level itinerary', () => {
|
|
|
84
87
|
const itinerary2 = router.getShortestPath(start, end);
|
|
85
88
|
|
|
86
89
|
expect(itinerary2.nodes.length).equal(3);
|
|
87
|
-
expect(itinerary2.nodes[1].
|
|
88
|
-
expect(itinerary2.nodes[2].
|
|
90
|
+
expect(itinerary2.nodes[1].name).equal('p6');
|
|
91
|
+
expect(itinerary2.nodes[2].name).equal('p5');
|
|
89
92
|
});
|
|
90
93
|
|
|
91
94
|
it('do not use stairs', () => {
|
|
92
95
|
const itineraryWithoutStairs = router.getShortestPath(itineraryStart, itineraryEnd, { useStairs: false });
|
|
93
96
|
expect(itineraryWithoutStairs.nodes.length).equal(11);
|
|
94
|
-
expect(itineraryWithoutStairs.
|
|
95
|
-
|
|
96
|
-
|
|
97
|
+
expect(itineraryWithoutStairs.edges.some(edge => edge.isStairs)).false;
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('toCompressedJson / fromCompressedJson', () => {
|
|
101
|
+
const json = itinerary.toCompressedJson();
|
|
102
|
+
expect(() => JSON.stringify(json)).not.throw(Error);
|
|
103
|
+
|
|
104
|
+
const itineraryBis = Itinerary.fromCompressedJson(json);
|
|
105
|
+
verifyCoherence(itineraryBis);
|
|
106
|
+
expect(itineraryBis.nodes.length).equal(11);
|
|
107
|
+
verifyNodesOrder(itineraryBis.nodes, ['w2', ...generateNodeNames(7, 16)]);
|
|
97
108
|
});
|
|
98
109
|
|
|
99
110
|
});
|
|
@@ -101,7 +112,7 @@ describe('OsmRouter - Multi-level itinerary', () => {
|
|
|
101
112
|
describe('OsmRouter - One Way itinerary', () => {
|
|
102
113
|
|
|
103
114
|
const networkModel = loadNetwork('one-way.osm');
|
|
104
|
-
const router = new
|
|
115
|
+
const router = new GraphRouter(networkModel);
|
|
105
116
|
|
|
106
117
|
it('do not use oneway', () => {
|
|
107
118
|
|
|
@@ -122,7 +133,7 @@ describe('OsmRouter - One Way itinerary', () => {
|
|
|
122
133
|
describe('OsmRouter - Conveying', () => {
|
|
123
134
|
|
|
124
135
|
const networkModel = loadNetwork('gare-de-lyon-extract.osm');
|
|
125
|
-
const router = new
|
|
136
|
+
const router = new GraphRouter(networkModel);
|
|
126
137
|
|
|
127
138
|
it('do not use oneway conveying', () => {
|
|
128
139
|
|
|
@@ -143,7 +154,7 @@ describe('OsmRouter - Conveying', () => {
|
|
|
143
154
|
describe('OsmRouter - Conveying - backward', () => {
|
|
144
155
|
|
|
145
156
|
const networkModel = loadNetwork('network-conveying-backward.osm');
|
|
146
|
-
const router = new
|
|
157
|
+
const router = new GraphRouter(networkModel);
|
|
147
158
|
|
|
148
159
|
it('do not use oneway conveying', () => {
|
|
149
160
|
|