atriusmaps-node-sdk
Version:
This project provides an API to Atrius Personal Wayfinder maps within a Node environment. See the README.md for more information
92 lines (86 loc) • 3.23 kB
JavaScript
;
var R = require('ramda');
function _interopNamespaceDefault(e) {
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n.default = e;
return Object.freeze(n);
}
var R__namespace = /*#__PURE__*/_interopNamespaceDefault(R);
function visitAll(nodes, startingNode) {
const nodes2visit = [startingNode];
const vnodes = /* @__PURE__ */ new Set();
while (nodes2visit.length) {
const node = nodes2visit.splice(0, 1)[0];
if (node && !vnodes.has(node)) {
vnodes.add(node);
node.edges.forEach((edge) => {
if (!vnodes.has(nodes[edge.dst])) {
nodes2visit.push(nodes[edge.dst]);
}
});
}
}
return vnodes;
}
function orphanTest(nodes, startingNode) {
const nodesArray = Object.values(nodes);
const vnodes = visitAll(nodes, startingNode || nodesArray[0]);
const onodes = nodesArray.filter((n) => !vnodes.has(n));
console.log(`${onodes.length} Orphaned nodes found from ${nodesArray.length} total`);
return {
orphaned: onodes,
orphanedByFloor: R__namespace.groupBy((n) => n.floorId, onodes),
connected: Array.from(vnodes)
};
}
const enrichDebugNavGraph = (nodes) => ({
nodes: toOrphanedNodesArray(nodes),
edges: getNavEdgeFeatures(nodes)
});
const transformNodes = (isOrphaned) => R__namespace.map(R__namespace.pipe(R__namespace.assoc("isOrphaned", isOrphaned), R__namespace.dissoc("edges")));
const toOrphanedNodesArray = R__namespace.pipe(
orphanTest,
R__namespace.pick(["connected", "orphaned"]),
R__namespace.evolve({
connected: transformNodes(false),
orphaned: transformNodes(true)
}),
R__namespace.values,
R__namespace.flatten
);
const getNavEdgeFeatures = (nodes) => Object.values(nodes).flatMap((node) => node.edges).map((edge) => mapEdge(edge, nodes));
const mapEdge = ({ src, dst, type, isDriveway }, nodeMap) => ({
startCoordinates: [nodeMap[src].lng, nodeMap[src].lat],
endCoordinates: [nodeMap[dst].lng, nodeMap[dst].lat],
isDriveway,
ordinal: nodeMap[src].ordinal,
category: getEdgeCategory(type),
defaultStrokeColor: getStrokeColorForMissingCategory(type)
});
const getStrokeColorForMissingCategory = R__namespace.cond([
[R__namespace.equals("Stairs"), R__namespace.always("#EFBC9B")],
[R__namespace.equals("Elevator"), R__namespace.always("#A491D3")],
[R__namespace.equals("Escalator"), R__namespace.always("#563F1B")],
[R__namespace.equals("Ramp"), R__namespace.always("#DBD053")],
[R__namespace.T, R__namespace.always("#FF0000")]
]);
const getEdgeCategory = R__namespace.cond([
[R__namespace.equals("Train"), R__namespace.always("nav.train")],
[R__namespace.equals("Bus"), R__namespace.always("nav.transit")],
[R__namespace.equals("Security Checkpoint"), R__namespace.always("nav.secure")],
[R__namespace.equals("Ground"), R__namespace.always("nav.primary")],
[R__namespace.T, R__namespace.always("")]
]);
exports.enrichDebugNavGraph = enrichDebugNavGraph;
exports.orphanTest = orphanTest;