@wemap/osm 11.0.0-alpha.2 → 11.0.0-alpha.20
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 +2 -2
- package/assets/network-steps-same-level.osm +283 -0
- package/dist/index.js +81 -124
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +223 -0
- package/dist/index.mjs.map +1 -0
- package/index.ts +2 -2
- package/package.json +11 -5
- package/src/OsmModel.ts +11 -1
- package/src/OsmNode.ts +2 -1
- package/src/OsmParser.ts +36 -1
- package/src/OsmRelation.ts +42 -0
- package/src/OsmWay.ts +6 -0
- package/src/OsmNetworkUtils.spec.ts +0 -105
- package/src/OsmNetworkUtils.ts +0 -190
|
@@ -75,10 +75,10 @@
|
|
|
75
75
|
<tag k='name' v='p21' />
|
|
76
76
|
</node>
|
|
77
77
|
<node id='-441273' action='modify' visible='true' lat='43.6095297' lon='3.8845039'>
|
|
78
|
-
<tag k='name' v='
|
|
78
|
+
<tag k='name' v='p26' />
|
|
79
79
|
</node>
|
|
80
80
|
<node id='-441286' action='modify' visible='true' lat='43.6095624' lon='3.8845134'>
|
|
81
|
-
<tag k='name' v='
|
|
81
|
+
<tag k='name' v='p27' />
|
|
82
82
|
</node>
|
|
83
83
|
<way id='-440499' action='modify' visible='true'>
|
|
84
84
|
<nd ref='-440476' />
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
<?xml version='1.0' encoding='UTF-8'?>
|
|
2
|
+
<osm version='0.6' generator='JOSM'>
|
|
3
|
+
<node id='-442272' action='modify' visible='true' lat='43.60911942643' lon='3.88422017836'>
|
|
4
|
+
<tag k='name' v='end1' />
|
|
5
|
+
</node>
|
|
6
|
+
<node id='-442273' action='modify' visible='true' lat='43.609172167' lon='3.88423552813'>
|
|
7
|
+
<tag k='name' v='start1' />
|
|
8
|
+
</node>
|
|
9
|
+
<node id='-442274' action='modify' visible='true' lat='43.60916799079' lon='3.88423431239' />
|
|
10
|
+
<node id='-442275' action='modify' visible='true' lat='43.60912597257' lon='3.88422208353' />
|
|
11
|
+
<node id='-442276' action='modify' visible='true' lat='43.60916666184' lon='3.88425569572' />
|
|
12
|
+
<node id='-442277' action='modify' visible='true' lat='43.60911809748' lon='3.88424156169'>
|
|
13
|
+
<tag k='name' v='end2' />
|
|
14
|
+
</node>
|
|
15
|
+
<node id='-442278' action='modify' visible='true' lat='43.60912464361' lon='3.88424346686' />
|
|
16
|
+
<node id='-442279' action='modify' visible='true' lat='43.60917083805' lon='3.88425691146'>
|
|
17
|
+
<tag k='name' v='start2' />
|
|
18
|
+
</node>
|
|
19
|
+
<node id='-442280' action='modify' visible='true' lat='43.60916684981' lon='3.88427763193' />
|
|
20
|
+
<node id='-442281' action='modify' visible='true' lat='43.60911828545' lon='3.8842634979'>
|
|
21
|
+
<tag k='name' v='end3' />
|
|
22
|
+
</node>
|
|
23
|
+
<node id='-442282' action='modify' visible='true' lat='43.60912483158' lon='3.88426540307' />
|
|
24
|
+
<node id='-442283' action='modify' visible='true' lat='43.60917102602' lon='3.88427884767'>
|
|
25
|
+
<tag k='name' v='start3' />
|
|
26
|
+
</node>
|
|
27
|
+
<node id='-442284' action='modify' visible='true' lat='43.60916684981' lon='3.88430177474' />
|
|
28
|
+
<node id='-442285' action='modify' visible='true' lat='43.60911828545' lon='3.88428764071'>
|
|
29
|
+
<tag k='name' v='end4' />
|
|
30
|
+
</node>
|
|
31
|
+
<node id='-442286' action='modify' visible='true' lat='43.60912483158' lon='3.88428954588' />
|
|
32
|
+
<node id='-442287' action='modify' visible='true' lat='43.60917102602' lon='3.88430299048'>
|
|
33
|
+
<tag k='name' v='start4' />
|
|
34
|
+
</node>
|
|
35
|
+
<node id='-442288' action='modify' visible='true' lat='43.60916675582' lon='3.88432539836' />
|
|
36
|
+
<node id='-442289' action='modify' visible='true' lat='43.60911819146' lon='3.88431126433'>
|
|
37
|
+
<tag k='name' v='end5' />
|
|
38
|
+
</node>
|
|
39
|
+
<node id='-442290' action='modify' visible='true' lat='43.6091247376' lon='3.88431316949' />
|
|
40
|
+
<node id='-442291' action='modify' visible='true' lat='43.60917093203' lon='3.8843266141'>
|
|
41
|
+
<tag k='name' v='start5' />
|
|
42
|
+
</node>
|
|
43
|
+
<node id='-442292' action='modify' visible='true' lat='43.60916637989' lon='3.88434759417' />
|
|
44
|
+
<node id='-442293' action='modify' visible='true' lat='43.60911781553' lon='3.88433346014'>
|
|
45
|
+
<tag k='name' v='end6' />
|
|
46
|
+
</node>
|
|
47
|
+
<node id='-442294' action='modify' visible='true' lat='43.60912436166' lon='3.88433536531' />
|
|
48
|
+
<node id='-442295' action='modify' visible='true' lat='43.6091705561' lon='3.88434880991'>
|
|
49
|
+
<tag k='name' v='start6' />
|
|
50
|
+
</node>
|
|
51
|
+
<node id='-442296' action='modify' visible='true' lat='43.60916628591' lon='3.88436849198' />
|
|
52
|
+
<node id='-442297' action='modify' visible='true' lat='43.60911772155' lon='3.88435435795'>
|
|
53
|
+
<tag k='name' v='end7' />
|
|
54
|
+
</node>
|
|
55
|
+
<node id='-442298' action='modify' visible='true' lat='43.60912426768' lon='3.88435626312' />
|
|
56
|
+
<node id='-442299' action='modify' visible='true' lat='43.60917046212' lon='3.88436970772'>
|
|
57
|
+
<tag k='name' v='start7' />
|
|
58
|
+
</node>
|
|
59
|
+
<node id='-442300' action='modify' visible='true' lat='43.60916600396' lon='3.88439016859' />
|
|
60
|
+
<node id='-442301' action='modify' visible='true' lat='43.6091174396' lon='3.88437603456'>
|
|
61
|
+
<tag k='name' v='end8' />
|
|
62
|
+
</node>
|
|
63
|
+
<node id='-442302' action='modify' visible='true' lat='43.60912398573' lon='3.88437793973' />
|
|
64
|
+
<node id='-442303' action='modify' visible='true' lat='43.60917018017' lon='3.88439138433'>
|
|
65
|
+
<tag k='name' v='start8' />
|
|
66
|
+
</node>
|
|
67
|
+
<node id='-442304' action='modify' visible='true' lat='43.60914503663' lon='3.88438406632' />
|
|
68
|
+
<node id='-442305' action='modify' visible='true' lat='43.60912483158' lon='3.88439896734' />
|
|
69
|
+
<node id='-442306' action='modify' visible='true' lat='43.60917102602' lon='3.88441241194'>
|
|
70
|
+
<tag k='name' v='start9' />
|
|
71
|
+
</node>
|
|
72
|
+
<node id='-442307' action='modify' visible='true' lat='43.60916684981' lon='3.8844111962' />
|
|
73
|
+
<node id='-442308' action='modify' visible='true' lat='43.60911828545' lon='3.88439706217'>
|
|
74
|
+
<tag k='name' v='end9' />
|
|
75
|
+
</node>
|
|
76
|
+
<node id='-442309' action='modify' visible='true' lat='43.60914595351' lon='3.8844051146' />
|
|
77
|
+
<node id='-442310' action='modify' visible='true' lat='43.60912464361' lon='3.88442194195' />
|
|
78
|
+
<node id='-442311' action='modify' visible='true' lat='43.60917083805' lon='3.88443538655'>
|
|
79
|
+
<tag k='name' v='start10' />
|
|
80
|
+
</node>
|
|
81
|
+
<node id='-442312' action='modify' visible='true' lat='43.60916666184' lon='3.88443417081' />
|
|
82
|
+
<node id='-442313' action='modify' visible='true' lat='43.60911809748' lon='3.88442003678'>
|
|
83
|
+
<tag k='name' v='end10' />
|
|
84
|
+
</node>
|
|
85
|
+
<way id='-441825' action='modify' visible='true'>
|
|
86
|
+
<nd ref='-442273' />
|
|
87
|
+
<nd ref='-442274' />
|
|
88
|
+
<tag k='highway' v='footway' />
|
|
89
|
+
<tag k='name' v='w1' />
|
|
90
|
+
</way>
|
|
91
|
+
<way id='-441826' action='modify' visible='true'>
|
|
92
|
+
<nd ref='-442274' />
|
|
93
|
+
<nd ref='-442275' />
|
|
94
|
+
<tag k='highway' v='steps' />
|
|
95
|
+
<tag k='name' v='w1' />
|
|
96
|
+
</way>
|
|
97
|
+
<way id='-441827' action='modify' visible='true'>
|
|
98
|
+
<nd ref='-442275' />
|
|
99
|
+
<nd ref='-442272' />
|
|
100
|
+
<tag k='highway' v='footway' />
|
|
101
|
+
<tag k='name' v='w1' />
|
|
102
|
+
</way>
|
|
103
|
+
<way id='-441828' action='modify' visible='true'>
|
|
104
|
+
<nd ref='-442279' />
|
|
105
|
+
<nd ref='-442276' />
|
|
106
|
+
<tag k='highway' v='footway' />
|
|
107
|
+
<tag k='name' v='w2' />
|
|
108
|
+
</way>
|
|
109
|
+
<way id='-441829' action='modify' visible='true'>
|
|
110
|
+
<nd ref='-442276' />
|
|
111
|
+
<nd ref='-442278' />
|
|
112
|
+
<tag k='highway' v='steps' />
|
|
113
|
+
<tag k='name' v='w2' />
|
|
114
|
+
</way>
|
|
115
|
+
<way id='-441830' action='modify' visible='true'>
|
|
116
|
+
<nd ref='-442278' />
|
|
117
|
+
<nd ref='-442277' />
|
|
118
|
+
<tag k='highway' v='footway' />
|
|
119
|
+
<tag k='name' v='w2' />
|
|
120
|
+
</way>
|
|
121
|
+
<way id='-441831' action='modify' visible='true'>
|
|
122
|
+
<nd ref='-442283' />
|
|
123
|
+
<nd ref='-442280' />
|
|
124
|
+
<tag k='highway' v='footway' />
|
|
125
|
+
<tag k='name' v='w3' />
|
|
126
|
+
</way>
|
|
127
|
+
<way id='-441832' action='modify' visible='true'>
|
|
128
|
+
<nd ref='-442280' />
|
|
129
|
+
<nd ref='-442282' />
|
|
130
|
+
<tag k='highway' v='steps' />
|
|
131
|
+
<tag k='incline' v='up' />
|
|
132
|
+
<tag k='name' v='w3' />
|
|
133
|
+
</way>
|
|
134
|
+
<way id='-441833' action='modify' visible='true'>
|
|
135
|
+
<nd ref='-442282' />
|
|
136
|
+
<nd ref='-442281' />
|
|
137
|
+
<tag k='highway' v='footway' />
|
|
138
|
+
<tag k='name' v='w3' />
|
|
139
|
+
</way>
|
|
140
|
+
<way id='-441834' action='modify' visible='true'>
|
|
141
|
+
<nd ref='-442287' />
|
|
142
|
+
<nd ref='-442284' />
|
|
143
|
+
<tag k='highway' v='footway' />
|
|
144
|
+
<tag k='name' v='w4' />
|
|
145
|
+
</way>
|
|
146
|
+
<way id='-441835' action='modify' visible='true'>
|
|
147
|
+
<nd ref='-442284' />
|
|
148
|
+
<nd ref='-442286' />
|
|
149
|
+
<tag k='highway' v='steps' />
|
|
150
|
+
<tag k='incline' v='down' />
|
|
151
|
+
<tag k='name' v='w4' />
|
|
152
|
+
</way>
|
|
153
|
+
<way id='-441836' action='modify' visible='true'>
|
|
154
|
+
<nd ref='-442286' />
|
|
155
|
+
<nd ref='-442285' />
|
|
156
|
+
<tag k='highway' v='footway' />
|
|
157
|
+
<tag k='name' v='w4' />
|
|
158
|
+
</way>
|
|
159
|
+
<way id='-441837' action='modify' visible='true'>
|
|
160
|
+
<nd ref='-442291' />
|
|
161
|
+
<nd ref='-442288' />
|
|
162
|
+
<tag k='highway' v='footway' />
|
|
163
|
+
<tag k='name' v='w5' />
|
|
164
|
+
</way>
|
|
165
|
+
<way id='-441838' action='modify' visible='true'>
|
|
166
|
+
<nd ref='-442290' />
|
|
167
|
+
<nd ref='-442288' />
|
|
168
|
+
<tag k='highway' v='steps' />
|
|
169
|
+
<tag k='incline' v='up' />
|
|
170
|
+
<tag k='name' v='w5' />
|
|
171
|
+
</way>
|
|
172
|
+
<way id='-441839' action='modify' visible='true'>
|
|
173
|
+
<nd ref='-442290' />
|
|
174
|
+
<nd ref='-442289' />
|
|
175
|
+
<tag k='highway' v='footway' />
|
|
176
|
+
<tag k='name' v='w5' />
|
|
177
|
+
</way>
|
|
178
|
+
<way id='-441840' action='modify' visible='true'>
|
|
179
|
+
<nd ref='-442295' />
|
|
180
|
+
<nd ref='-442292' />
|
|
181
|
+
<tag k='highway' v='footway' />
|
|
182
|
+
<tag k='name' v='w6' />
|
|
183
|
+
</way>
|
|
184
|
+
<way id='-441841' action='modify' visible='true'>
|
|
185
|
+
<nd ref='-442294' />
|
|
186
|
+
<nd ref='-442292' />
|
|
187
|
+
<tag k='highway' v='steps' />
|
|
188
|
+
<tag k='incline' v='down' />
|
|
189
|
+
<tag k='name' v='w6' />
|
|
190
|
+
</way>
|
|
191
|
+
<way id='-441842' action='modify' visible='true'>
|
|
192
|
+
<nd ref='-442294' />
|
|
193
|
+
<nd ref='-442293' />
|
|
194
|
+
<tag k='highway' v='footway' />
|
|
195
|
+
<tag k='name' v='w6' />
|
|
196
|
+
</way>
|
|
197
|
+
<way id='-441843' action='modify' visible='true'>
|
|
198
|
+
<nd ref='-442299' />
|
|
199
|
+
<nd ref='-442296' />
|
|
200
|
+
<tag k='highway' v='footway' />
|
|
201
|
+
<tag k='level' v='-1' />
|
|
202
|
+
<tag k='name' v='w7' />
|
|
203
|
+
</way>
|
|
204
|
+
<way id='-441844' action='modify' visible='true'>
|
|
205
|
+
<nd ref='-442296' />
|
|
206
|
+
<nd ref='-442298' />
|
|
207
|
+
<tag k='highway' v='steps' />
|
|
208
|
+
<tag k='incline' v='up' />
|
|
209
|
+
<tag k='level' v='-1;0' />
|
|
210
|
+
<tag k='name' v='w7' />
|
|
211
|
+
</way>
|
|
212
|
+
<way id='-441845' action='modify' visible='true'>
|
|
213
|
+
<nd ref='-442298' />
|
|
214
|
+
<nd ref='-442297' />
|
|
215
|
+
<tag k='highway' v='footway' />
|
|
216
|
+
<tag k='level' v='0' />
|
|
217
|
+
<tag k='name' v='w7' />
|
|
218
|
+
</way>
|
|
219
|
+
<way id='-441846' action='modify' visible='true'>
|
|
220
|
+
<nd ref='-442303' />
|
|
221
|
+
<nd ref='-442300' />
|
|
222
|
+
<tag k='highway' v='footway' />
|
|
223
|
+
<tag k='name' v='w8' />
|
|
224
|
+
</way>
|
|
225
|
+
<way id='-441847' action='modify' visible='true'>
|
|
226
|
+
<nd ref='-442300' />
|
|
227
|
+
<nd ref='-442304' />
|
|
228
|
+
<nd ref='-442302' />
|
|
229
|
+
<tag k='highway' v='steps' />
|
|
230
|
+
<tag k='name' v='w8' />
|
|
231
|
+
</way>
|
|
232
|
+
<way id='-441848' action='modify' visible='true'>
|
|
233
|
+
<nd ref='-442302' />
|
|
234
|
+
<nd ref='-442301' />
|
|
235
|
+
<tag k='highway' v='footway' />
|
|
236
|
+
<tag k='name' v='w8' />
|
|
237
|
+
</way>
|
|
238
|
+
<way id='-441849' action='modify' visible='true'>
|
|
239
|
+
<nd ref='-442307' />
|
|
240
|
+
<nd ref='-442309' />
|
|
241
|
+
<nd ref='-442305' />
|
|
242
|
+
<tag k='highway' v='steps' />
|
|
243
|
+
<tag k='incline' v='up' />
|
|
244
|
+
<tag k='level' v='-1;0' />
|
|
245
|
+
<tag k='name' v='w9' />
|
|
246
|
+
</way>
|
|
247
|
+
<way id='-441850' action='modify' visible='true'>
|
|
248
|
+
<nd ref='-442306' />
|
|
249
|
+
<nd ref='-442307' />
|
|
250
|
+
<tag k='highway' v='footway' />
|
|
251
|
+
<tag k='level' v='-1' />
|
|
252
|
+
<tag k='name' v='w9' />
|
|
253
|
+
</way>
|
|
254
|
+
<way id='-441851' action='modify' visible='true'>
|
|
255
|
+
<nd ref='-442305' />
|
|
256
|
+
<nd ref='-442308' />
|
|
257
|
+
<tag k='highway' v='footway' />
|
|
258
|
+
<tag k='level' v='0' />
|
|
259
|
+
<tag k='name' v='w9' />
|
|
260
|
+
</way>
|
|
261
|
+
<way id='-441852' action='modify' visible='true'>
|
|
262
|
+
<nd ref='-442312' />
|
|
263
|
+
<nd ref='-442310' />
|
|
264
|
+
<tag k='highway' v='steps' />
|
|
265
|
+
<tag k='incline' v='down' />
|
|
266
|
+
<tag k='level' v='-1;0' />
|
|
267
|
+
<tag k='name' v='w10' />
|
|
268
|
+
</way>
|
|
269
|
+
<way id='-441853' action='modify' visible='true'>
|
|
270
|
+
<nd ref='-442311' />
|
|
271
|
+
<nd ref='-442312' />
|
|
272
|
+
<tag k='highway' v='footway' />
|
|
273
|
+
<tag k='level' v='-1' />
|
|
274
|
+
<tag k='name' v='w10' />
|
|
275
|
+
</way>
|
|
276
|
+
<way id='-441854' action='modify' visible='true'>
|
|
277
|
+
<nd ref='-442310' />
|
|
278
|
+
<nd ref='-442313' />
|
|
279
|
+
<tag k='highway' v='footway' />
|
|
280
|
+
<tag k='level' v='0' />
|
|
281
|
+
<tag k='name' v='w10' />
|
|
282
|
+
</way>
|
|
283
|
+
</osm>
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
var __defProp = Object.defineProperty;
|
|
2
3
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
4
|
var __publicField = (obj, key, value) => {
|
|
4
5
|
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
5
6
|
return value;
|
|
6
7
|
};
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
9
|
+
const saxes = require("saxes");
|
|
10
|
+
const geo = require("@wemap/geo");
|
|
9
11
|
class OsmElement {
|
|
10
12
|
constructor(id, tags) {
|
|
11
13
|
__publicField(this, "id");
|
|
@@ -15,11 +17,13 @@ class OsmElement {
|
|
|
15
17
|
}
|
|
16
18
|
}
|
|
17
19
|
class OsmModel {
|
|
18
|
-
constructor(nodes, ways) {
|
|
20
|
+
constructor(nodes, ways, relations) {
|
|
19
21
|
__publicField(this, "nodes");
|
|
20
22
|
__publicField(this, "ways");
|
|
23
|
+
__publicField(this, "relations");
|
|
21
24
|
this.nodes = nodes || [];
|
|
22
25
|
this.ways = ways || [];
|
|
26
|
+
this.relations = relations || [];
|
|
23
27
|
}
|
|
24
28
|
getNodeById(id) {
|
|
25
29
|
return this.nodes.find((node) => node.id === id) || null;
|
|
@@ -33,12 +37,19 @@ class OsmModel {
|
|
|
33
37
|
getWayByName(name) {
|
|
34
38
|
return this.ways.find((way) => way.tags.name === name) || null;
|
|
35
39
|
}
|
|
40
|
+
getRelationById(id) {
|
|
41
|
+
return this.relations.find((way) => way.id === id) || null;
|
|
42
|
+
}
|
|
43
|
+
getRelationByName(name) {
|
|
44
|
+
return this.relations.find((way) => way.tags.name === name) || null;
|
|
45
|
+
}
|
|
36
46
|
}
|
|
37
47
|
class OsmNode extends OsmElement {
|
|
38
48
|
constructor(id, coords, tags) {
|
|
39
49
|
super(id, tags);
|
|
40
50
|
__publicField(this, "coords");
|
|
41
51
|
__publicField(this, "ways", []);
|
|
52
|
+
__publicField(this, "relations", []);
|
|
42
53
|
this.coords = coords;
|
|
43
54
|
}
|
|
44
55
|
get isElevator() {
|
|
@@ -52,6 +63,7 @@ class OsmWay extends OsmElement {
|
|
|
52
63
|
constructor(id, tags, level = null) {
|
|
53
64
|
super(id, tags);
|
|
54
65
|
__publicField(this, "nodes", []);
|
|
66
|
+
__publicField(this, "relations", []);
|
|
55
67
|
__publicField(this, "level", null);
|
|
56
68
|
this.level = level;
|
|
57
69
|
}
|
|
@@ -67,14 +79,42 @@ class OsmWay extends OsmElement {
|
|
|
67
79
|
get isMovingWalkway() {
|
|
68
80
|
return !this.areStairs && this.isConveying;
|
|
69
81
|
}
|
|
82
|
+
get isElevator() {
|
|
83
|
+
return this.tags.highway === "elevator";
|
|
84
|
+
}
|
|
70
85
|
get isArea() {
|
|
71
86
|
return this.nodes[0] === this.nodes[this.nodes.length - 1];
|
|
72
87
|
}
|
|
73
88
|
}
|
|
89
|
+
class OsmRelation extends OsmElement {
|
|
90
|
+
constructor(id, members = [], tags) {
|
|
91
|
+
super(id, tags);
|
|
92
|
+
__publicField(this, "relations", []);
|
|
93
|
+
this.members = members;
|
|
94
|
+
}
|
|
95
|
+
isMultipolygon() {
|
|
96
|
+
return this.tags.type === "multipolygon";
|
|
97
|
+
}
|
|
98
|
+
getGeoJsonPolygon() {
|
|
99
|
+
if (!this.isMultipolygon())
|
|
100
|
+
return null;
|
|
101
|
+
const outer = this.members.find((member) => member.ref instanceof OsmWay && member.role === "outer");
|
|
102
|
+
if (!outer)
|
|
103
|
+
return null;
|
|
104
|
+
const inners = this.members.filter((member) => member.ref instanceof OsmWay && member.role === "inner");
|
|
105
|
+
return {
|
|
106
|
+
type: "Polygon",
|
|
107
|
+
coordinates: [outer, ...inners].map((member) => {
|
|
108
|
+
const way = member.ref;
|
|
109
|
+
return way.nodes.map((node) => [node.coords.lng, node.coords.lat]);
|
|
110
|
+
})
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
74
114
|
class OsmParser {
|
|
75
115
|
static parseOsmXmlString(osmXmlString) {
|
|
76
116
|
const model = new OsmModel();
|
|
77
|
-
const parser = new SaxesParser();
|
|
117
|
+
const parser = new saxes.SaxesParser();
|
|
78
118
|
let buffer;
|
|
79
119
|
const isDeleted = (element) => element.attributes.action && element.attributes.action === "delete";
|
|
80
120
|
parser.on("opentag", (node) => {
|
|
@@ -99,6 +139,16 @@ class OsmParser {
|
|
|
99
139
|
model.ways.push(osmWay);
|
|
100
140
|
break;
|
|
101
141
|
}
|
|
142
|
+
case "relation": {
|
|
143
|
+
if (isDeleted(node)) {
|
|
144
|
+
buffer = null;
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
const osmRelation = this._parseRelation(node.attributes);
|
|
148
|
+
buffer = osmRelation;
|
|
149
|
+
model.relations.push(osmRelation);
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
102
152
|
case "tag": {
|
|
103
153
|
if (!buffer) {
|
|
104
154
|
return;
|
|
@@ -123,13 +173,30 @@ class OsmParser {
|
|
|
123
173
|
refNode.ways.push(buffer);
|
|
124
174
|
break;
|
|
125
175
|
}
|
|
176
|
+
case "member": {
|
|
177
|
+
if (!buffer || !(buffer instanceof OsmRelation)) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const memberId = Number(node.attributes.ref);
|
|
181
|
+
const memberType = node.attributes.type;
|
|
182
|
+
let refElement = null;
|
|
183
|
+
memberType === "node" && (refElement = model.getNodeById(memberId));
|
|
184
|
+
memberType === "way" && (refElement = model.getWayById(memberId));
|
|
185
|
+
memberType === "relation" && (refElement = model.getRelationById(memberId));
|
|
186
|
+
if (!refElement) {
|
|
187
|
+
throw Error("Member: " + memberId + " in relation " + buffer.id + " not found");
|
|
188
|
+
}
|
|
189
|
+
buffer.members.push({ ref: refElement, role: node.attributes.role });
|
|
190
|
+
refElement.relations.push(buffer);
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
126
193
|
}
|
|
127
194
|
});
|
|
128
195
|
parser.write(osmXmlString);
|
|
129
196
|
for (let i = 0; i < model.ways.length; i++) {
|
|
130
197
|
const way = model.ways[i];
|
|
131
198
|
if (way.tags.level) {
|
|
132
|
-
way.level = Level.fromString(way.tags.level);
|
|
199
|
+
way.level = geo.Level.fromString(way.tags.level);
|
|
133
200
|
}
|
|
134
201
|
}
|
|
135
202
|
return model;
|
|
@@ -137,130 +204,20 @@ class OsmParser {
|
|
|
137
204
|
static _parseNode(attr) {
|
|
138
205
|
return new OsmNode(
|
|
139
206
|
Number(attr.id),
|
|
140
|
-
new Coordinates(Number(attr.lat), Number(attr.lon))
|
|
207
|
+
new geo.Coordinates(Number(attr.lat), Number(attr.lon))
|
|
141
208
|
);
|
|
142
209
|
}
|
|
143
210
|
static _parseWay(attr) {
|
|
144
211
|
return new OsmWay(Number(attr.id));
|
|
145
212
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
const DEFAULT_WAY_SELECTOR = (way) => {
|
|
149
|
-
return HIGHWAYS_PEDESTRIANS.includes(way.tags.highway) || way.tags.footway === "sidewalk" || way.tags.public_transport === "platform" || way.tags.railway === "platform";
|
|
150
|
-
};
|
|
151
|
-
function getNodeByName(network, name) {
|
|
152
|
-
return network.nodes.find(({ builtFrom }) => (builtFrom == null ? void 0 : builtFrom.tags.name) === name);
|
|
153
|
-
}
|
|
154
|
-
function getEdgeByName(network, name) {
|
|
155
|
-
return network.edges.find(({ builtFrom }) => (builtFrom == null ? void 0 : builtFrom.tags.name) === name);
|
|
156
|
-
}
|
|
157
|
-
function manageOneWay(edge, way) {
|
|
158
|
-
const { highway, oneway, conveying } = way.tags;
|
|
159
|
-
edge.isOneway = Boolean(oneway === "yes" || oneway === "true" || oneway === "1" || conveying && highway && ["forward", "backward"].includes(conveying));
|
|
160
|
-
if (edge.isOneway && conveying === "backward") {
|
|
161
|
-
const tmpNode = edge.node1;
|
|
162
|
-
edge.node1 = edge.node2;
|
|
163
|
-
edge.node2 = tmpNode;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
function createNodesAndEdgesFromElevator(nodes, edges, elevatorNode) {
|
|
167
|
-
const createdNodes = [];
|
|
168
|
-
const getOrCreateLevelNode = (level, builtFrom) => {
|
|
169
|
-
let levelNode = createdNodes.find(({ coords }) => Level.equals(level, coords.level));
|
|
170
|
-
if (!levelNode) {
|
|
171
|
-
levelNode = new GraphNode(elevatorNode.coords.clone(), builtFrom);
|
|
172
|
-
levelNode.coords.level = level;
|
|
173
|
-
createdNodes.push(levelNode);
|
|
174
|
-
nodes.push(levelNode);
|
|
175
|
-
}
|
|
176
|
-
return levelNode;
|
|
177
|
-
};
|
|
178
|
-
elevatorNode.edges.forEach((edge) => {
|
|
179
|
-
if (Level.isRange(edge.level)) {
|
|
180
|
-
throw new Error("Cannot handle this elevator edge due to ambiguity");
|
|
181
|
-
}
|
|
182
|
-
const levelNode = getOrCreateLevelNode(edge.level, elevatorNode.builtFrom);
|
|
183
|
-
if (edge.node1 === elevatorNode) {
|
|
184
|
-
edge.node1 = levelNode;
|
|
185
|
-
} else {
|
|
186
|
-
edge.node2 = levelNode;
|
|
187
|
-
}
|
|
188
|
-
levelNode.edges.push(edge);
|
|
189
|
-
});
|
|
190
|
-
for (let i = 0; i < createdNodes.length; i++) {
|
|
191
|
-
for (let j = i + 1; j < createdNodes.length; j++) {
|
|
192
|
-
const createdNode1 = createdNodes[i];
|
|
193
|
-
const createdNode2 = createdNodes[j];
|
|
194
|
-
if (createdNode1.coords.level === null || createdNode2.coords.level === null) {
|
|
195
|
-
continue;
|
|
196
|
-
}
|
|
197
|
-
const minLevel = Math.min(createdNode1.coords.level, createdNode2.coords.level);
|
|
198
|
-
const maxLevel = Math.max(createdNode1.coords.level, createdNode2.coords.level);
|
|
199
|
-
const newEdge = new GraphEdge(
|
|
200
|
-
createdNode1,
|
|
201
|
-
createdNode2,
|
|
202
|
-
[minLevel, maxLevel],
|
|
203
|
-
elevatorNode.builtFrom
|
|
204
|
-
);
|
|
205
|
-
edges.push(newEdge);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
const elevatorNodeIndex = nodes.indexOf(elevatorNode);
|
|
209
|
-
if (elevatorNodeIndex > -1) {
|
|
210
|
-
nodes.splice(elevatorNodeIndex, 1);
|
|
213
|
+
static _parseRelation(attr) {
|
|
214
|
+
return new OsmRelation(Number(attr.id));
|
|
211
215
|
}
|
|
212
216
|
}
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
let node = nodesCreated[osmNode.id];
|
|
220
|
-
if (!node) {
|
|
221
|
-
node = new GraphNode(osmNode.coords, osmNode);
|
|
222
|
-
nodesCreated[osmNode.id] = node;
|
|
223
|
-
nodes.push(node);
|
|
224
|
-
if (osmNode.tags.highway === "elevator") {
|
|
225
|
-
elevatorNodes.push(node);
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
return node;
|
|
229
|
-
};
|
|
230
|
-
osmModel.ways.forEach((way) => {
|
|
231
|
-
if (!waySelectionFilter(way)) {
|
|
232
|
-
return;
|
|
233
|
-
}
|
|
234
|
-
let firstNode = getOrCreateNode(way.nodes[0]);
|
|
235
|
-
for (let i = 1; i < way.nodes.length; i++) {
|
|
236
|
-
const secondNode = getOrCreateNode(way.nodes[i]);
|
|
237
|
-
const edge = new GraphEdge(firstNode, secondNode, way.level, way);
|
|
238
|
-
manageOneWay(edge, way);
|
|
239
|
-
edges.push(edge);
|
|
240
|
-
firstNode = secondNode;
|
|
241
|
-
}
|
|
242
|
-
});
|
|
243
|
-
elevatorNodes.forEach((node) => {
|
|
244
|
-
createNodesAndEdgesFromElevator(nodes, edges, node);
|
|
245
|
-
});
|
|
246
|
-
const networkModel = new Network(nodes, edges);
|
|
247
|
-
GraphNode.generateNodesLevels(networkModel.nodes);
|
|
248
|
-
return networkModel;
|
|
249
|
-
}
|
|
250
|
-
const OsmNetworkUtils = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
251
|
-
__proto__: null,
|
|
252
|
-
HIGHWAYS_PEDESTRIANS,
|
|
253
|
-
DEFAULT_WAY_SELECTOR,
|
|
254
|
-
getNodeByName,
|
|
255
|
-
getEdgeByName,
|
|
256
|
-
createNetworkFromOsmModel
|
|
257
|
-
}, Symbol.toStringTag, { value: "Module" }));
|
|
258
|
-
export {
|
|
259
|
-
OsmElement,
|
|
260
|
-
OsmModel,
|
|
261
|
-
OsmNetworkUtils,
|
|
262
|
-
OsmNode,
|
|
263
|
-
OsmParser,
|
|
264
|
-
OsmWay
|
|
265
|
-
};
|
|
217
|
+
exports.OsmElement = OsmElement;
|
|
218
|
+
exports.OsmModel = OsmModel;
|
|
219
|
+
exports.OsmNode = OsmNode;
|
|
220
|
+
exports.OsmParser = OsmParser;
|
|
221
|
+
exports.OsmRelation = OsmRelation;
|
|
222
|
+
exports.OsmWay = OsmWay;
|
|
266
223
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/OsmElement.ts","../src/OsmModel.ts","../src/OsmNode.ts","../src/OsmWay.ts","../src/OsmParser.ts","../src/OsmNetworkUtils.ts"],"sourcesContent":["\nexport type OsmTags = { [key: string]: string };\n\nclass OsmElement {\n\n id: number;\n tags: OsmTags;\n\n constructor(id: number, tags?: OsmTags) {\n this.id = id;\n this.tags = tags || {};\n }\n}\n\nexport default OsmElement;\n","import OsmNode from './OsmNode.js';\nimport OsmWay from './OsmWay.js';\n\nclass OsmModel {\n\n nodes: OsmNode[];\n ways: OsmWay[];\n\n constructor(nodes?: OsmNode[], ways?: OsmWay[]) {\n this.nodes = nodes || [];\n this.ways = ways || [];\n }\n\n getNodeById(id: number) {\n return this.nodes.find(node => node.id === id) || null;\n }\n\n getNodeByName(name: string) {\n return this.nodes.find(node => node.tags.name === name) || null;\n }\n\n getWayById(id: number) {\n return this.ways.find(way => way.id === id) || null;\n }\n\n getWayByName(name: string) {\n return this.ways.find(way => way.tags.name === name) || null;\n }\n\n}\n\nexport default OsmModel;\n","import { Coordinates } from '@wemap/geo';\n\nimport OsmElement, { OsmTags } from './OsmElement.js';\nimport OsmWay from './OsmWay.js';\n\nclass OsmNode extends OsmElement {\n\n coords : Coordinates;\n ways: OsmWay[] = [];\n\n\n constructor(id: number, coords: Coordinates, tags?: OsmTags) {\n super(id, tags);\n this.coords = coords;\n }\n\n get isElevator() {\n return this.tags.highway === 'elevator';\n }\n\n get isConveying() {\n return this.isElevator;\n }\n}\n\nexport default OsmNode;\n","import { Level_t } from '@wemap/geo';\nimport OsmElement, { OsmTags } from './OsmElement.js';\nimport OsmNode from './OsmNode.js';\n\nclass OsmWay extends OsmElement {\n\n nodes: OsmNode[] = [];\n level: Level_t = null;\n\n constructor(id: number, tags?: OsmTags, level: Level_t = null) {\n super(id, tags);\n this.level = level;\n }\n\n get areStairs() {\n return this.tags.highway === 'steps';\n }\n\n get isConveying() {\n return this.tags.hasOwnProperty('conveying');\n }\n\n get isEscalator() {\n return this.areStairs && this.isConveying;\n }\n\n get isMovingWalkway() {\n return !this.areStairs && this.isConveying;\n }\n\n get isArea() {\n // That is not the real definition for OSM\n return this.nodes[0] === this.nodes[this.nodes.length - 1];\n }\n}\n\nexport default OsmWay;\n","/* eslint-disable max-statements */\nimport { SaxesParser } from 'saxes';\n\nimport {\n Level, Coordinates\n} from '@wemap/geo';\n\nimport OsmModel from './OsmModel.js';\nimport OsmNode from './OsmNode.js';\nimport OsmWay from './OsmWay.js';\n\ntype OsmXmlElement = { action?: 'delete' };\ntype OsmXmlNode = { id: string, lat: string, lon: string } & OsmXmlElement;\ntype OsmXmlWay = { id: string } & OsmXmlElement;\n\nclass OsmParser {\n\n static parseOsmXmlString(osmXmlString: string) {\n\n const model = new OsmModel();\n const parser = new SaxesParser();\n\n let buffer: OsmNode | OsmWay | null;\n\n const isDeleted = (element: { attributes: OsmXmlElement }) =>\n element.attributes.action && element.attributes.action === 'delete';\n\n parser.on('opentag', (node) => {\n\n switch (node.name) {\n case 'node': {\n if (isDeleted(node)) {\n buffer = null;\n break;\n }\n const osmNode = this._parseNode(node.attributes as OsmXmlNode);\n buffer = osmNode;\n model.nodes.push(osmNode);\n break;\n }\n case 'way': {\n if (isDeleted(node)) {\n buffer = null;\n break;\n }\n const osmWay = this._parseWay(node.attributes as OsmXmlWay);\n buffer = osmWay;\n model.ways.push(osmWay);\n break;\n }\n case 'tag': {\n if (!buffer) {\n return;\n }\n const {\n k, v\n } = node.attributes;\n buffer.tags[k] = v;\n break;\n }\n case 'nd': {\n if (!buffer || !(buffer instanceof OsmWay)) {\n return;\n }\n const nodeId = Number(node.attributes.ref);\n const refNode = model.getNodeById(nodeId);\n if (!refNode) {\n throw Error('Node: ' + nodeId + ' in way ' + buffer.id + ' not found');\n }\n\n buffer.nodes.push(refNode);\n refNode.ways.push(buffer);\n break;\n }\n }\n });\n\n parser.write(osmXmlString);\n\n for (let i = 0; i < model.ways.length; i++) {\n const way = model.ways[i];\n if (way.tags.level) {\n way.level = Level.fromString(way.tags.level);\n }\n }\n\n return model;\n }\n\n\n static _parseNode(attr: OsmXmlNode) {\n return new OsmNode(\n Number(attr.id),\n new Coordinates(Number(attr.lat), Number(attr.lon)));\n }\n\n static _parseWay(attr: { id: string }) {\n return new OsmWay(Number(attr.id));\n }\n}\n\nexport default OsmParser;\n","import { Level, GraphEdge, GraphNode, Network } from '@wemap/geo';\nimport OsmElement from './OsmElement';\nimport OsmModel from './OsmModel';\nimport OsmNode from './OsmNode';\nimport OsmWay from './OsmWay';\n\n\nexport const HIGHWAYS_PEDESTRIANS = ['footway', 'steps', 'pedestrian', 'living_street', 'path', 'track', 'sidewalk'];\n\nexport const DEFAULT_WAY_SELECTOR = (way: OsmWay) => {\n return HIGHWAYS_PEDESTRIANS.includes(way.tags.highway)\n || way.tags.footway === 'sidewalk'\n || way.tags.public_transport === 'platform'\n || way.tags.railway === 'platform';\n};\n\nexport function getNodeByName(network: Network<OsmElement>, name: string) {\n return network.nodes.find(({ builtFrom }) => builtFrom?.tags.name === name);\n}\n\nexport function getEdgeByName(network: Network<OsmElement>, name: string) {\n return network.edges.find(({ builtFrom }) => builtFrom?.tags.name === name);\n}\n\nfunction manageOneWay(edge: GraphEdge<OsmElement>, way: OsmWay) {\n\n const { highway, oneway, conveying } = way.tags;\n\n edge.isOneway = Boolean((oneway === 'yes' || oneway === 'true' || oneway === '1')\n || (conveying && highway && ['forward', 'backward'].includes(conveying)));\n\n if (edge.isOneway && conveying === 'backward') {\n const tmpNode = edge.node1;\n edge.node1 = edge.node2;\n edge.node2 = tmpNode;\n }\n}\n\n\nfunction createNodesAndEdgesFromElevator(\n nodes: GraphNode<OsmElement>[],\n edges: GraphEdge<OsmElement>[],\n elevatorNode: GraphNode<OsmElement>\n) {\n\n const createdNodes: GraphNode<OsmElement>[] = [];\n const getOrCreateLevelNode = (level: number | null, builtFrom: OsmElement | null) => {\n let levelNode = createdNodes.find(({ coords }) => Level.equals(level, coords.level));\n if (!levelNode) {\n levelNode = new GraphNode(elevatorNode.coords.clone(), builtFrom);\n levelNode.coords.level = level;\n createdNodes.push(levelNode);\n nodes.push(levelNode);\n }\n return levelNode;\n };\n\n // Create nodes from node.edges\n elevatorNode.edges.forEach(edge => {\n if (Level.isRange(edge.level)) {\n throw new Error('Cannot handle this elevator edge due to ambiguity');\n }\n\n const levelNode = getOrCreateLevelNode(edge.level, elevatorNode.builtFrom);\n if (edge.node1 === elevatorNode) {\n edge.node1 = levelNode;\n } else {\n edge.node2 = levelNode;\n }\n levelNode.edges.push(edge);\n });\n\n // Create edges from createdNodes\n for (let i = 0; i < createdNodes.length; i++) {\n for (let j = i + 1; j < createdNodes.length; j++) {\n\n const createdNode1 = createdNodes[i];\n const createdNode2 = createdNodes[j];\n\n if (createdNode1.coords.level === null || createdNode2.coords.level === null) {\n // TODO: not the best approach... but cannot do better with [number, number] range for levels\n continue;\n }\n\n const minLevel = Math.min(createdNode1.coords.level as number, createdNode2.coords.level as number);\n const maxLevel = Math.max(createdNode1.coords.level as number, createdNode2.coords.level as number);\n\n const newEdge = new GraphEdge(\n createdNode1,\n createdNode2,\n [minLevel, maxLevel],\n elevatorNode.builtFrom\n );\n edges.push(newEdge);\n }\n }\n\n // Remove the historical elevator node from the network\n const elevatorNodeIndex = nodes.indexOf(elevatorNode);\n if (elevatorNodeIndex > -1) {\n nodes.splice(elevatorNodeIndex, 1);\n }\n}\n\nexport function createNetworkFromOsmModel(\n osmModel: OsmModel,\n waySelectionFilter = DEFAULT_WAY_SELECTOR\n) {\n\n const nodes: GraphNode<OsmElement>[] = [];\n const edges: GraphEdge<OsmElement>[] = [];\n\n const nodesCreated: { [key: number]: GraphNode<OsmElement> } = {};\n const elevatorNodes: GraphNode<OsmElement>[] = [];\n\n const getOrCreateNode = (osmNode: OsmNode) => {\n let node = nodesCreated[osmNode.id];\n if (!node) {\n node = new GraphNode(osmNode.coords, osmNode);\n nodesCreated[osmNode.id] = node;\n nodes.push(node);\n\n if (osmNode.tags.highway === 'elevator') {\n elevatorNodes.push(node);\n }\n }\n return node;\n };\n\n osmModel.ways.forEach(way => {\n if (!waySelectionFilter(way)) {\n return;\n }\n\n let firstNode = getOrCreateNode(way.nodes[0]);\n for (let i = 1; i < way.nodes.length; i++) {\n const secondNode = getOrCreateNode(way.nodes[i]);\n\n const edge = new GraphEdge<OsmElement>(firstNode, secondNode, way.level, way);\n manageOneWay(edge, way);\n edges.push(edge);\n firstNode = secondNode;\n }\n\n });\n\n elevatorNodes.forEach(node => {\n // We have to clone this node for each connected edge\n createNodesAndEdgesFromElevator(nodes, edges, node);\n });\n\n const networkModel = new Network(nodes, edges);\n\n GraphNode.generateNodesLevels(networkModel.nodes);\n\n return networkModel;\n}\n\n\n// /**\n// * @param {GraphNode} node\n// * @param {object} tags\n// */\n// static _applyNodePropertiesFromTags(node, tags) {\n// node.name = tags.name || null;\n// node.subwayEntrance = tags.railway === 'subway_entrance';\n// if (node.subwayEntrance && tags.ref) {\n// node.subwayEntranceRef = tags.ref;\n// }\n// }\n\n// /**\n// * @param {GraphEdge} edge\n// * @param {object} tags\n// */\n// static _applyEdgePropertiesFromTags(edge, tags) {\n// const { highway, oneway, conveying, name } = tags;\n// edge.name = name || null;\n// edge.isStairs = highway === 'steps';\n// edge.isConveying = 'conveying' in tags;\n// edge.isOneway = Boolean((oneway === 'yes' || oneway === 'true' || oneway === '1')\n// || (conveying && highway && ['yes', 'forward', 'backward'].includes(conveying)));\n\n// if (conveying === 'backward') {\n// const tmpNode = edge.node1;\n// edge.node1 = edge.node2;\n// edge.node2 = tmpNode;\n// }\n\n// }\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/OsmElement.ts","../src/OsmModel.ts","../src/OsmNode.ts","../src/OsmWay.ts","../src/OsmRelation.ts","../src/OsmParser.ts"],"sourcesContent":["\nexport type OsmTags = { [key: string]: string };\n\nclass OsmElement {\n\n id: number;\n tags: OsmTags;\n\n constructor(id: number, tags?: OsmTags) {\n this.id = id;\n this.tags = tags || {};\n }\n}\n\nexport default OsmElement;\n","import OsmNode from './OsmNode.js';\nimport OsmRelation from './OsmRelation.js';\nimport OsmWay from './OsmWay.js';\n\nclass OsmModel {\n\n nodes: OsmNode[];\n ways: OsmWay[];\n relations: OsmRelation[];\n\n constructor(nodes?: OsmNode[], ways?: OsmWay[], relations?: OsmRelation[]) {\n this.nodes = nodes || [];\n this.ways = ways || [];\n this.relations = relations || [];\n }\n\n getNodeById(id: number) {\n return this.nodes.find(node => node.id === id) || null;\n }\n\n getNodeByName(name: string) {\n return this.nodes.find(node => node.tags.name === name) || null;\n }\n\n getWayById(id: number) {\n return this.ways.find(way => way.id === id) || null;\n }\n\n getWayByName(name: string) {\n return this.ways.find(way => way.tags.name === name) || null;\n }\n\n getRelationById(id: number) {\n return this.relations.find(way => way.id === id) || null;\n }\n\n getRelationByName(name: string) {\n return this.relations.find(way => way.tags.name === name) || null;\n }\n}\n\nexport default OsmModel;\n","import { Coordinates } from '@wemap/geo';\n\nimport OsmElement, { OsmTags } from './OsmElement.js';\nimport OsmRelation from './OsmRelation.js';\nimport OsmWay from './OsmWay.js';\n\nclass OsmNode extends OsmElement {\n\n coords : Coordinates;\n ways: OsmWay[] = [];\n relations: OsmRelation[] = [];\n\n constructor(id: number, coords: Coordinates, tags?: OsmTags) {\n super(id, tags);\n this.coords = coords;\n }\n\n get isElevator() {\n return this.tags.highway === 'elevator';\n }\n\n get isConveying() {\n return this.isElevator;\n }\n}\n\nexport default OsmNode;\n","import { Level_t } from '@wemap/geo';\nimport OsmElement, { OsmTags } from './OsmElement.js';\nimport OsmNode from './OsmNode.js';\nimport OsmRelation from './OsmRelation.js';\n\nclass OsmWay extends OsmElement {\n\n nodes: OsmNode[] = [];\n relations: OsmRelation[] = [];\n level: Level_t = null;\n\n constructor(id: number, tags?: OsmTags, level: Level_t = null) {\n super(id, tags);\n this.level = level;\n }\n\n get areStairs() {\n return this.tags.highway === 'steps';\n }\n\n get isConveying() {\n return this.tags.hasOwnProperty('conveying');\n }\n\n get isEscalator() {\n return this.areStairs && this.isConveying;\n }\n\n get isMovingWalkway() {\n return !this.areStairs && this.isConveying;\n }\n\n get isElevator() {\n return this.tags.highway === 'elevator';\n }\n\n get isArea() {\n // That is not the real definition for OSM\n return this.nodes[0] === this.nodes[this.nodes.length - 1];\n }\n}\n\nexport default OsmWay;\n","import OsmElement, { OsmTags } from './OsmElement.js';\nimport OsmNode from './OsmNode.js';\nimport OsmWay from './OsmWay.js';\nimport type { Position, Polygon } from 'geojson';\n\nexport type OsmRelationMember = {\n ref: OsmRelation | OsmWay | OsmNode,\n role: string\n}\n\nclass OsmRelation extends OsmElement {\n\n relations: OsmRelation[] = [];\n\n constructor(\n id: number,\n public members: OsmRelationMember[] = [],\n tags?: OsmTags\n ) {\n super(id, tags);\n }\n\n isMultipolygon() {\n return this.tags.type === 'multipolygon';\n }\n\n getGeoJsonPolygon(): Polygon | null {\n if (!this.isMultipolygon()) return null;\n const outer = this.members.find(member => member.ref instanceof OsmWay && member.role === 'outer');\n if (!outer) return null;\n const inners = this.members.filter(member => member.ref instanceof OsmWay && member.role === 'inner');\n return {\n type: \"Polygon\",\n coordinates: [outer, ...inners].map(member => {\n const way = member.ref as OsmWay;\n return way.nodes.map(node => [node.coords.lng, node.coords.lat] as Position);\n })\n }\n }\n}\n\nexport default OsmRelation;\n","/* eslint-disable max-statements */\nimport { SaxesParser } from 'saxes';\n\nimport {\n Level, Coordinates\n} from '@wemap/geo';\n\nimport OsmModel from './OsmModel.js';\nimport OsmNode from './OsmNode.js';\nimport OsmWay from './OsmWay.js';\nimport OsmRelation from './OsmRelation.js';\n\ntype OsmXmlElement = { action?: 'delete' };\ntype OsmXmlNode = { id: string, lat: string, lon: string } & OsmXmlElement;\ntype OsmXmlWay = { id: string } & OsmXmlElement;\ntype OsmXmlRelation = { id: string } & OsmXmlElement;\n\nclass OsmParser {\n\n static parseOsmXmlString(osmXmlString: string) {\n\n const model = new OsmModel();\n const parser = new SaxesParser();\n\n let buffer: OsmNode | OsmWay | OsmRelation | null;\n\n const isDeleted = (element: { attributes: OsmXmlElement }) =>\n element.attributes.action && element.attributes.action === 'delete';\n\n parser.on('opentag', (node) => {\n\n switch (node.name) {\n case 'node': {\n if (isDeleted(node)) {\n buffer = null;\n break;\n }\n const osmNode = this._parseNode(node.attributes as OsmXmlNode);\n buffer = osmNode;\n model.nodes.push(osmNode);\n break;\n }\n case 'way': {\n if (isDeleted(node)) {\n buffer = null;\n break;\n }\n const osmWay = this._parseWay(node.attributes as OsmXmlWay);\n buffer = osmWay;\n model.ways.push(osmWay);\n break;\n }\n case 'relation': {\n if (isDeleted(node)) {\n buffer = null;\n break;\n }\n const osmRelation = this._parseRelation(node.attributes as OsmXmlRelation);\n buffer = osmRelation;\n model.relations.push(osmRelation);\n break;\n }\n case 'tag': {\n if (!buffer) {\n return;\n }\n const {\n k, v\n } = node.attributes;\n buffer.tags[k] = v;\n break;\n }\n case 'nd': {\n if (!buffer || !(buffer instanceof OsmWay)) {\n return;\n }\n const nodeId = Number(node.attributes.ref);\n const refNode = model.getNodeById(nodeId);\n if (!refNode) {\n throw Error('Node: ' + nodeId + ' in way ' + buffer.id + ' not found');\n }\n\n buffer.nodes.push(refNode);\n refNode.ways.push(buffer);\n break;\n }\n case 'member': {\n if (!buffer || !(buffer instanceof OsmRelation)) {\n return;\n }\n const memberId = Number(node.attributes.ref);\n const memberType = node.attributes.type;\n let refElement: OsmNode | OsmWay | OsmRelation | null = null;\n memberType === 'node' && (refElement = model.getNodeById(memberId));\n memberType === 'way' && (refElement = model.getWayById(memberId));\n memberType === 'relation' && (refElement = model.getRelationById(memberId));\n\n if (!refElement) {\n throw Error('Member: ' + memberId + ' in relation ' + buffer.id + ' not found');\n }\n\n buffer.members.push({ ref: refElement, role: node.attributes.role });\n refElement.relations.push(buffer);\n break;\n }\n }\n });\n\n parser.write(osmXmlString);\n\n for (let i = 0; i < model.ways.length; i++) {\n const way = model.ways[i];\n if (way.tags.level) {\n way.level = Level.fromString(way.tags.level);\n }\n }\n\n return model;\n }\n\n\n static _parseNode(attr: OsmXmlNode) {\n return new OsmNode(\n Number(attr.id),\n new Coordinates(Number(attr.lat), Number(attr.lon)));\n }\n\n static _parseWay(attr: { id: string }) {\n return new OsmWay(Number(attr.id));\n }\n\n static _parseRelation(attr: { id: string }) {\n return new OsmRelation(Number(attr.id));\n }\n}\n\nexport default OsmParser;\n"],"names":["SaxesParser","Level","Coordinates"],"mappings":"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"}
|