@wemap/osm 0.2.11 → 0.3.1

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.
@@ -15,18 +15,24 @@
15
15
  <node id='-440468' action='modify' visible='true' lat='43.60911942685' lon='3.88422017773'>
16
16
  <tag k='name' v='p4' />
17
17
  </node>
18
- <node id='-440470' action='modify' visible='true' lat='43.60935581261' lon='3.88428577699' />
18
+ <node id='-440470' action='modify' visible='true' lat='43.60935581261' lon='3.88428577699'>
19
+ <tag k='name' v='p22' />
20
+ </node>
19
21
  <node id='-440472' action='modify' visible='true' lat='43.60919651074' lon='3.88412853633'>
20
22
  <tag k='name' v='p1' />
21
23
  </node>
22
- <node id='-440474' action='modify' visible='true' lat='43.60931199709' lon='3.88413083832' />
24
+ <node id='-440474' action='modify' visible='true' lat='43.60931199709' lon='3.88413083832'>
25
+ <tag k='name' v='p25' />
26
+ </node>
23
27
  <node id='-440476' action='modify' visible='true' lat='43.60917494597' lon='3.88421731753'>
24
28
  <tag k='name' v='p6' />
25
29
  </node>
26
30
  <node id='-440478' action='modify' visible='true' lat='43.60918883875' lon='3.88412626772'>
27
31
  <tag k='name' v='p2' />
28
32
  </node>
29
- <node id='-440480' action='modify' visible='true' lat='43.60936726345' lon='3.88427546746' />
33
+ <node id='-440480' action='modify' visible='true' lat='43.60936726345' lon='3.88427546746'>
34
+ <tag k='name' v='p23' />
35
+ </node>
30
36
  <node id='-440482' action='modify' visible='true' lat='43.60917216742' lon='3.8842355275'>
31
37
  <tag k='name' v='p5' />
32
38
  </node>
@@ -48,10 +54,26 @@
48
54
  <node id='-440494' action='modify' visible='true' lat='43.60931232238' lon='3.88427309743'>
49
55
  <tag k='name' v='p15' />
50
56
  </node>
51
- <node id='-440496' action='modify' visible='true' lat='43.60936673756' lon='3.88428907078' />
57
+ <node id='-440496' action='modify' visible='true' lat='43.60936673756' lon='3.88428907078'>
58
+ <tag k='name' v='p24' />
59
+ </node>
52
60
  <node id='-440498' action='modify' visible='true' lat='43.60926807571' lon='3.884260391'>
53
61
  <tag k='name' v='p16' />
54
62
  </node>
63
+ <node id='-441184' action='modify' visible='true' lat='43.60932786117' lon='3.88427765877'>
64
+ <tag k='name' v='p18' />
65
+ </node>
66
+ <node id='-441187' action='modify' visible='true' lat='43.60933232537' lon='3.88424831515'>
67
+ <tag k='highway' v='elevator' />
68
+ <tag k='level' v='0;2' />
69
+ <tag k='name' v='p19' />
70
+ </node>
71
+ <node id='-441210' action='modify' visible='true' lat='43.60932786111' lon='3.8842776591'>
72
+ <tag k='name' v='p17' />
73
+ </node>
74
+ <node id='-441262' action='modify' visible='true' lat='43.60932198746' lon='3.8843159771'>
75
+ <tag k='name' v='p21' />
76
+ </node>
55
77
  <way id='-440499' action='modify' visible='true'>
56
78
  <nd ref='-440476' />
57
79
  <nd ref='-440460' />
@@ -64,6 +86,7 @@
64
86
  <nd ref='-440464' />
65
87
  <nd ref='-440466' />
66
88
  <nd ref='-440484' />
89
+ <nd ref='-441184' />
67
90
  <nd ref='-440470' />
68
91
  <nd ref='-440480' />
69
92
  <tag k='highway' v='footway' />
