@wemap/routers 11.3.0 → 11.3.1

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.js CHANGED
@@ -590,91 +590,53 @@ const _OsmGraph = class extends geo.GeoGraph {
590
590
  return super.getEdgeByName(name);
591
591
  }
592
592
  static fromOsmModel(osmModel, waySelectionFilter = DEFAULT_WAY_SELECTOR) {
593
- const vertices = [];
593
+ const nodes = [];
594
594
  const edges = [];
595
- const elevatorVertices = [];
596
- const getOrCreateVertex = (osmNode, forceLevel = null) => {
597
- let vertex = vertices.find(
598
- (vertex2) => vertex2.data.id === osmNode.id && (forceLevel !== null ? geo.Level.intersect(vertex2.coords.level, forceLevel) : true)
599
- ) || null;
600
- if (vertex) {
601
- return vertex;
602
- }
603
- if (vertices.find((v) => v.data.id === osmNode.id)) {
604
- throw `An error occured because repeat_on as not been set on node ${osmNode.coords} for level ${forceLevel}`;
605
- }
606
- let levelsToGenerate = [null];
607
- if ("level" in osmNode.tags) {
608
- levelsToGenerate = [osmNode.coords.level];
609
- if ("repeat_on" in osmNode.tags) {
610
- levelsToGenerate.push(...osmNode.tags.repeat_on.split(";").map(geo.Level.fromString));
595
+ const nodesCreated = {};
596
+ const elevatorNodes = [];
597
+ const getOrCreateNode = (osmNode) => {
598
+ let node = nodesCreated[osmNode.id];
599
+ if (!node) {
600
+ node = new geo.GeoGraphVertex(osmNode.coords, { data: osmNode, name: osmNode.tags.name });
601
+ nodesCreated[osmNode.id] = node;
602
+ nodes.push(node);
603
+ if (osmNode.tags.highway === "elevator") {
604
+ elevatorNodes.push(node);
611
605
  }
612
- } else if (forceLevel !== null) {
613
- levelsToGenerate = [forceLevel];
614
606
  }
615
- levelsToGenerate.forEach((level) => {
616
- const newVertex = new geo.GeoGraphVertex(osmNode.coords.clone(), { data: osmNode, name: osmNode.tags.name });
617
- newVertex.coords.level = level;
618
- vertices.push(newVertex);
619
- if (geo.Level.intersect(newVertex.coords.level, forceLevel) || forceLevel === null && "level" in osmNode.tags) {
620
- vertex = newVertex;
621
- }
622
- });
623
- if (osmNode.tags.highway === "elevator" && vertex) {
624
- elevatorVertices.push(vertex);
625
- }
626
- return vertex;
607
+ return node;
627
608
  };
628
609
  osmModel.ways.forEach((way) => {
629
610
  if (!waySelectionFilter(way)) {
630
611
  return;
631
612
  }
632
- let levelsToGenerate = [null];
633
- if ("level" in way.tags) {
634
- levelsToGenerate = [way.level];
635
- if ("repeat_on" in way.tags) {
636
- levelsToGenerate.push(...way.tags.repeat_on.split(";").map(geo.Level.fromString));
637
- }
613
+ let firstNode = getOrCreateNode(way.nodes[0]);
614
+ for (let i = 1; i < way.nodes.length; i++) {
615
+ const secondNode = getOrCreateNode(way.nodes[i]);
616
+ const edge = new geo.GeoGraphEdge(
617
+ firstNode,
618
+ secondNode,
619
+ { data: way, name: way.tags.name, level: way.level }
620
+ );
621
+ _OsmGraph.manageOneWay(edge, way);
622
+ edges.push(edge);
623
+ firstNode = secondNode;
638
624
  }
639
- levelsToGenerate.forEach((level) => {
640
- let firstVertex = getOrCreateVertex(way.nodes[0], level);
641
- for (let i = 1; i < way.nodes.length; i++) {
642
- const secondVertex = getOrCreateVertex(way.nodes[i], level);
643
- const edge = new geo.GeoGraphEdge(
644
- firstVertex,
645
- secondVertex,
646
- { data: way, name: way.tags.name, level }
647
- );
648
- _OsmGraph.manageOneWay(edge, way);
649
- edges.push(edge);
650
- firstVertex = secondVertex;
651
- }
652
- });
653
625
  });
654
626
  osmModel.ways.filter((way) => way.isElevator).forEach((way) => {
655
- const entryVertices = way.nodes.map((node) => vertices.filter((v) => v.data.id === node.id)).flat();
656
- const elevatorLevel = entryVertices.reduce((acc, v) => geo.Level.union(acc, v.coords.level), null);
657
- 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);
658
- const elevatorCenterCoords = new geo.Coordinates(elevatorCenter[0], elevatorCenter[1], null, elevatorLevel);
659
- const elevatorCenterVertex = new geo.GeoGraphVertex(elevatorCenterCoords, { data: way, name: way.tags.name });
660
- vertices.push(elevatorCenterVertex);
661
- entryVertices.forEach((entryVertex) => {
662
- const newEdge = new geo.GeoGraphEdge(
663
- elevatorCenterVertex,
664
- entryVertex,
665
- {
666
- level: geo.Level.intersection(elevatorCenterVertex.coords.level, entryVertex.coords.level),
667
- data: way
668
- }
669
- );
670
- edges.push(newEdge);
627
+ way.nodes.forEach((node) => {
628
+ const connectedWays = node.ways.filter((otherWay) => otherWay != way);
629
+ if (connectedWays.length) {
630
+ const graphVertex = getOrCreateNode(node);
631
+ graphVertex.data.tags.highway = "elevator";
632
+ elevatorNodes.push(graphVertex);
633
+ }
671
634
  });
672
- elevatorVertices.push(elevatorCenterVertex);
673
635
  });
674
- elevatorVertices.forEach((node) => {
675
- _OsmGraph.createNodesAndEdgesFromElevator(vertices, edges, node);
636
+ elevatorNodes.forEach((node) => {
637
+ _OsmGraph.createNodesAndEdgesFromElevator(nodes, edges, node);
676
638
  });
677
- return new _OsmGraph(vertices, edges, true);
639
+ return new _OsmGraph(nodes, edges, true);
678
640
  }
679
641
  static manageOneWay(edge, way) {
680
642
  const { highway, oneway, conveying } = way.tags;
@@ -685,52 +647,53 @@ const _OsmGraph = class extends geo.GeoGraph {
685
647
  edge.vertex2 = tmpNode;
686
648
  }
687
649
  }
688
- static createNodesAndEdgesFromElevator(vertices, edges, elevatorVertex) {
689
- const createdVertices = [];
650
+ static createNodesAndEdgesFromElevator(nodes, edges, elevatorNode) {
651
+ const createdNodes = [];
690
652
  const getOrCreateLevelVertex = (level) => {
691
- let levelVertex = createdVertices.find(({ coords }) => geo.Level.equals(level, coords.level));
653
+ let levelVertex = createdNodes.find(({ coords }) => geo.Level.equals(level, coords.level));
692
654
  if (!levelVertex) {
693
- levelVertex = new geo.GeoGraphVertex(elevatorVertex.coords.clone(), {
694
- data: elevatorVertex.data,
695
- name: `${elevatorVertex.name} (elevator lvl: ${level})`
655
+ levelVertex = new geo.GeoGraphVertex(elevatorNode.coords.clone(), {
656
+ data: elevatorNode.data,
657
+ name: `${elevatorNode.name} (elevator lvl: ${level})`
696
658
  });
697
659
  levelVertex.coords.level = level;
698
- createdVertices.push(levelVertex);
699
- vertices.push(levelVertex);
660
+ createdNodes.push(levelVertex);
661
+ nodes.push(levelVertex);
700
662
  }
701
663
  return levelVertex;
702
664
  };
703
- elevatorVertex.edges.forEach((edge) => {
665
+ elevatorNode.edges.forEach((edge) => {
704
666
  if (geo.Level.isRange(edge.level)) {
705
667
  throw new Error("Cannot handle this elevator edge due to ambiguity");
706
668
  }
707
669
  const levelVertex = getOrCreateLevelVertex(edge.level);
708
- if (edge.vertex1 === elevatorVertex) {
670
+ if (edge.vertex1 === elevatorNode) {
709
671
  edge.vertex1 = levelVertex;
710
672
  } else {
711
673
  edge.vertex2 = levelVertex;
712
674
  }
675
+ levelVertex.edges.push(edge);
713
676
  });
714
- for (let i = 0; i < createdVertices.length; i++) {
715
- for (let j = i + 1; j < createdVertices.length; j++) {
716
- const createdVertex1 = createdVertices[i];
717
- const createdVertex2 = createdVertices[j];
718
- if (createdVertex1.coords.level === null || createdVertex2.coords.level === null) {
677
+ for (let i = 0; i < createdNodes.length; i++) {
678
+ for (let j = i + 1; j < createdNodes.length; j++) {
679
+ const createdNode1 = createdNodes[i];
680
+ const createdNode2 = createdNodes[j];
681
+ if (createdNode1.coords.level === null || createdNode2.coords.level === null) {
719
682
  continue;
720
683
  }
721
- const minLevel = Math.min(createdVertex1.coords.level, createdVertex2.coords.level);
722
- const maxLevel = Math.max(createdVertex1.coords.level, createdVertex2.coords.level);
684
+ const minLevel = Math.min(createdNode1.coords.level, createdNode2.coords.level);
685
+ const maxLevel = Math.max(createdNode1.coords.level, createdNode2.coords.level);
723
686
  const newEdge = new geo.GeoGraphEdge(
724
- createdVertex1,
725
- createdVertex2,
726
- { data: elevatorVertex.data, name: elevatorVertex.name, level: [minLevel, maxLevel] }
687
+ createdNode1,
688
+ createdNode2,
689
+ { data: elevatorNode.data, name: elevatorNode.name, level: [minLevel, maxLevel] }
727
690
  );
728
691
  edges.push(newEdge);
729
692
  }
730
693
  }
731
- const elevatorNodeIndex = vertices.indexOf(elevatorVertex);
694
+ const elevatorNodeIndex = nodes.indexOf(elevatorNode);
732
695
  if (elevatorNodeIndex > -1) {
733
- vertices.splice(elevatorNodeIndex, 1);
696
+ nodes.splice(elevatorNodeIndex, 1);
734
697
  }
735
698
  }
736
699
  };