Add export as GeoJson (#10)

pull/108/head
Candid Dauth 2017-03-04 22:27:32 +01:00
rodzic 2ac20fac8b
commit 7c9f871727
5 zmienionych plików z 115 dodań i 7 usunięć

Wyświetl plik

@ -39,8 +39,9 @@
<ul uib-dropdown-menu aria-labelledby="toolbox-layers-dropdown" class="dropdown-menu-right">
<!--<li ng-if="!readonly"><a href="javascript:" ng-click="openDialog('copy-pad-dialog')">Copy pad</a></li>-->
<li><a href="javascript:" ng-click="importFile()">Import file</a></li>
<li ng-if="padId"><a href="{{padData.id}}/gpx?useTracks=1">Export as GPX (tracks)</a></li>
<li ng-if="padId"><a href="{{padData.id}}/gpx?useTracks=0">Export as GPX (routes)</a></li>
<li ng-if="padId"><a href="{{padData.id}}/geojson" uib-tooltip="GeoJSON files store all map information and can thus be used for map backups and be re-imported without any loss." tooltip-placement="left">Export as GeoJSON</a></li>
<li ng-if="padId"><a href="{{padData.id}}/gpx?useTracks=1" uib-tooltip="GPX files can be opened with most navigation software. In track mode, any calculated routes are saved in the file." tooltip-placement="left">Export as GPX (tracks)</a></li>
<li ng-if="padId"><a href="{{padData.id}}/gpx?useTracks=0" uib-tooltip="GPX files can be opened with most navigation software. In route mode, only the start/end/via points are saved in the file, and the navigation software needs to recalculate the routes." tooltip-placement="left">Export as GPX (routes)</a></li>
<li ng-if="padId"><a href="{{padData.id}}/table" target="_blank">Export as table</a></li>
<li ng-if="padId" role="separator" class="divider"></li>
<li ng-if="padId"><a href="javascript:" ng-click="filter()">Filter</a></li>

Wyświetl plik

@ -0,0 +1,82 @@
const utils = require("../utils");
const geojson = module.exports = {
exportGeoJson(database, padId) {
let ret = {
type: "FeatureCollection",
features: [],
facilmap: {}
};
return utils.promiseAuto({
padData: database.getPadData(padId).then(padData => {
if(padData.defaultView)
ret.bbox = [padData.defaultView.left, padData.defaultView.bottom, padData.defaultView.right, padData.defaultView.top];
Object.assign(ret.facilmap, {
name: padData.name,
searchEngines: padData.searchEngines,
description: padData.description,
clusterMarkers: padData.clusterMarkers
});
}),
views: () => {
ret.facilmap.views = [];
return utils.streamEachPromise(database.getViews(padId), (view) => {
ret.facilmap.views.push(view);
});
},
types: () => {
ret.facilmap.types = [];
return utils.streamEachPromise(database.getTypes(padId), function(type) {
ret.facilmap.types.push(type);
});
},
markers: () => {
return utils.streamEachPromise(database.getPadMarkers(padId), function(marker) {
ret.features.push({
type: "Feature",
geometry: {
type: "Point",
coordinates: [marker.lon, marker.lat]
},
properties: {
name: marker.name,
colour: marker.colour,
size: marker.size,
symbol: marker.symbol,
data: JSON.parse(JSON.stringify(marker.data)),
type: marker.typeId
}
});
});
},
lines: () => {
return utils.streamEachPromise(database.getPadLinesWithPoints(padId), function(line) {
ret.features.push({
type: "Feature",
geometry: {
type: "LineString",
coordinates: line.trackPoints.map((trackPoint) => [trackPoint.lon, trackPoint.lat])
},
properties: {
name: line.name,
mode: line.mode,
colour: line.colour,
width: line.width,
distance: line.distance,
time: line.time,
data: line.data,
routePoints: line.routePoints,
type: line.typeId
}
});
});
}
}).then(() => ret);
}
};

Wyświetl plik

@ -34,6 +34,7 @@
"event-stream": "^3.3.4",
"express": "^4.14.0",
"facilmap-frontend": "^2.3.3",
"json-format": "^1.0.0",
"mysql": "^2.13.0",
"request": "^2.75.0",
"request-promise": "^4.1.1",

Wyświetl plik

@ -3,10 +3,12 @@ const ejs = require("ejs");
const express = require("express");
const fs = require("fs");
const http = require("http");
const jsonFormat = require("json-format");
const path = require("path");
const Promise = require("bluebird");
const database = require("./database/database");
const geojson = require("./export/geojson");
const gpx = require("./export/gpx");
const table = require("./export/table");
const utils = require("./utils");
@ -101,6 +103,24 @@ const webserver = {
}).catch(next);
});
app.get("/:padId/geojson", function(req, res, next) {
utils.promiseAuto({
padData: database.getPadData(req.params.padId).then((padData) => {
if(!padData)
throw new Error(`Map with ID ${req.params.padId} could not be found.`);
return padData;
}),
geojson: () => {
return geojson.exportGeoJson(database, req.params.padId);
},
response: (padData, geojson) => {
res.set("Content-type", "application/geo+json");
res.attachment(padData.name.replace(/[\\\/:*?"<>|]+/g, '_') + ".geojson");
res.send(jsonFormat(geojson));
}
}).catch(next);
});
let server = http.createServer(app);
return Promise.promisify(server.listen.bind(server))(port, host).then(() => server);
},

Wyświetl plik

@ -254,14 +254,14 @@ block-stream@*:
dependencies:
inherits "~2.0.0"
bluebird@^3.3.4, bluebird@^3.4.1, bluebird@^3.4.6, bluebird@~3.4.1:
version "3.4.7"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3"
bluebird@^3.5.0:
bluebird@^3.3.4, bluebird@^3.4.1, bluebird@^3.4.6, bluebird@^3.5.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c"
bluebird@~3.4.1:
version "3.4.7"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3"
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
version "4.11.6"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215"
@ -1559,6 +1559,10 @@ jsbn@~0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd"
json-format@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/json-format/-/json-format-1.0.0.tgz#ada0d7938f15e3103dbd2b8c94733a4c404b73f1"
json-loader@^0.5.4:
version "0.5.4"
resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.4.tgz#8baa1365a632f58a3c46d20175fc6002c96e37de"