facilmap/server/export/gpx.js

108 wiersze
3.3 KiB
JavaScript
Czysty Zwykły widok Historia

var utils = require("../utils");
2016-09-28 12:10:08 +00:00
var _e = utils.escapeXml;
function _dataToText(fields, data) {
if(fields.length == 1 && fields[0].name == "Description")
return data["Description"] || "";
2016-09-28 12:10:08 +00:00
var text = [ ];
for(var i=0; i<fields.length; i++) {
text.push(fields[i].name + ": " + (data[fields[i].name] || ""));
2016-09-28 12:10:08 +00:00
}
return text.join('\n\n');
}
function _textToData(fields, text) {
function hasField(fieldName) {
for(var i=0; i<fields.length; i++) {
if(fields[i].name == fieldName)
return true;
}
return false;
}
var textSplit = text.replace(/\r/g, '').split('\n\n');
var ret = { };
var lastField = null;
for(var i=0; i<textSplit.length; i++) {
if(textSplit[i].indexOf(': ') != -1) {
var spl = textSplit[i].split(': ', 2);
if(hasField(spl[0])) {
lastField = spl[0];
ret[lastField] = spl[1];
continue;
}
}
if(lastField == null) {
lastField = 'Description';
ret[lastField] = textSplit[i];
} else {
ret[lastField] += '\n\n' + textSplit[i];
}
}
return ret;
}
2016-10-30 14:01:21 +00:00
function exportGpx(database, padId, useTracks) {
return utils.promiseAuto({
padData: database.getPadData(padId),
typesObj: () => {
var typesObj = { };
return utils.streamEachPromise(database.getTypes(padId), function(type) {
typesObj[type.id] = type;
}).then(() => typesObj);
},
markers: (typesObj) => {
var markers = '';
return utils.streamEachPromise(database.getPadMarkers(padId), function(marker) {
markers += '<wpt lat="' + _e(marker.lat) + '" lon="' + _e(marker.lon) + '"' + (marker.ele != null ? ' ele="' + _e(marker.ele) + '"' : '') + '>\n' +
2016-09-28 12:10:08 +00:00
'\t<name>' + _e(marker.name) + '</name>\n' +
'\t<desc>' + _e(_dataToText(typesObj[marker.typeId].fields, marker.data)) + '</desc>\n' +
2016-09-28 12:10:08 +00:00
'</wpt>\n';
2016-10-30 14:01:21 +00:00
}).then(() => markers);
},
lines: (typesObj) => {
var lines = '';
return utils.streamEachPromise(database.getPadLinesWithPoints(padId), function(line) {
2016-09-28 12:10:08 +00:00
var t = (useTracks || line.mode == "track");
lines += '<' + (t ? 'trk' : 'rte') + '>\n' +
'\t<name>' + _e(line.name) + '</name>\n' +
'\t<desc>' + _e(_dataToText(typesObj[line.typeId].fields, line.data)) + '</desc>\n';
2016-09-28 12:10:08 +00:00
if(t) {
lines += '\t<trkseg>\n';
for(var i=0; i<line.trackPoints.length; i++) {
lines += '\t\t<trkpt lat="' + _e(line.trackPoints[i].lat) + '" lon="' + _e(line.trackPoints[i].lon) + '"' + (line.trackPoints[i].ele != null ? ' ele="' + _e(line.trackPoints[i].ele) + '"' : '') + ' />\n';
2016-09-28 12:10:08 +00:00
}
lines += '\t</trkseg>\n';
} else {
for(var i=0; i<line.routePoints.length; i++) {
lines += '\t\t<rtept lat="' + _e(line.routePoints[i].lat) + '" lon="' + _e(line.trackPoints[i].lon) + '" />\n';
}
}
lines += '</' + (t ? 'trk' : 'rte') + '>\n';
2016-10-30 14:01:21 +00:00
}).then(() => lines);
}
}).then((res) => '<?xml version="1.0" encoding="UTF-8"?>\n' +
'<gpx xmlns="http://www.topografix.com/GPX/1/1" creator="FacilMap" version="1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd" xmlns:fm="https://facilmap.org/">\n' +
2016-10-30 14:01:21 +00:00
'\t<metadata>\n' +
'\t\t<name>' + _e(res.padData.name) + '</name>\n' +
'\t\t<time>' + _e(utils.isoDate()) + '</time>\n' +
'\t</metadata>\n' +
res.markers.replace(/^(.)/gm, '\t$1') +
res.lines.replace(/^(.)/gm, '\t$1') +
'</gpx>'
);
2016-09-28 12:10:08 +00:00
}
module.exports = {
exportGpx : exportGpx
};