UNPKG

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
'use strict'; 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;