@wemap/osm 0.2.10 → 0.3.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.
@@ -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.10",
14
+ "version": "0.3.0",
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.8",
29
+ "@wemap/geo": "^0.4.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": "6e107eebc85ff97f17371feac903ddb53657678b"
34
+ "gitHead": "08d7d843add321d899aef07f9e2ec7739270dc70"
35
35
  }
@@ -1,3 +1,4 @@
1
+ /* eslint-disable max-statements */
1
2
  import sax from 'sax';
2
3
 
3
4
  import { Level } from '@wemap/geo';
@@ -16,16 +17,24 @@ class OsmParser {
16
17
 
17
18
  let buffer;
18
19
 
20
+ const isDeleted = element => element.attributes.action && element.attributes.action === 'delete';
21
+
19
22
  parser.onopentag = (node) => {
20
23
 
21
24
  switch (node.name) {
22
25
  case 'node': {
26
+ if (isDeleted(node)) {
27
+ break;
28
+ }
23
29
  const osmNode = OsmNode.fromSax(node.attributes);
24
30
  buffer = osmNode;
25
31
  model.nodes.push(osmNode);
26
32
  break;
27
33
  }
28
34
  case 'way': {
35
+ if (isDeleted(node)) {
36
+ break;
37
+ }
29
38
  const osmWay = OsmWay.fromSax(node.attributes);
30
39
  buffer = osmWay;
31
40
  model.ways.push(osmWay);
@@ -1,6 +1,7 @@
1
1
  import {
2
- Edge, Node, Network
2
+ Edge, Node, Network, Level
3
3
  } from '@wemap/geo';
4
+ import Logger from '@wemap/logger';
4
5
 
5
6
 
6
7
  const HIGHWAYS_PEDESTRIANS = ['footway', 'steps'];
@@ -45,9 +46,73 @@ class OsmNetwork extends Network {
45
46
 
46
47
  });
47
48
 
49
+ for (let i = 0; i < networkModel.nodes.length; i++) {
50
+ const node = networkModel.nodes[i];
51
+ if (node.data.tags.highway === 'elevator'
52
+ && node.coords.level
53
+ && node.coords.level.isRange) {
54
+
55
+ // We have to clone this node for each connected edge
56
+ OsmNetwork.createNodesAndEdgesFromElevator(networkModel, node);
57
+ }
58
+
59
+ }
60
+
48
61
  return networkModel;
49
62
  }
50
63
 
64
+ static createNodesAndEdgesFromElevator(networkModel, node) {
65
+
66
+ const createdNodes = [];
67
+ const isLevelAlreadyCreated = level => createdNodes.some(createdNode => Level.equalsTo(level, createdNode.coords.level));
68
+
69
+ // Create nodes from node.edges
70
+ node.edges.forEach(edge => {
71
+ if (edge.level.isRange) {
72
+ Logger.error('Cannot handle this elevator edge due to ambiguity');
73
+ return;
74
+ }
75
+
76
+ if (isLevelAlreadyCreated(edge.level)) {
77
+ return;
78
+ }
79
+
80
+ const newNode = node.clone();
81
+ newNode.coords = node.coords.clone();
82
+ newNode.coords.level = edge.level ? edge.level.clone() : null;
83
+
84
+ const otherNode = edge.node1 === node ? edge.node2 : edge.node1;
85
+ otherNode.edges = otherNode.edges.filter(_edge => _edge !== edge);
86
+ const modifiedEdge = new Edge(newNode, otherNode, edge.data, edge.level);
87
+ networkModel.edges.push(modifiedEdge);
88
+
89
+ createdNodes.push(newNode);
90
+ networkModel.nodes.push(newNode);
91
+ });
92
+
93
+ // Create edges from createdNodes
94
+ for (let i = 0; i < createdNodes.length; i++) {
95
+ for (let j = i + 1; j < createdNodes.length; j++) {
96
+
97
+ const createdNode1 = createdNodes[i];
98
+ const createdNode2 = createdNodes[j];
99
+
100
+ const newEdge = new Edge(
101
+ createdNode1,
102
+ createdNode2,
103
+ createdNode1.data,
104
+ new Level(createdNode1.coords.level.val, createdNode2.coords.level.val)
105
+ );
106
+ networkModel.edges.push(newEdge);
107
+ }
108
+ }
109
+
110
+ networkModel.nodes = networkModel.nodes.filter(_node => _node !== node);
111
+ networkModel.edges = networkModel.edges.filter(edge =>
112
+ !node.edges.some(_edge => _edge === edge)
113
+ );
114
+ }
115
+
51
116
  getNodeById(id) {
52
117
  return this.nodes.find(node => node.data.id === id);
53
118
  }
@@ -1,4 +1,6 @@
1
- import { GraphRouter } from '@wemap/geo';
1
+ import {
2
+ GraphRouter, Utils
3
+ } from '@wemap/geo';
2
4
 
3
5
  const DEFAULT_OPTIONS = { useStairs: true };
4
6
 
@@ -17,7 +19,26 @@ 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 (!reversed) {
31
+ return true;
32
+ }
33
+ if (edge.data && edge.data.tags) {
34
+ const { oneway } = edge.data.tags;
35
+ return oneway !== 'yes' && oneway !== 'true' && oneway !== '1';
36
+ }
37
+ return true;
38
+ };
39
+
40
+
41
+ return super.getShortestPath(start, end, edgeSelectionFilter, edgeWeightFn, acceptOneWayFn);
21
42
  }