@@ -98,6 +121,7 @@
98
121
  <way id='-440504' action='modify' visible='true'>
99
122
  <nd ref='-440492' />
100
123
  <nd ref='-440494' />
124
+ <nd ref='-441210' />
101
125
  <nd ref='-440496' />
102
126
  <tag k='highway' v='footway' />
103
127
  <tag k='level' v='1' />
@@ -108,4 +132,22 @@
108
132
  <tag k='highway' v='footway' />
109
133
  <tag k='level' v='1' />
110
134
  </way>
135
+ <way id='-441188' action='modify' visible='true'>
136
+ <nd ref='-441184' />
137
+ <nd ref='-441187' />
138
+ <tag k='highway' v='footway' />
139
+ <tag k='level' v='2' />
140
+ </way>
141
+ <way id='-441214' action='modify' visible='true'>
142
+ <nd ref='-441210' />
143
+ <nd ref='-441187' />
144
+ <tag k='highway' v='footway' />
145
+ <tag k='level' v='1' />
146
+ </way>
147
+ <way id='-441263' action='modify' visible='true'>
148
+ <nd ref='-441187' />
149
+ <nd ref='-441262' />
150
+ <tag k='highway' v='footway' />
151
+ <tag k='level' v='0' />
152
+ </way>
111
153
  </osm>
@@ -0,0 +1,46 @@
1
+ <?xml version='1.0' encoding='UTF-8'?>
2
+ <osm version='0.6' generator='JOSM'>
3
+ <node id='-441557' action='modify' visible='true' lat='43.60942861314' lon='3.88420107589'>
4
+ <tag k='name' v='p1' />
5
+ </node>
6
+ <node id='-441558' action='modify' visible='true' lat='43.60938929783' lon='3.8841913836'>
7
+ <tag k='name' v='p3' />
8
+ </node>
9
+ <node id='-441559' action='modify' visible='true' lat='43.60940277907' lon='3.88421907562'>
10
+ <tag k='name' v='p5' />
11
+ </node>
12
+ <node id='-441560' action='modify' visible='true' lat='43.60937924953' lon='3.88418893318' />
13
+ <node id='-441561' action='modify' visible='true' lat='43.6094255609' lon='3.88422469196'>
14
+ <tag k='name' v='p4' />
15
+ </node>
16
+ <node id='-441562' action='modify' visible='true' lat='43.60945421917' lon='3.88420719584' />
17
+ <node id='-441563' action='modify' visible='true' lat='43.60940583132' lon='3.88419545955'>
18
+ <tag k='name' v='p2' />
19
+ </node>
20
+ <node id='-441564' action='modify' visible='true' lat='43.60944417022' lon='3.88420491113'>
21
+ <tag k='name' v='p0' />
22
+ </node>
23
+ <way id='-441565' action='modify' visible='true'>
24
+ <nd ref='-441557' />
25
+ <nd ref='-441563' />
26
+ <tag k='highway' v='footway' />
27
+ <tag k='oneway' v='yes' />
28
+ </way>
29
+ <way id='-441566' action='modify' visible='true'>
30
+ <nd ref='-441563' />
31
+ <nd ref='-441558' />
32
+ <tag k='highway' v='footway' />
33
+ </way>
34
+ <way id='-441567' action='modify' visible='true'>
35
+ <nd ref='-441564' />
36
+ <nd ref='-441557' />
37
+ <tag k='highway' v='footway' />
38
+ </way>
39
+ <way id='-441568' action='modify' visible='true'>
40
+ <nd ref='-441557' />
41
+ <nd ref='-441561' />
42
+ <nd ref='-441559' />
43
+ <nd ref='-441563' />
44
+ <tag k='highway' v='footway' />
45
+ </way>
46
+ </osm>
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "directory": "packages/osm"
12
12
  },
13
13
  "name": "@wemap/osm",
14
- "version": "0.2.11",
14
+ "version": "0.3.1",
15
15
  "bugs": {
16
16
  "url": "https://github.com/wemap/wemap-utils-js/issues"
17
17
  },
