@wemap/routers 11.3.0 → 11.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -582,91 +582,53 @@ const _OsmGraph = class extends GeoGraph {
582
582
  return super.getEdgeByName(name);
583
583
  }
584
584
  static fromOsmModel(osmModel, waySelectionFilter = DEFAULT_WAY_SELECTOR) {
585
- const vertices = [];
585
+ const nodes = [];
586
586
  const edges = [];
587
- const elevatorVertices = [];
588
- const getOrCreateVertex = (osmNode, forceLevel = null) => {
589
- let vertex = vertices.find(
590
- (vertex2) => vertex2.data.id === osmNode.id && (forceLevel !== null ? Level.intersect(vertex2.coords.level, forceLevel) : true)
591
- ) || null;
592
- if (vertex) {
593
- return vertex;
594
- }
595
- if (vertices.find((v) => v.data.id === osmNode.id)) {
596
- throw `An error occured because repeat_on as not been set on node ${osmNode.coords} for level ${forceLevel}`;
597
- }
598
- let levelsToGenerate = [null];
599
- if ("level" in osmNode.tags) {
600
- levelsToGenerate = [osmNode.coords.level];
601
- if ("repeat_on" in osmNode.tags) {
602
- levelsToGenerate.push(...osmNode.tags.repeat_on.split(";").map(Level.fromString));
587
+ const nodesCreated = {};
588
+ const elevatorNodes = [];
589
+ const getOrCreateNode = (osmNode) => {
590
+ let node = nodesCreated[osmNode.id];
591
+ if (!node) {
592
+ node = new GeoGraphVertex(osmNode.coords, { data: osmNode, name: osmNode.tags.name });
593
+ nodesCreated[osmNode.id] = node;
594
+ nodes.push(node);
595
+ if (osmNode.tags.highway === "elevator") {
596
+ elevatorNodes.push(node);
603
597
  }
604
- } else if (forceLevel !== null) {
605
- levelsToGenerate = [forceLevel];
606
598
  }
607
- levelsToGenerate.forEach((level) => {
608
- const newVertex = new GeoGraphVertex(osmNode.coords.clone(), { data: osmNode, name: osmNode.tags.name });
609
- newVertex.coords.level = level;
610
- vertices.push(newVertex);
611
- if (Level.intersect(newVertex.coords.level, forceLevel) || forceLevel === null && "level" in osmNode.tags) {
612
- vertex = newVertex;
613
- }
614
- });
615
- if (osmNode.tags.highway === "elevator" && vertex) {
616
- elevatorVertices.push(vertex);
617
- }
618
- return vertex;
599
+ return node;
619
600
  };
620
601
  osmModel.ways.forEach((way) => {
621
602
  if (!waySelectionFilter(way)) {
622
603
  return;
623
604
  }
624
- let levelsToGenerate = [null];
625
- if ("level" in way.tags) {
626
- levelsToGenerate = [way.level];
627
- if ("repeat_on" in way.tags) {
628
- levelsToGenerate.push(...way.tags.repeat_on.split(";").map(Level.fromString));
629
- }
605
+ let firstNode = getOrCreateNode(way.nodes[0]);
606
+ for (let i = 1; i < way.nodes.length; i++) {
607
+ const secondNode = getOrCreateNode(way.nodes[i]);
608
+ const edge = new GeoGraphEdge(
609
+ firstNode,
610
+ secondNode,
611
+ { data: way, name: way.tags.name, level: way.level }
612
+ );
613
+ _OsmGraph.manageOneWay(edge, way);
614
+ edges.push(edge);
615
+ firstNode = secondNode;
630
616
  }
631
- levelsToGenerate.forEach((level) => {
632
- let firstVertex = getOrCreateVertex(way.nodes[0], level);
633
- for (let i = 1; i < way.nodes.length; i++) {
634
- const secondVertex = getOrCreateVertex(way.nodes[i], level);
635
- const edge = new GeoGraphEdge(
636
- firstVertex,
637
- secondVertex,
638
- { data: way, name: way.tags.name, level }
639
- );
640
- _OsmGraph.manageOneWay(edge, way);
641
- edges.push(edge);
642
- firstVertex = secondVertex;
643
- }
644
- });
645
617
  });
646
618
  osmModel.ways.filter((way) => way.isElevator).forEach((way) => {
647
- const entryVertices = way.nodes.map((node) => vertices.filter((v) => v.data.id === node.id)).flat();
648
- const elevatorLevel = entryVertices.reduce((acc, v) => Level.union(acc, v.coords.level), null);
649
- const elevatorCenter = way.nodes.reduce((acc, node) => [acc[0] + node.coords.lat, acc[1] + node.coords.lng], [0, 0]).map((val) => val / way.nodes.length);
650
- const elevatorCenterCoords = new Coordinates(elevatorCenter[0], elevatorCenter[1], null, elevatorLevel);
651
- const elevatorCenterVertex = new GeoGraphVertex(elevatorCenterCoords, { data: way, name: way.tags.name });
652
- vertices.push(elevatorCenterVertex);
653
- entryVertices.forEach((entryVertex) => {
654
- const newEdge = new GeoGraphEdge(
655
- elevatorCenterVertex,
656
- entryVertex,
657
- {
658
- level: Level.intersection(elevatorCenterVertex.coords.level, entryVertex.coords.level),
659
- data: way
660
- }
661
- );
662
- edges.push(newEdge);
619
+ way.nodes.forEach((node) => {
620
+ const connectedWays = node.ways.filter((otherWay) => otherWay != way);
621
+ if (connectedWays.length) {
622
+ const graphVertex = getOrCreateNode(node);
623
+ graphVertex.data.tags.highway = "elevator";
624
+ elevatorNodes.push(graphVertex);
625
+ }
663
626
  });
664
- elevatorVertices.push(elevatorCenterVertex);
665
627
  });
666
- elevatorVertices.forEach((node) => {
667
- _OsmGraph.createNodesAndEdgesFromElevator(vertices, edges, node);
628
+ elevatorNodes.forEach((node) => {
629
+ _OsmGraph.createNodesAndEdgesFromElevator(nodes, edges, node);
668
630
  });
669
- return new _OsmGraph(vertices, edges, true);
631
+ return new _OsmGraph(nodes, edges, true);
670
632
  }
671
633
  static manageOneWay(edge, way) {
672
634
  const { highway, oneway, conveying } = way.tags;
@@ -677,52 +639,53 @@ const _OsmGraph = class extends GeoGraph {
677
639
  edge.vertex2 = tmpNode;
678
640
  }
679
641
  }
680
- static createNodesAndEdgesFromElevator(vertices, edges, elevatorVertex) {
681
- const createdVertices = [];
642
+ static createNodesAndEdgesFromElevator(nodes, edges, elevatorNode) {
643
+ const createdNodes = [];
682
644
  const getOrCreateLevelVertex = (level) => {
683
- let levelVertex = createdVertices.find(({ coords }) => Level.equals(level, coords.level));
645
+ let levelVertex = createdNodes.find(({ coords }) => Level.equals(level, coords.level));
684
646
  if (!levelVertex) {
685
- levelVertex = new GeoGraphVertex(elevatorVertex.coords.clone(), {
686
- data: elevatorVertex.data,
687
- name: `${elevatorVertex.name} (elevator lvl: ${level})`
647
+ levelVertex = new GeoGraphVertex(elevatorNode.coords.clone(), {
648
+ data: elevatorNode.data,
649
+ name: `${elevatorNode.name} (elevator lvl: ${level})`
688
650
  });
689
651
  levelVertex.coords.level = level;
690
- createdVertices.push(levelVertex);
691
- vertices.push(levelVertex);
652
+ createdNodes.push(levelVertex);
653
+ nodes.push(levelVertex);
692
654
  }
693
655
  return levelVertex;
694
656
  };
695
- elevatorVertex.edges.forEach((edge) => {
657
+ elevatorNode.edges.forEach((edge) => {
696
658
  if (Level.isRange(edge.level)) {
697
659
  throw new Error("Cannot handle this elevator edge due to ambiguity");
698
660
  }
699
661
  const levelVertex = getOrCreateLevelVertex(edge.level);
700
- if (edge.vertex1 === elevatorVertex) {
662
+ if (edge.vertex1 === elevatorNode) {
701
663
  edge.vertex1 = levelVertex;
702
664
  } else {
703
665
  edge.vertex2 = levelVertex;
704
666
  }
667
+ levelVertex.edges.push(edge);
705
668
  });
706
- for (let i = 0; i < createdVertices.length; i++) {
707
- for (let j = i + 1; j < createdVertices.length; j++) {
708
- const createdVertex1 = createdVertices[i];
709
- const createdVertex2 = createdVertices[j];
710
- if (createdVertex1.coords.level === null || createdVertex2.coords.level === null) {
669
+ for (let i = 0; i < createdNodes.length; i++) {
670
+ for (let j = i + 1; j < createdNodes.length; j++) {
671
+ const createdNode1 = createdNodes[i];
672
+ const createdNode2 = createdNodes[j];
673
+ if (createdNode1.coords.level === null || createdNode2.coords.level === null) {
711
674
  continue;
712
675
  }
713
- const minLevel = Math.min(createdVertex1.coords.level, createdVertex2.coords.level);
714
- const maxLevel = Math.max(createdVertex1.coords.level, createdVertex2.coords.level);
676
+ const minLevel = Math.min(createdNode1.coords.level, createdNode2.coords.level);
677
+ const maxLevel = Math.max(createdNode1.coords.level, createdNode2.coords.level);
715
678
  const newEdge = new GeoGraphEdge(
716
- createdVertex1,
717
- createdVertex2,
718
- { data: elevatorVertex.data, name: elevatorVertex.name, level: [minLevel, maxLevel] }
679
+ createdNode1,
680
+ createdNode2,
681
+ { data: elevatorNode.data, name: elevatorNode.name, level: [minLevel, maxLevel] }
719
682
  );
720
683
  edges.push(newEdge);
721
684
  }
722
685
  }
723
- const elevatorNodeIndex = vertices.indexOf(elevatorVertex);
686
+ const elevatorNodeIndex = nodes.indexOf(elevatorNode);
724
687
  if (elevatorNodeIndex > -1) {
725
- vertices.splice(elevatorNodeIndex, 1);
688
+ nodes.splice(elevatorNodeIndex, 1);
726
689
  }
727
690
  }
728
691
  };
@@ -882,9 +845,9 @@ const _WemapOsmRouter = class extends GeoGraphRouter {
882
845
  return false;
883
846
  if (typeof (options == null ? void 0 : options.useStairs) !== "undefined" && !(options == null ? void 0 : options.useStairs) && edge.data instanceof OsmWay && edge.data.areStairs && !edge.data.isConveying)
884
847
  return false;
885
- if (typeof (options == null ? void 0 : options.useEscalator) !== "undefined" && !(options == null ? void 0 : options.useEscalator) && edge.data instanceof OsmWay && edge.data.areStairs && edge.data.isConveying)
848
+ if (typeof (options == null ? void 0 : options.useEscalators) !== "undefined" && !(options == null ? void 0 : options.useEscalators) && edge.data instanceof OsmWay && edge.data.areStairs && edge.data.isConveying)
886
849
  return false;
887
- if (typeof (options == null ? void 0 : options.useElevator) !== "undefined" && !(options == null ? void 0 : options.useElevator) && ((_c = edge.data) == null ? void 0 : _c.isElevator))
850
+ if (typeof (options == null ? void 0 : options.useElevators) !== "undefined" && !(options == null ? void 0 : options.useElevators) && ((_c = edge.data) == null ? void 0 : _c.isElevator))
888
851
  return false;
889
852
  return true;
890
853
  };