22
43
 
23
44
  }
@@ -15,6 +15,19 @@ import {
15
15
  itineraryStart, itineraryEnd
16
16
  } from '../../../geo/tests/CommonTest';
17
17
 
18
+ const verifyNodesOrder = (nodes, names) => {
19
+ expect(nodes.length).equals(names.length);
20
+ for (let i = 0; i < names.length; i++) {
21
+ if (!nodes[i].data || !nodes[i].data.tags || !nodes[i].data.tags.name) {
22
+ expect(names[i]).is.null;
23
+ } else {
24
+ expect(names[i]).equals(nodes[i].data.tags.name);
25
+ }
26
+ }
27
+ };
28
+
29
+ const generateNodeNames = (start, end) =>
30
+ new Array(end - start + 1).fill().map((_, idx) => 'p' + (idx + start));
18
31
 
19
32
  describe('OsmRouter - Multi-level itinerary', () => {
20
33
 
@@ -37,13 +50,8 @@ describe('OsmRouter - Multi-level itinerary', () => {
37
50
  });
38
51
 
39
52
  it('Router return shortest path', () => {
40
-
41
53
  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
-
54
+ verifyNodesOrder(itinerary.nodes, [null, ...generateNodeNames(7, 16)]);
47
55
  });
48
56
 
49
57
  it('Verify steps', () => {
@@ -51,15 +59,11 @@ describe('OsmRouter - Multi-level itinerary', () => {
51
59
  const steps = itinerary.steps;
52
60
  expect(steps.length).equal(10);
53
61
 
54
- expect(steps[0].nodes[1].data).equal(p[7].data);
55
- expect(steps[0].nodes[2].data).equal(p[8].data);
56
-
62
+ verifyNodesOrder(steps[0].nodes, [null, 'p7', 'p8']);
57
63
  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);
64
+ verifyNodesOrder(steps[i - 1].nodes, ['p' + [i + 6], 'p' + [i + 7]]);
60
65
  }
61
-
62
- expect(steps[9].nodes[0].data).equal(p[16].data);
66
+ verifyNodesOrder(steps[9].nodes, ['p16']);
63
67
  });
64
68
 
65
69
 
@@ -74,8 +78,35 @@ describe('OsmRouter - Multi-level itinerary', () => {
74
78
  expect(itinerary2.nodes[2].data.tags.name).equal('p5');
75
79
  });
76
80
 
77
- it('No route itinerary', () => {
81
+ it('do not use stairs', () => {
78
82
  const itineraryWithoutStairs = router.getShortestPath(itineraryStart, itineraryEnd, { useStairs: false });
79
- expect(itineraryWithoutStairs).is.undefined;
83
+ expect(itineraryWithoutStairs.nodes.length).equal(11);
84
+ expect(itineraryWithoutStairs.nodes[6].data.tags.highway).equal('elevator');
85
+ expect(itineraryWithoutStairs.nodes[7].data.tags.highway).equal('elevator');
86
+ });
87
+
88
+ });
89
+
90
+ describe('OsmRouter - One Way itinerary', () => {
91
+
92
+ const filePath = path.resolve(__dirname, '../../assets/one-way.osm');
93
+ const osmXmlString = fs.readFileSync(filePath, 'utf8');
94
+
95
+ const osmModel = OsmParser.parseOsmXmlString(osmXmlString);
96
+ const networkModel = OsmNetwork.fromOsmModel(osmModel);
97
+ const router = new OsmRouter(networkModel);
98
+
99
+ it('do not use oneway', () => {
100
+
101
+ const start = new WGS84(43.6094542, 3.8842072);
102
+ const end = new WGS84(43.6093792, 3.8841889);
103
+
104
+ const itinerary = router.getShortestPath(start, end);
105
+ expect(itinerary).is.not.undefined;
106
+ verifyNodesOrder(itinerary.nodes, ['p0', 'p1', 'p2', 'p3']);
107
+
108
+ const itineraryOtherWay = router.getShortestPath(end, start);
109
+ expect(itineraryOtherWay).is.not.undefined;
110
+ verifyNodesOrder(itineraryOtherWay.nodes, ['p3', 'p2', 'p5', 'p4', 'p1', 'p0']);
80
111
  });
81
112
  });