@@ -26,10 +26,10 @@
26
26
  ],
27
27
  "license": "ISC",
28
28
  "dependencies": {
29
- "@wemap/geo": "^0.3.9",
29
+ "@wemap/geo": "^1.0.0",
30
30
  "@wemap/logger": "^0.1.6",
31
31
  "lodash.isnumber": "^3.0.3",
32
32
  "sax": "^1.2.4"
33
33
  },
34
- "gitHead": "84a60e64b0968bc45f0f76cc26c08e165dbe6985"
34
+ "gitHead": "2a8dc4304fae3f175819ed1a1561a818e871cf44"
35
35
  }
@@ -1,6 +1,8 @@
1
+ import { Level } from '@wemap/geo';
1
2
  import {
2
3
  Edge, Node, Network
3
- } from '@wemap/geo';
4
+ } from '@wemap/graph';
5
+ import Logger from '@wemap/logger';
4
6
 
5
7
 
6
8
  const HIGHWAYS_PEDESTRIANS = ['footway', 'steps'];
@@ -45,9 +47,73 @@ class OsmNetwork extends Network {
45
47
 
46
48
  });
47
49
 
50
+ for (let i = 0; i < networkModel.nodes.length; i++) {
51
+ const node = networkModel.nodes[i];
52
+ if (node.data.tags.highway === 'elevator'
53
+ && node.coords.level
54
+ && node.coords.level.isRange) {
55
+
56
+ // We have to clone this node for each connected edge
57
+ OsmNetwork.createNodesAndEdgesFromElevator(networkModel, node);
58
+ }
59
+
60
+ }
61
+
48
62
  return networkModel;
49
63
  }
50
64
 
65
+ static createNodesAndEdgesFromElevator(networkModel, node) {
66
+
67
+ const createdNodes = [];
68
+ const isLevelAlreadyCreated = level => createdNodes.some(createdNode => Level.equalsTo(level, createdNode.coords.level));
69
+
70
+ // Create nodes from node.edges
71
+ node.edges.forEach(edge => {
72
+ if (edge.level.isRange) {
73
+ Logger.error('Cannot handle this elevator edge due to ambiguity');
74
+ return;
75
+ }
76
+
77
+ if (isLevelAlreadyCreated(edge.level)) {
78
+ return;
79
+ }
80
+
81
+ const newNode = node.clone();
82
+ newNode.coords = node.coords.clone();
83
+ newNode.coords.level = edge.level ? edge.level.clone() : null;
84
+
85
+ const otherNode = edge.node1 === node ? edge.node2 : edge.node1;
86
+ otherNode.edges = otherNode.edges.filter(_edge => _edge !== edge);
87
+ const modifiedEdge = new Edge(newNode, otherNode, edge.data, edge.level);
88
+ networkModel.edges.push(modifiedEdge);
89
+
90
+ createdNodes.push(newNode);
91
+ networkModel.nodes.push(newNode);
92
+ });
93
+
94
+ // Create edges from createdNodes
95
+ for (let i = 0; i < createdNodes.length; i++) {
96
+ for (let j = i + 1; j < createdNodes.length; j++) {
97
+
98
+ const createdNode1 = createdNodes[i];
99
+ const createdNode2 = createdNodes[j];
100
+
101
+ const newEdge = new Edge(
102
+ createdNode1,
103
+ createdNode2,
104
+ createdNode1.data,
105
+ new Level(createdNode1.coords.level.val, createdNode2.coords.level.val)
106
+ );
107
+ networkModel.edges.push(newEdge);
108
+ }
109
+ }
110
+
111
+ networkModel.nodes = networkModel.nodes.filter(_node => _node !== node);
112
+ networkModel.edges = networkModel.edges.filter(edge =>
113
+ !node.edges.some(_edge => _edge === edge)
114
+ );
115
+ }
116
+
51
117
  getNodeById(id) {
52
118
  return this.nodes.find(node => node.data.id === id);
53
119
  }
