@sswroom/sswr 1.4.1 → 1.5.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.
- package/Changelog +31 -0
- package/cesium.d.ts +36 -1
- package/cesium.js +85 -0
- package/kml.d.ts +60 -15
- package/kml.js +203 -25
- package/leaflet.d.ts +50 -3
- package/leaflet.js +229 -1
- package/map.d.ts +2 -1
- package/map.js +3 -3
- package/math.js +11 -11
- package/olayer2.d.ts +2 -1
- package/olayer2.js +5 -0
- package/osm.d.ts +1 -0
- package/osm.js +5 -0
- package/package.json +1 -1
- package/parser.d.ts +4 -0
- package/parser.js +460 -0
- package/text.d.ts +2 -1
- package/text.js +12 -1
- package/unit.d.ts +355 -39
- package/unit.js +933 -65
- package/web.d.ts +2 -1
- package/web.js +42 -0
package/parser.js
ADDED
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
import * as geomtry from "./geometry.js";
|
|
2
|
+
import * as kml from "./kml.js";
|
|
3
|
+
import * as text from "./text.js";
|
|
4
|
+
|
|
5
|
+
function parseKMLStyle(node)
|
|
6
|
+
{
|
|
7
|
+
var subNode;
|
|
8
|
+
var subNode2;
|
|
9
|
+
var subNode3;
|
|
10
|
+
var innerStyle;
|
|
11
|
+
var id = node.id;
|
|
12
|
+
var style = new kml.Style(id);
|
|
13
|
+
for (subNode of node.childNodes)
|
|
14
|
+
{
|
|
15
|
+
switch (subNode.nodeName)
|
|
16
|
+
{
|
|
17
|
+
case "#text":
|
|
18
|
+
break;
|
|
19
|
+
case "IconStyle":
|
|
20
|
+
innerStyle = new kml.IconStyle();
|
|
21
|
+
for (subNode2 of subNode.childNodes)
|
|
22
|
+
{
|
|
23
|
+
switch (subNode2.nodeName)
|
|
24
|
+
{
|
|
25
|
+
case "#text":
|
|
26
|
+
break;
|
|
27
|
+
case "color":
|
|
28
|
+
innerStyle.setColor(subNode2.textContent);
|
|
29
|
+
break;
|
|
30
|
+
case "scale":
|
|
31
|
+
innerStyle.setScale(Number.parseFloat(subNode2.textContent));
|
|
32
|
+
break;
|
|
33
|
+
case "hotSpot":
|
|
34
|
+
{
|
|
35
|
+
var x;
|
|
36
|
+
var y;
|
|
37
|
+
var xunits;
|
|
38
|
+
var yunits;
|
|
39
|
+
for (subNode3 of subNode2.attributes)
|
|
40
|
+
{
|
|
41
|
+
switch (subNode3.name)
|
|
42
|
+
{
|
|
43
|
+
case "x":
|
|
44
|
+
x = Number.parseFloat(subNode3.value);
|
|
45
|
+
break;
|
|
46
|
+
case "y":
|
|
47
|
+
y = Number.parseFloat(subNode3.value);
|
|
48
|
+
break;
|
|
49
|
+
case "xunits":
|
|
50
|
+
xunits = subNode3.value;
|
|
51
|
+
break;
|
|
52
|
+
case "yunits":
|
|
53
|
+
yunits = subNode3.value;
|
|
54
|
+
break;
|
|
55
|
+
default:
|
|
56
|
+
console.log("Unknown attribute in hotSpot", subNode3);
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (x != null && y != null && xunits != null && yunits != null)
|
|
61
|
+
{
|
|
62
|
+
innerStyle.setHotSpotX(x, xunits);
|
|
63
|
+
innerStyle.setHotSpotY(y, yunits);
|
|
64
|
+
}
|
|
65
|
+
else
|
|
66
|
+
{
|
|
67
|
+
console.log("hotSopt attributes has missing", x, y, xunits, yunits);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
break;
|
|
71
|
+
case "Icon":
|
|
72
|
+
for (subNode3 of subNode2.childNodes)
|
|
73
|
+
{
|
|
74
|
+
switch (subNode3.nodeName)
|
|
75
|
+
{
|
|
76
|
+
case "#text":
|
|
77
|
+
break;
|
|
78
|
+
case "href":
|
|
79
|
+
{
|
|
80
|
+
var url = subNode3.textContent;
|
|
81
|
+
if (url.startsWith("http://") || url.startsWith("https://"))
|
|
82
|
+
{
|
|
83
|
+
innerStyle.setIconUrl(url);
|
|
84
|
+
}
|
|
85
|
+
else
|
|
86
|
+
{
|
|
87
|
+
console.log("Icon Style.Icon maybe harmful and has to be blocked", url);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
break;
|
|
91
|
+
default:
|
|
92
|
+
console.log("Unknown node in kml IconStyle.Icon", subNode3);
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
break;
|
|
97
|
+
default:
|
|
98
|
+
console.log("Unknown node in kml IconStyle", subNode2);
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
style.setIconStyle(innerStyle);
|
|
103
|
+
break;
|
|
104
|
+
case "LineStyle":
|
|
105
|
+
innerStyle = new kml.LineStyle();
|
|
106
|
+
for (subNode2 of subNode.childNodes)
|
|
107
|
+
{
|
|
108
|
+
switch (subNode2.nodeName)
|
|
109
|
+
{
|
|
110
|
+
case "#text":
|
|
111
|
+
break;
|
|
112
|
+
case "color":
|
|
113
|
+
innerStyle.setColor(subNode2.textContent);
|
|
114
|
+
break;
|
|
115
|
+
case "width":
|
|
116
|
+
innerStyle.setWidth(Number.parseFloat(subNode2.textContent));
|
|
117
|
+
break;
|
|
118
|
+
case "gx:labelVisibility":
|
|
119
|
+
innerStyle.setLabelVisibility(subNode2.textContent == "1");
|
|
120
|
+
break;
|
|
121
|
+
default:
|
|
122
|
+
console.log("Unknown node in kml LineStyle", subNode2);
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
style.setLineStyle(innerStyle);
|
|
127
|
+
break;
|
|
128
|
+
case "LabelStyle":
|
|
129
|
+
innerStyle = new kml.LabelStyle();
|
|
130
|
+
for (subNode2 of subNode.childNodes)
|
|
131
|
+
{
|
|
132
|
+
switch (subNode2.nodeName)
|
|
133
|
+
{
|
|
134
|
+
case "#text":
|
|
135
|
+
break;
|
|
136
|
+
case "scale":
|
|
137
|
+
innerStyle.setScale(Number.parseFloat(subNode2.textContent));
|
|
138
|
+
break;
|
|
139
|
+
default:
|
|
140
|
+
console.log("Unknown node in kml LabelStyle", subNode2);
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
style.setLineStyle(innerStyle);
|
|
145
|
+
break;
|
|
146
|
+
default:
|
|
147
|
+
console.log("Unknown node in kml Style", subNode);
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return style;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function parseKMLContainer(container, kmlNode, doc)
|
|
155
|
+
{
|
|
156
|
+
doc = doc || container;
|
|
157
|
+
var node;
|
|
158
|
+
var feature;
|
|
159
|
+
var subNode;
|
|
160
|
+
var subNode2;
|
|
161
|
+
for (node of kmlNode.childNodes)
|
|
162
|
+
{
|
|
163
|
+
switch (node.nodeName)
|
|
164
|
+
{
|
|
165
|
+
case "Style":
|
|
166
|
+
doc.addStyle(parseKMLStyle(node));
|
|
167
|
+
break;
|
|
168
|
+
case "StyleMap":
|
|
169
|
+
{
|
|
170
|
+
var id;
|
|
171
|
+
var normalStyle;
|
|
172
|
+
var highlightStyle;
|
|
173
|
+
for (subNode of node.attributes)
|
|
174
|
+
{
|
|
175
|
+
if (subNode.name == "id")
|
|
176
|
+
id = subNode.value;
|
|
177
|
+
else
|
|
178
|
+
console.log("Unknown attribute in StyleMap", subNode);
|
|
179
|
+
}
|
|
180
|
+
for (subNode of node.childNodes)
|
|
181
|
+
{
|
|
182
|
+
var pairType;
|
|
183
|
+
switch (subNode.nodeName)
|
|
184
|
+
{
|
|
185
|
+
case "#text":
|
|
186
|
+
break;
|
|
187
|
+
case "Pair":
|
|
188
|
+
pairType = null;
|
|
189
|
+
for (subNode2 of subNode.childNodes)
|
|
190
|
+
{
|
|
191
|
+
switch (subNode2.nodeName)
|
|
192
|
+
{
|
|
193
|
+
case "#text":
|
|
194
|
+
break;
|
|
195
|
+
case "key":
|
|
196
|
+
pairType = subNode2.textContent;
|
|
197
|
+
break;
|
|
198
|
+
case "Style":
|
|
199
|
+
if (pairType == "normal")
|
|
200
|
+
normalStyle = parseKMLStyle(subNode2);
|
|
201
|
+
else if (pairType == "highlight")
|
|
202
|
+
highlightStyle = parseKMLStyle(subNode2);
|
|
203
|
+
else
|
|
204
|
+
console.log("Unknown pair type", pairType);
|
|
205
|
+
break;
|
|
206
|
+
case "styleUrl":
|
|
207
|
+
if (pairType == "normal")
|
|
208
|
+
normalStyle = doc.getStyleById(subNode2.textContent.substring(1));
|
|
209
|
+
else if (pairType == "highlight")
|
|
210
|
+
highlightStyle = doc.getStyleById(subNode2.textContent.substring(1));
|
|
211
|
+
else
|
|
212
|
+
console.log("Unknown pair type", pairType);
|
|
213
|
+
break;
|
|
214
|
+
default:
|
|
215
|
+
console.log("Unknown node in StyleMap.Pair", subNode2);
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
break;
|
|
220
|
+
default:
|
|
221
|
+
console.log("Unknown node in StyleMap", subNode);
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (id && normalStyle && highlightStyle)
|
|
226
|
+
{
|
|
227
|
+
doc.addStyleMap(new kml.StyleMap(id, normalStyle, highlightStyle));
|
|
228
|
+
}
|
|
229
|
+
else
|
|
230
|
+
{
|
|
231
|
+
console.log("Missing items in StyleMap", id, normalStyle, highlightStyle);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
for (node of kmlNode.childNodes)
|
|
238
|
+
{
|
|
239
|
+
switch (node.nodeName)
|
|
240
|
+
{
|
|
241
|
+
case "name":
|
|
242
|
+
container.setName(node.textContent);
|
|
243
|
+
break;
|
|
244
|
+
case "description":
|
|
245
|
+
container.setDescription(node.textContent);
|
|
246
|
+
break;
|
|
247
|
+
case "open":
|
|
248
|
+
container.setOpen(node.textContent == "1");
|
|
249
|
+
break;
|
|
250
|
+
case "visibility":
|
|
251
|
+
container.setVisibility(node.textContent == "1");
|
|
252
|
+
break;
|
|
253
|
+
case "Style":
|
|
254
|
+
break;
|
|
255
|
+
case "StyleMap":
|
|
256
|
+
break;
|
|
257
|
+
case "Folder":
|
|
258
|
+
case "Placemark":
|
|
259
|
+
feature = parseKMLNode(node, doc || container);
|
|
260
|
+
if (feature)
|
|
261
|
+
container.addFeature(feature);
|
|
262
|
+
break;
|
|
263
|
+
case "#text":
|
|
264
|
+
break;
|
|
265
|
+
default:
|
|
266
|
+
console.log("Unknown node in kml container: "+node.nodeName, node);
|
|
267
|
+
break;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return container;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
function parseKMLPlacemark(kmlNode, doc)
|
|
274
|
+
{
|
|
275
|
+
var node;
|
|
276
|
+
var subNode;
|
|
277
|
+
var name;
|
|
278
|
+
var description;
|
|
279
|
+
var snippet;
|
|
280
|
+
var coords;
|
|
281
|
+
var geom;
|
|
282
|
+
var visibility;
|
|
283
|
+
var style;
|
|
284
|
+
for (node of kmlNode.childNodes)
|
|
285
|
+
{
|
|
286
|
+
switch (node.nodeName)
|
|
287
|
+
{
|
|
288
|
+
case "#text":
|
|
289
|
+
break;
|
|
290
|
+
case "name":
|
|
291
|
+
name = node.textContent;
|
|
292
|
+
break;
|
|
293
|
+
case "description":
|
|
294
|
+
description = node.textContent;
|
|
295
|
+
break;
|
|
296
|
+
case "snippet":
|
|
297
|
+
snippet = node.textContent;
|
|
298
|
+
break;
|
|
299
|
+
case "styleUrl":
|
|
300
|
+
if (node.textContent.startsWith("#") && doc)
|
|
301
|
+
{
|
|
302
|
+
style = doc.getStyleById(node.textContent.substring(1));
|
|
303
|
+
if (style == null)
|
|
304
|
+
{
|
|
305
|
+
console.log("styleUrl not found in kml placemark", node.textContent);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
else
|
|
309
|
+
{
|
|
310
|
+
console.log("Unknown styleUrl in kml placemark", node.textContent);
|
|
311
|
+
}
|
|
312
|
+
break;
|
|
313
|
+
case "visibility":
|
|
314
|
+
visibility = (node.textContent == "1");
|
|
315
|
+
break;
|
|
316
|
+
case "Point":
|
|
317
|
+
for (subNode of node.childNodes)
|
|
318
|
+
{
|
|
319
|
+
switch (subNode.nodeName)
|
|
320
|
+
{
|
|
321
|
+
case "#text":
|
|
322
|
+
break;
|
|
323
|
+
case "extrude":
|
|
324
|
+
break;
|
|
325
|
+
case "altitudeMode":
|
|
326
|
+
break;
|
|
327
|
+
case "tessellate":
|
|
328
|
+
break;
|
|
329
|
+
case "coordinates":
|
|
330
|
+
coords = subNode.textContent.split(",");
|
|
331
|
+
geom = new geomtry.Point(4326, text.arrayToNumbers(coords));
|
|
332
|
+
break;
|
|
333
|
+
default:
|
|
334
|
+
console.log("Unknown node in kml Point: "+subNode.nodeName, subNode);
|
|
335
|
+
break;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
break;
|
|
339
|
+
case "LineString":
|
|
340
|
+
for (subNode of node.childNodes)
|
|
341
|
+
{
|
|
342
|
+
switch (subNode.nodeName)
|
|
343
|
+
{
|
|
344
|
+
case "#text":
|
|
345
|
+
break;
|
|
346
|
+
case "extrude":
|
|
347
|
+
break;
|
|
348
|
+
case "altitudeMode":
|
|
349
|
+
break;
|
|
350
|
+
case "tessellate":
|
|
351
|
+
break;
|
|
352
|
+
case "coordinates":
|
|
353
|
+
{
|
|
354
|
+
var pts = subNode.textContent.split(/\s+/);
|
|
355
|
+
var ls = [];
|
|
356
|
+
var i;
|
|
357
|
+
var arr;
|
|
358
|
+
for (i in pts)
|
|
359
|
+
{
|
|
360
|
+
arr = pts[i].split(",");
|
|
361
|
+
if (arr.length >= 2)
|
|
362
|
+
{
|
|
363
|
+
ls.push(text.arrayToNumbers(arr));
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
geom = new geomtry.LineString(4326, ls);
|
|
367
|
+
}
|
|
368
|
+
break;
|
|
369
|
+
default:
|
|
370
|
+
console.log("Unknown node in kml LineString: "+subNode.nodeName, subNode);
|
|
371
|
+
break;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
break;
|
|
375
|
+
case "ExtendedData":
|
|
376
|
+
break;
|
|
377
|
+
default:
|
|
378
|
+
console.log("Unknown node in kml placemark: "+node.nodeName, node);
|
|
379
|
+
break;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
if (geom)
|
|
383
|
+
{
|
|
384
|
+
var feature = new kml.Placemark(geom);
|
|
385
|
+
if (name)
|
|
386
|
+
feature.setName(name);
|
|
387
|
+
if (description)
|
|
388
|
+
feature.setDescription(description);
|
|
389
|
+
if (snippet)
|
|
390
|
+
feature.setSnippet(snippet);
|
|
391
|
+
if (style)
|
|
392
|
+
feature.setStyle(style);
|
|
393
|
+
if (visibility != null)
|
|
394
|
+
feature.setVisibility(visibility);
|
|
395
|
+
return feature;
|
|
396
|
+
}
|
|
397
|
+
return null;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
function parseKMLNode(kmlNode, doc)
|
|
401
|
+
{
|
|
402
|
+
switch (kmlNode.nodeName)
|
|
403
|
+
{
|
|
404
|
+
case "Folder":
|
|
405
|
+
return parseKMLContainer(new kml.Folder(), kmlNode, doc);
|
|
406
|
+
case "Document":
|
|
407
|
+
return parseKMLContainer(new kml.Document(), kmlNode, doc);
|
|
408
|
+
case "Placemark":
|
|
409
|
+
return parseKMLPlacemark(kmlNode, doc);
|
|
410
|
+
default:
|
|
411
|
+
console.log("Unknown kml node: "+kmlNode.nodeName, kmlNode);
|
|
412
|
+
return null;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
export function parseXML(txt)
|
|
417
|
+
{
|
|
418
|
+
var parser = new DOMParser();
|
|
419
|
+
var xmlDoc = parser.parseFromString(txt, "application/xml");
|
|
420
|
+
var xmlRoot;
|
|
421
|
+
for (xmlRoot of xmlDoc.childNodes)
|
|
422
|
+
{
|
|
423
|
+
switch (xmlRoot.nodeName)
|
|
424
|
+
{
|
|
425
|
+
case "#comment":
|
|
426
|
+
break;
|
|
427
|
+
default:
|
|
428
|
+
if (xmlRoot.nodeName == "kml")
|
|
429
|
+
{
|
|
430
|
+
var kmlNode;
|
|
431
|
+
for (kmlNode of xmlRoot.childNodes)
|
|
432
|
+
{
|
|
433
|
+
if (kmlNode.nodeName != "#text")
|
|
434
|
+
return parseKMLNode(kmlNode);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
else
|
|
438
|
+
{
|
|
439
|
+
console.log("Xml file format not supported", xmlRoot.nodeName);
|
|
440
|
+
}
|
|
441
|
+
break;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
return null;
|
|
445
|
+
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
export async function parseFile(file)
|
|
449
|
+
{
|
|
450
|
+
if (file.type == "application/vnd.google-earth.kml+xml")
|
|
451
|
+
{
|
|
452
|
+
return parseXML(await file.text());
|
|
453
|
+
}
|
|
454
|
+
else
|
|
455
|
+
{
|
|
456
|
+
console.log("Unsupported file type", file.type);
|
|
457
|
+
return null;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
|
package/text.d.ts
CHANGED
|
@@ -4,4 +4,5 @@ export function toJSText(s: string): string;
|
|
|
4
4
|
export function toXMLText(s: string): string;
|
|
5
5
|
export function toAttrText(s: string): string;
|
|
6
6
|
export function toHTMLText(s: string): string;
|
|
7
|
-
export function bracketToHTML(s: string): string;
|
|
7
|
+
export function bracketToHTML(s: string): string;
|
|
8
|
+
export function arrayToNumbers(arr: string[]): number[];
|
package/text.js
CHANGED
|
@@ -174,4 +174,15 @@ export function bracketToHTML(s)
|
|
|
174
174
|
s = s.substring(0, i)+"<i>"+s.substring(i + 3, j)+"</i>"+s.substring(j + 4);
|
|
175
175
|
}
|
|
176
176
|
return s;
|
|
177
|
-
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export function arrayToNumbers(arr)
|
|
180
|
+
{
|
|
181
|
+
var ret = [];
|
|
182
|
+
var i;
|
|
183
|
+
for (i in arr)
|
|
184
|
+
{
|
|
185
|
+
ret.push(Number.parseFloat(arr[i]));
|
|
186
|
+
}
|
|
187
|
+
return ret;
|
|
188
|
+
}
|