173 lines
3.9 KiB
JavaScript
173 lines
3.9 KiB
JavaScript
'use strict';
|
|
|
|
const builder = require('xmlbuilder');
|
|
const ensureDecimal = require('./utils').ensureDecimal;
|
|
|
|
class DB {
|
|
constructor () {
|
|
this.nodes = new Array();
|
|
this.ways = new Array();
|
|
this.relations = new Array();
|
|
}
|
|
|
|
addNode (node) {
|
|
this.nodes.push(node);
|
|
}
|
|
|
|
addWay (way) {
|
|
this.ways.push(way);
|
|
}
|
|
|
|
addRelation (relation) {
|
|
this.relations.push(relation);
|
|
}
|
|
|
|
clear () {
|
|
this.nodes = [];
|
|
this.ways = [];
|
|
this.relations = [];
|
|
}
|
|
|
|
toXML (callback) {
|
|
var xml = builder.create('osm', {'encoding':'UTF-8'});
|
|
xml.att('generator', 'osrm-test')
|
|
.att('version', '0.6');
|
|
|
|
this.nodes.forEach((n) => {
|
|
var node = xml.ele('node', {
|
|
id: n.id,
|
|
version: 1,
|
|
uid: n.OSM_UID,
|
|
user: n.OSM_USER,
|
|
timestamp: n.OSM_TIMESTAMP,
|
|
lon: ensureDecimal(n.lon),
|
|
lat: ensureDecimal(n.lat)
|
|
});
|
|
|
|
for (var k in n.tags) {
|
|
node.ele('tag')
|
|
.att('k', k)
|
|
.att('v', n.tags[k]);
|
|
}
|
|
});
|
|
|
|
this.ways.forEach((w) => {
|
|
var way = xml.ele('way', {
|
|
id: w.id,
|
|
version: 1,
|
|
uid: w.OSM_UID,
|
|
user: w.OSM_USER,
|
|
timestamp: w.OSM_TIMESTAMP
|
|
});
|
|
|
|
w.nodes.forEach((k) => {
|
|
|
|
let nd = way.ele('nd')
|
|
.att('ref', k.id);
|
|
if (w.add_locations) {
|
|
nd.att('lon', k.lon);
|
|
nd.att('lat', k.lat);
|
|
}
|
|
});
|
|
|
|
for (var k in w.tags) {
|
|
way.ele('tag')
|
|
.att('k', k)
|
|
.att('v', w.tags[k]);
|
|
}
|
|
});
|
|
|
|
this.relations.forEach((r) => {
|
|
var relation = xml.ele('relation', {
|
|
id: r.id,
|
|
user: r.OSM_USER,
|
|
timestamp: r.OSM_TIMESTAMP,
|
|
uid: r.OSM_UID
|
|
});
|
|
|
|
r.members.forEach((m) => {
|
|
var d = {
|
|
type: m.type,
|
|
ref: m.id
|
|
};
|
|
if (m.role) d.role = m.role;
|
|
relation.ele('member', d);
|
|
});
|
|
|
|
for (var k in r.tags) {
|
|
relation.ele('tag')
|
|
.att('k', k)
|
|
.att('v', r.tags[k]);
|
|
}
|
|
});
|
|
|
|
callback(xml.end({ pretty: true, indent: ' ' }));
|
|
}
|
|
}
|
|
|
|
class Node {
|
|
constructor (id, OSM_USER, OSM_TIMESTAMP, OSM_UID, lon, lat, tags) {
|
|
this.id = id;
|
|
this.OSM_USER = OSM_USER;
|
|
this.OSM_TIMESTAMP = OSM_TIMESTAMP;
|
|
this.OSM_UID = OSM_UID;
|
|
this.lon = lon;
|
|
this.lat = lat;
|
|
this.tags = tags;
|
|
}
|
|
|
|
addTag (k, v) {
|
|
this.tags[k] = v;
|
|
}
|
|
|
|
setID (id ) {
|
|
this.id = id;
|
|
}
|
|
}
|
|
|
|
class Way {
|
|
constructor (id, OSM_USER, OSM_TIMESTAMP, OSM_UID, add_locations) {
|
|
this.id = id;
|
|
this.OSM_USER = OSM_USER;
|
|
this.OSM_TIMESTAMP = OSM_TIMESTAMP;
|
|
this.OSM_UID = OSM_UID;
|
|
this.tags = {};
|
|
this.nodes = [];
|
|
this.add_locations = add_locations;
|
|
}
|
|
|
|
addNode (node) {
|
|
this.nodes.push(node);
|
|
}
|
|
|
|
setTags (tags) {
|
|
this.tags = tags;
|
|
}
|
|
}
|
|
|
|
class Relation {
|
|
constructor (id, OSM_USER, OSM_TIMESTAMP, OSM_UID) {
|
|
this.id = id;
|
|
this.OSM_USER = OSM_USER;
|
|
this.OSM_TIMESTAMP = OSM_TIMESTAMP;
|
|
this.OSM_UID = OSM_UID;
|
|
this.members = [];
|
|
this.tags = {};
|
|
}
|
|
|
|
addMember (memberType, id, role) {
|
|
this.members.push({type: memberType, id: id, role: role});
|
|
}
|
|
|
|
addTag (k, v) {
|
|
this.tags[k] = v;
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
DB: DB,
|
|
Node: Node,
|
|
Way: Way,
|
|
Relation: Relation
|
|
};
|