@@ -1,4 +1,6 @@
1
- import { GraphRouter } from '@wemap/geo';
1
+ import {
2
+ GraphRouter, Utils
3
+ } from '@wemap/graph';
2
4
 
3
5
  const DEFAULT_OPTIONS = { useStairs: true };
4
6
 
@@ -17,7 +19,36 @@ class OsmRouter extends GraphRouter {
17
19
  );
18
20
  };
19
21
 
20
- return super.getShortestPath(start, end, edgeSelectionFilter);
22
+ const edgeWeightFn = edge => {
23
+ if (edge.data && edge.data.tags && edge.data.tags.highway === 'elevator') {
24
+ return 30;
25
+ }
26
+ return Utils.getDurationFromLength(edge.length);
27
+ };
28
+
29
+ const acceptOneWayFn = (edge, reversed) => {
30
+ if (edge.data && edge.data.tags) {
31
+ const {
32
+ oneway, highway, conveying
33
+ } = edge.data.tags;
34
+ if (reversed && (oneway === 'yes' || oneway === 'true' || oneway === '1')) {
35
+ return false;
36
+ }
37
+ if (conveying && highway) {
38
+ if (conveying === 'forward' && reversed) {
39
+ return false;
40
+ } if (conveying === 'backward' && !reversed) {
41
+ return false;
42
+ } if (conveying === 'yes' && reversed) {
43
+ return false;
44
+ }
45
+ }
46
+ }
47
+ return true;
48
+ };
49
+
50
+
51
+ return super.getShortestPath(start, end, edgeSelectionFilter, edgeWeightFn, acceptOneWayFn);
21
52
  }
22
53
 
23
54
  }
@@ -4,8 +4,9 @@ import fs from 'fs';
4
4
  import path from 'path';
5
5
 
6
6
  import {
7
- Node, WGS84, Level
7
+ Level, WGS84
8
8
  } from '@wemap/geo';
9
+ import { Node } from '@wemap/graph';
9
10
 
10
11
  import OsmParser from '../model/OsmParser';
11
12
  import OsmRouter from './OsmRouter';
@@ -13,8 +14,21 @@ import OsmNetwork from './OsmNetwork';
13
14
 
14
15
  import {
15
16
  itineraryStart, itineraryEnd
16
- } from '../../../geo/tests/CommonTest';
17
+ } from '../../../graph/tests/CommonTest';
18
+
19
+ const verifyNodesOrder = (nodes, names) => {
20
+ expect(nodes.length).equals(names.length);
21
+ for (let i = 0; i < names.length; i++) {
22
+ if (!nodes[i].data || !nodes[i].data.tags || !nodes[i].data.tags.name) {
23
+ expect(names[i]).is.null;
24
+ } else {
25
+ expect(names[i]).equals(nodes[i].data.tags.name);
26
+ }
27
+ }
28
+ };
17
29
 
30
+ const generateNodeNames = (start, end) =>
31
+ new Array(end - start + 1).fill().map((_, idx) => 'p' + (idx + start));
18
32
 
