-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.js
125 lines (114 loc) · 3.35 KB
/
main.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*jshint esversion: 10*/
import GpxParser from 'gpx-parser-ts';
import xml2js from 'xml2js';
import { getBoundingBox } from './gpx_box.js';
import { findWater, findCemetery, findShops, findShelter, findTanke, findToilets, findFood, findCamping, findRepair } from './overpass.js';
async function make_kml_document(folder, name, func, open = '1') {
console.log(`fetch ${name}`);
let data;
try {
data = await func();
} catch(e) {
console.log(`... failed: ${e}`);
return;
}
let doc = {
'name': {_: 'POIs: ' + name},
// try to control default display in app if possible
// (not all apps support his)
'visibility': {_: open},
'open': {_: open},
'Placemark': [],
};
for(const point of data) {
doc.Placemark.push({
'name': {_: point.name},
'description': {_: point.text},
'Point': {'coordinates': {_: `${point.lon},${point.lat},0`}}
});
}
folder.Document.push(doc);
console.log(`... found: ${data.length}`);
}
export async function process_gpx_string(input, filename, opt) {
console.log(`Parse Input ${filename}`);
const parser = GpxParser.default ? new GpxParser.default() : new GpxParser();
const gpx = await parser.parse(input);
const multi_trk = gpx.trk.length;
let kml = {
$: {'xmlns': 'http://www.opengis.net/kml/2.2'},
};
if(multi_trk) {
kml.Folder = [];
} else {
kml.Document = [];
}
// might be more than one
for(const trk of gpx.trk) {
const trk_name = trk.name || 'Unnamed';
let points;
if(Array.isArray(trk.trkseg)) {
// might also be more than one
points = [];
for (const seg of trk.trkseg) {
points = points.concat(seg.trkpt);
}
} else {
points = trk.trkseg.trkpt;
}
if(points.length === 0) {
alert('Track without any points? Ignored.');
continue;
}
let boxes = {};
function getBox(size) {
if(!boxes[size]) {
boxes[size] = getBoundingBox(points, size);
}
return boxes[size];
}
let folder;
if(multi_trk) {
// extra sub-folder
folder = {
'name': {_: trk_name},
'open': {_: '1'},
'Document': [],
};
kml.Folder.push(folder);
} else {
// all types are top-level
folder = kml;
}
if(opt.cemetery) {
await make_kml_document(folder, 'Cemetery', () => findCemetery(getBox(opt.cemetery)), '0');
}
if(opt.shelter) {
await make_kml_document(folder, 'Shelter', () => findShelter(getBox(opt.shelter), opt.shelterFilter), '0');
}
if(opt.toilet) {
await make_kml_document(folder, 'Toilets', () => findToilets(getBox(opt.toilet), opt.toiletFilter));
}
if(opt.water) {
await make_kml_document(folder, 'Water', () => findWater(getBox(opt.water), opt.waterFilter));
}
if(opt.gas) {
await make_kml_document(folder, '24h Fuel', () => findTanke(getBox(opt.gas)));
}
if(opt.shop) {
await make_kml_document(folder, 'Shops', () => findShops(getBox(opt.shop), opt.shopFilter));
}
if(opt.food) {
await make_kml_document(folder, 'Food', () => findFood(getBox(opt.food), opt.foodFilter));
}
if(opt.camping) {
await make_kml_document(folder, 'Camping', () => findCamping(getBox(opt.camping)), '0');
}
if(opt.bicycle_shop) {
await make_kml_document(folder, 'Bicycle Shop', () => findRepair(getBox(opt.bicycle_shop)), '0');
}
}
console.log('Write Output');
const builder = new xml2js.Builder({rootName: 'kml'});
return builder.buildObject(kml);
}