19
33
  describe('OsmRouter - Multi-level itinerary', () => {
20
34
 
@@ -37,13 +51,8 @@ describe('OsmRouter - Multi-level itinerary', () => {
37
51
  });
38
52
 
39
53
  it('Router return shortest path', () => {
40
-
41
54
  expect(itinerary.nodes.length).equal(11);
42
-
43
- for (let i = 1; i <= 10; i++) {
44
- expect(itinerary.nodes[i].data).equal(p[i + 6].data);
45
- }
46
-
55
+ verifyNodesOrder(itinerary.nodes, [null, ...generateNodeNames(7, 16)]);
47
56
  });
48
57
 
49
58
  it('Verify steps', () => {
@@ -51,15 +60,11 @@ describe('OsmRouter - Multi-level itinerary', () => {
51
60
  const steps = itinerary.steps;
52
61
  expect(steps.length).equal(10);
53
62
 
54
- expect(steps[0].nodes[1].data).equal(p[7].data);
55
- expect(steps[0].nodes[2].data).equal(p[8].data);
56
-
63
+ verifyNodesOrder(steps[0].nodes, [null, 'p7', 'p8']);
57
64
  for (let i = 2; i <= 9; i++) {
58
- expect(steps[i - 1].nodes[0].data).equal(p[i + 6].data);
59
- expect(steps[i - 1].nodes[1].data).equal(p[i + 7].data);
65
+ verifyNodesOrder(steps[i - 1].nodes, ['p' + [i + 6], 'p' + [i + 7]]);
60
66
  }
61
-
62
- expect(steps[9].nodes[0].data).equal(p[16].data);
67
+ verifyNodesOrder(steps[9].nodes, ['p16']);
63
68
  });
64
69
 
65
70
 
@@ -74,8 +79,35 @@ describe('OsmRouter - Multi-level itinerary', () => {
74
79
  expect(itinerary2.nodes[2].data.tags.name).equal('p5');
75
80
  });
76
81
 
77
- it('No route itinerary', () => {
82
+ it('do not use stairs', () => {
78
83
  const itineraryWithoutStairs = router.getShortestPath(itineraryStart, itineraryEnd, { useStairs: false });
79
- expect(itineraryWithoutStairs).is.undefined;
84
+ expect(itineraryWithoutStairs.nodes.length).equal(11);
85
+ expect(itineraryWithoutStairs.nodes[6].data.tags.highway).equal('elevator');
86
+ expect(itineraryWithoutStairs.nodes[7].data.tags.highway).equal('elevator');
87
+ });
88
+
89
+ });
90
+
91
+ describe('OsmRouter - One Way itinerary', () => {
92
+
93
+ const filePath = path.resolve(__dirname, '../../assets/one-way.osm');
94
+ const osmXmlString = fs.readFileSync(filePath, 'utf8');
95
+
96
+ const osmModel = OsmParser.parseOsmXmlString(osmXmlString);
97
+ const networkModel = OsmNetwork.fromOsmModel(osmModel);
98
+ const router = new OsmRouter(networkModel);
99
+
100
+ it('do not use oneway', () => {
101
+
102
+ const start = new WGS84(43.6094542, 3.8842072);
103
+ const end = new WGS84(43.6093792, 3.8841889);
104
+
105
+ const itinerary = router.getShortestPath(start, end);
106
+ expect(itinerary).is.not.undefined;
107
+ verifyNodesOrder(itinerary.nodes, ['p0', 'p1', 'p2', 'p3']);
108
+
109
+ const itineraryOtherWay = router.getShortestPath(end, start);
110
+ expect(itineraryOtherWay).is.not.undefined;
111
+ verifyNodesOrder(itineraryOtherWay.nodes, ['p3', 'p2', 'p5', 'p4', 'p1', 'p0']);
80
112
  });
81
113
  });
@@ -1,7 +1,10 @@
1
1
  /* eslint-disable max-statements */
2
2
  import {
3
- WGS84, Itinerary, Node, Edge, Level
3
+ Level, WGS84
4
4
  } from '@wemap/geo';
5
+ import {
6
+ Edge, Node, Itinerary
7
+ } from '@wemap/graph';
5
8
  import {
6
9
  rad2deg, Utils as MathUtils
7
10
  } from '@wemap/maths';
@@ -12,7 +12,7 @@ import OsrmUtils from './OsrmUtils';
12
12
 
13
13
  import {
14
14
  itineraryStart, itineraryEnd
15
- } from '../../../geo/tests/CommonTest';
15
+ } from '../../../graph/tests/CommonTest';
16
16
 
17
17
  describe('OsrmUtils', () => {
18
18