@wemap/osm 10.10.0 → 10.11.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.js ADDED
@@ -0,0 +1,296 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
+ var __publicField = (obj, key, value) => {
5
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
6
+ return value;
7
+ };
8
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
9
+ const saxes = require("saxes");
10
+ const geo = require("@wemap/geo");
11
+ class OsmElement {
12
+ constructor(id, tags) {
13
+ __publicField(this, "id");
14
+ __publicField(this, "tags");
15
+ this.id = id;
16
+ this.tags = tags || {};
17
+ }
18
+ }
19
+ class OsmModel {
20
+ constructor(nodes, ways) {
21
+ __publicField(this, "nodes");
22
+ __publicField(this, "ways");
23
+ this.nodes = nodes || [];
24
+ this.ways = ways || [];
25
+ }
26
+ getNodeById(id) {
27
+ return this.nodes.find((node) => node.id === id) || null;
28
+ }
29
+ getNodeByName(name) {
30
+ return this.nodes.find((node) => node.tags.name === name) || null;
31
+ }
32
+ getWayById(id) {
33
+ return this.ways.find((way) => way.id === id) || null;
34
+ }
35
+ getWayByName(name) {
36
+ return this.ways.find((way) => way.tags.name === name) || null;
37
+ }
38
+ }
39
+ class OsmNode extends OsmElement {
40
+ constructor(id, coords, tags) {
41
+ super(id, tags);
42
+ __publicField(this, "coords");
43
+ __publicField(this, "ways", []);
44
+ this.coords = coords;
45
+ }
46
+ get isElevator() {
47
+ return this.tags.highway === "elevator";
48
+ }
49
+ get isConveying() {
50
+ return this.isElevator;
51
+ }
52
+ }
53
+ class OsmWay extends OsmElement {
54
+ constructor(id, tags, level = null) {
55
+ super(id, tags);
56
+ __publicField(this, "nodes", []);
57
+ __publicField(this, "level", null);
58
+ this.level = level;
59
+ }
60
+ get areStairs() {
61
+ return this.tags.highway === "steps";
62
+ }
63
+ get isConveying() {
64
+ return this.tags.hasOwnProperty("conveying");
65
+ }
66
+ get isEscalator() {
67
+ return this.areStairs && this.isConveying;
68
+ }
69
+ get isMovingWalkway() {
70
+ return !this.areStairs && this.isConveying;
71
+ }
72
+ get isArea() {
73
+ return this.nodes[0] === this.nodes[this.nodes.length - 1];
74
+ }
75
+ }
76
+ class OsmParser {
77
+ static parseOsmXmlString(osmXmlString) {
78
+ const model = new OsmModel();
79
+ const parser = new saxes.SaxesParser();
80
+ let buffer;
81
+ const isDeleted = (element) => element.attributes.action && element.attributes.action === "delete";
82
+ parser.on("opentag", (node) => {
83
+ switch (node.name) {
84
+ case "node": {
85
+ if (isDeleted(node)) {
86
+ buffer = null;
87
+ break;
88
+ }
89
+ const osmNode = this._parseNode(node.attributes);
90
+ buffer = osmNode;
91
+ model.nodes.push(osmNode);
92
+ break;
93
+ }
94
+ case "way": {
95
+ if (isDeleted(node)) {
96
+ buffer = null;
97
+ break;
98
+ }
99
+ const osmWay = this._parseWay(node.attributes);
100
+ buffer = osmWay;
101
+ model.ways.push(osmWay);
102
+ break;
103
+ }
104
+ case "tag": {
105
+ if (!buffer) {
106
+ return;
107
+ }
108
+ const {
109
+ k,
110
+ v
111
+ } = node.attributes;
112
+ buffer.tags[k] = v;
113
+ break;
114
+ }
115
+ case "nd": {
116
+ if (!buffer || !(buffer instanceof OsmWay)) {
117
+ return;
118
+ }
119
+ const nodeId = Number(node.attributes.ref);
120
+ const refNode = model.getNodeById(nodeId);
121
+ if (!refNode) {
122
+ throw Error("Node: " + nodeId + " in way " + buffer.id + " not found");
123
+ }
124
+ buffer.nodes.push(refNode);
125
+ refNode.ways.push(buffer);
126
+ break;
127
+ }
128
+ }
129
+ });
130
+ parser.write(osmXmlString);
131
+ for (let i = 0; i < model.ways.length; i++) {
132
+ const way = model.ways[i];
133
+ if (way.tags.level) {
134
+ way.level = geo.Level.fromString(way.tags.level);
135
+ }
136
+ }
137
+ return model;
138
+ }
139
+ static _parseNode(attr) {
140
+ return new OsmNode(
141
+ Number(attr.id),
142
+ new geo.Coordinates(Number(attr.lat), Number(attr.lon))
143
+ );
144
+ }
145
+ static _parseWay(attr) {
146
+ return new OsmWay(Number(attr.id));
147
+ }
148
+ }
149
+ class OsmGraphNode$1 extends geo.GraphNode {
150
+ }
151
+ class OsmGraphNode extends geo.GraphEdge {
152
+ }
153
+ class OsmGraphItinerary extends geo.GraphItinerary {
154
+ static fromNetworkNodes(start, end, networkNodes, edgesWeights) {
155
+ return super.fromNetworkNodes(start, end, networkNodes, edgesWeights);
156
+ }
157
+ }
158
+ class OsmNetwork extends geo.Network {
159
+ static fromCoordinates(segments) {
160
+ return super.fromCoordinates(segments);
161
+ }
162
+ }
163
+ class OsmGraphProjection extends geo.GraphProjection {
164
+ }
165
+ class OsmGraphRouter extends geo.GraphRouter {
166
+ }
167
+ class OsmGraphRouterOptions extends geo.GraphRouterOptions {
168
+ }
169
+ class OsmMapMatching extends geo.MapMatching {
170
+ }
171
+ const HIGHWAYS_PEDESTRIANS = ["footway", "steps", "pedestrian", "living_street", "path", "track", "sidewalk"];
172
+ const DEFAULT_WAY_SELECTOR = (way) => {
173
+ return HIGHWAYS_PEDESTRIANS.includes(way.tags.highway) || way.tags.footway === "sidewalk" || way.tags.public_transport === "platform" || way.tags.railway === "platform";
174
+ };
175
+ function getNodeByName(network, name) {
176
+ return network.nodes.find(({ builtFrom }) => (builtFrom == null ? void 0 : builtFrom.tags.name) === name);
177
+ }
178
+ function getEdgeByName(network, name) {
179
+ return network.edges.find(({ builtFrom }) => (builtFrom == null ? void 0 : builtFrom.tags.name) === name);
180
+ }
181
+ function manageOneWay(edge, way) {
182
+ const { highway, oneway, conveying } = way.tags;
183
+ edge.isOneway = Boolean(oneway === "yes" || oneway === "true" || oneway === "1" || conveying && highway && ["forward", "backward"].includes(conveying));
184
+ if (edge.isOneway && conveying === "backward") {
185
+ const tmpNode = edge.node1;
186
+ edge.node1 = edge.node2;
187
+ edge.node2 = tmpNode;
188
+ }
189
+ }
190
+ function createNodesAndEdgesFromElevator(nodes, edges, elevatorNode) {
191
+ const createdNodes = [];
192
+ const getOrCreateLevelNode = (level, builtFrom) => {
193
+ let levelNode = createdNodes.find(({ coords }) => geo.Level.equals(level, coords.level));
194
+ if (!levelNode) {
195
+ levelNode = new OsmGraphNode$1(elevatorNode.coords.clone(), builtFrom);
196
+ levelNode.coords.level = level;
197
+ createdNodes.push(levelNode);
198
+ nodes.push(levelNode);
199
+ }
200
+ return levelNode;
201
+ };
202
+ elevatorNode.edges.forEach((edge) => {
203
+ if (geo.Level.isRange(edge.level)) {
204
+ throw new Error("Cannot handle this elevator edge due to ambiguity");
205
+ }
206
+ const levelNode = getOrCreateLevelNode(edge.level, elevatorNode.builtFrom);
207
+ if (edge.node1 === elevatorNode) {
208
+ edge.node1 = levelNode;
209
+ } else {
210
+ edge.node2 = levelNode;
211
+ }
212
+ levelNode.edges.push(edge);
213
+ });
214
+ for (let i = 0; i < createdNodes.length; i++) {
215
+ for (let j = i + 1; j < createdNodes.length; j++) {
216
+ const createdNode1 = createdNodes[i];
217
+ const createdNode2 = createdNodes[j];
218
+ if (createdNode1.coords.level === null || createdNode2.coords.level === null) {
219
+ continue;
220
+ }
221
+ const minLevel = Math.min(createdNode1.coords.level, createdNode2.coords.level);
222
+ const maxLevel = Math.max(createdNode1.coords.level, createdNode2.coords.level);
223
+ const newEdge = new OsmGraphNode(
224
+ createdNode1,
225
+ createdNode2,
226
+ [minLevel, maxLevel],
227
+ elevatorNode.builtFrom
228
+ );
229
+ edges.push(newEdge);
230
+ }
231
+ }
232
+ const elevatorNodeIndex = nodes.indexOf(elevatorNode);
233
+ if (elevatorNodeIndex > -1) {
234
+ nodes.splice(elevatorNodeIndex, 1);
235
+ }
236
+ }
237
+ function createNetworkFromOsmModel(osmModel, waySelectionFilter = DEFAULT_WAY_SELECTOR) {
238
+ const nodes = [];
239
+ const edges = [];
240
+ const nodesCreated = {};
241
+ const elevatorNodes = [];
242
+ const getOrCreateNode = (osmNode) => {
243
+ let node = nodesCreated[osmNode.id];
244
+ if (!node) {
245
+ node = new OsmGraphNode$1(osmNode.coords, osmNode);
246
+ nodesCreated[osmNode.id] = node;
247
+ nodes.push(node);
248
+ if (osmNode.tags.highway === "elevator") {
249
+ elevatorNodes.push(node);
250
+ }
251
+ }
252
+ return node;
253
+ };
254
+ osmModel.ways.forEach((way) => {
255
+ if (!waySelectionFilter(way)) {
256
+ return;
257
+ }
258
+ let firstNode = getOrCreateNode(way.nodes[0]);
259
+ for (let i = 1; i < way.nodes.length; i++) {
260
+ const secondNode = getOrCreateNode(way.nodes[i]);
261
+ const edge = new OsmGraphNode(firstNode, secondNode, way.level, way);
262
+ manageOneWay(edge, way);
263
+ edges.push(edge);
264
+ firstNode = secondNode;
265
+ }
266
+ });
267
+ elevatorNodes.forEach((node) => {
268
+ createNodesAndEdgesFromElevator(nodes, edges, node);
269
+ });
270
+ const networkModel = new OsmNetwork(nodes, edges);
271
+ OsmGraphNode$1.generateNodesLevels(networkModel.nodes);
272
+ return networkModel;
273
+ }
274
+ const OsmNetworkUtils = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
275
+ __proto__: null,
276
+ HIGHWAYS_PEDESTRIANS,
277
+ DEFAULT_WAY_SELECTOR,
278
+ getNodeByName,
279
+ getEdgeByName,
280
+ createNetworkFromOsmModel
281
+ }, Symbol.toStringTag, { value: "Module" }));
282
+ exports.OsmElement = OsmElement;
283
+ exports.OsmGraphEdge = OsmGraphNode;
284
+ exports.OsmGraphItinerary = OsmGraphItinerary;
285
+ exports.OsmGraphNode = OsmGraphNode$1;
286
+ exports.OsmGraphProjection = OsmGraphProjection;
287
+ exports.OsmGraphRouter = OsmGraphRouter;
288
+ exports.OsmGraphRouterOptions = OsmGraphRouterOptions;
289
+ exports.OsmMapMatching = OsmMapMatching;
290
+ exports.OsmModel = OsmModel;
291
+ exports.OsmNetwork = OsmNetwork;
292
+ exports.OsmNetworkUtils = OsmNetworkUtils;
293
+ exports.OsmNode = OsmNode;
294
+ exports.OsmParser = OsmParser;
295
+ exports.OsmWay = OsmWay;
296
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/OsmElement.ts","../src/OsmModel.ts","../src/OsmNode.ts","../src/OsmWay.ts","../src/OsmParser.ts","../src/graph/OsmGraphNode.ts","../src/graph/OsmGraphEdge.ts","../src/graph/OsmGraphItinerary.ts","../src/graph/OsmNetwork.ts","../src/graph/OsmGraphProjection.ts","../src/graph/OsmGraphRouter.ts","../src/graph/OsmGraphRouterOptions.ts","../src/graph/OsmMapMatching.ts","../src/graph/OsmNetworkUtils.ts"],"sourcesContent":["\nexport type OsmTags = { [key: string]: string };\n\nclass OsmElement {\n\n id: number;\n tags: OsmTags;\n\n constructor(id: number, tags?: OsmTags) {\n this.id = id;\n this.tags = tags || {};\n }\n}\n\nexport default OsmElement;\n","import OsmNode from './OsmNode.js';\nimport OsmWay from './OsmWay.js';\n\nclass OsmModel {\n\n nodes: OsmNode[];\n ways: OsmWay[];\n\n constructor(nodes?: OsmNode[], ways?: OsmWay[]) {\n this.nodes = nodes || [];\n this.ways = ways || [];\n }\n\n getNodeById(id: number) {\n return this.nodes.find(node => node.id === id) || null;\n }\n\n getNodeByName(name: string) {\n return this.nodes.find(node => node.tags.name === name) || null;\n }\n\n getWayById(id: number) {\n return this.ways.find(way => way.id === id) || null;\n }\n\n getWayByName(name: string) {\n return this.ways.find(way => way.tags.name === name) || null;\n }\n\n}\n\nexport default OsmModel;\n","import { Coordinates } from '@wemap/geo';\n\nimport OsmElement, { OsmTags } from './OsmElement.js';\nimport OsmWay from './OsmWay.js';\n\nclass OsmNode extends OsmElement {\n\n coords : Coordinates;\n ways: OsmWay[] = [];\n\n\n constructor(id: number, coords: Coordinates, tags?: OsmTags) {\n super(id, tags);\n this.coords = coords;\n }\n\n get isElevator() {\n return this.tags.highway === 'elevator';\n }\n\n get isConveying() {\n return this.isElevator;\n }\n}\n\nexport default OsmNode;\n","import { Level_t } from '@wemap/geo';\nimport OsmElement, { OsmTags } from './OsmElement.js';\nimport OsmNode from './OsmNode.js';\n\nclass OsmWay extends OsmElement {\n\n nodes: OsmNode[] = [];\n level: Level_t = null;\n\n constructor(id: number, tags?: OsmTags, level: Level_t = null) {\n super(id, tags);\n this.level = level;\n }\n\n get areStairs() {\n return this.tags.highway === 'steps';\n }\n\n get isConveying() {\n return this.tags.hasOwnProperty('conveying');\n }\n\n get isEscalator() {\n return this.areStairs && this.isConveying;\n }\n\n get isMovingWalkway() {\n return !this.areStairs && this.isConveying;\n }\n\n get isArea() {\n // That is not the real definition for OSM\n return this.nodes[0] === this.nodes[this.nodes.length - 1];\n }\n}\n\nexport default OsmWay;\n","/* eslint-disable max-statements */\nimport { SaxesParser } from 'saxes';\n\nimport {\n Level, Coordinates\n} from '@wemap/geo';\n\nimport OsmModel from './OsmModel.js';\nimport OsmNode from './OsmNode.js';\nimport OsmWay from './OsmWay.js';\n\ntype OsmXmlElement = { action?: 'delete' };\ntype OsmXmlNode = { id: string, lat: string, lon: string } & OsmXmlElement;\ntype OsmXmlWay = { id: string } & OsmXmlElement;\n\nclass OsmParser {\n\n static parseOsmXmlString(osmXmlString: string) {\n\n const model = new OsmModel();\n const parser = new SaxesParser();\n\n let buffer: OsmNode | OsmWay | null;\n\n const isDeleted = (element: { attributes: OsmXmlElement }) =>\n element.attributes.action && element.attributes.action === 'delete';\n\n parser.on('opentag', (node) => {\n\n switch (node.name) {\n case 'node': {\n if (isDeleted(node)) {\n buffer = null;\n break;\n }\n const osmNode = this._parseNode(node.attributes as OsmXmlNode);\n buffer = osmNode;\n model.nodes.push(osmNode);\n break;\n }\n case 'way': {\n if (isDeleted(node)) {\n buffer = null;\n break;\n }\n const osmWay = this._parseWay(node.attributes as OsmXmlWay);\n buffer = osmWay;\n model.ways.push(osmWay);\n break;\n }\n case 'tag': {\n if (!buffer) {\n return;\n }\n const {\n k, v\n } = node.attributes;\n buffer.tags[k] = v;\n break;\n }\n case 'nd': {\n if (!buffer || !(buffer instanceof OsmWay)) {\n return;\n }\n const nodeId = Number(node.attributes.ref);\n const refNode = model.getNodeById(nodeId);\n if (!refNode) {\n throw Error('Node: ' + nodeId + ' in way ' + buffer.id + ' not found');\n }\n\n buffer.nodes.push(refNode);\n refNode.ways.push(buffer);\n break;\n }\n }\n });\n\n parser.write(osmXmlString);\n\n for (let i = 0; i < model.ways.length; i++) {\n const way = model.ways[i];\n if (way.tags.level) {\n way.level = Level.fromString(way.tags.level);\n }\n }\n\n return model;\n }\n\n\n static _parseNode(attr: OsmXmlNode) {\n return new OsmNode(\n Number(attr.id),\n new Coordinates(Number(attr.lat), Number(attr.lon)));\n }\n\n static _parseWay(attr: { id: string }) {\n return new OsmWay(Number(attr.id));\n }\n}\n\nexport default OsmParser;\n","import { GraphNode } from \"@wemap/geo\";\nimport OsmNode from \"../OsmNode\";\nimport OsmWay from \"../OsmWay\";\n\nexport default class OsmGraphNode extends GraphNode<OsmNode, OsmNode | OsmWay>{ }","import { GraphEdge } from \"@wemap/geo\";\nimport OsmNode from \"../OsmNode\";\nimport OsmWay from \"../OsmWay\";\n\nexport default class OsmGraphNode extends GraphEdge<OsmNode | OsmWay, OsmNode>{ }","import { Coordinates, GraphItinerary, GraphNode } from '@wemap/geo';\n\nimport { N, E } from './OsmNetworkUtils.js';\n\nexport default class OsmGraphItinerary extends GraphItinerary<N, E>{ \n\n static fromNetworkNodes<A = N, B = E>(\n start: Coordinates, end: Coordinates,\n networkNodes: GraphNode<A, B>[], edgesWeights: number[]\n ) {\n return super.fromNetworkNodes(start, end, networkNodes, edgesWeights) as GraphItinerary<A, B>;\n }\n}\n","import { Coordinates, Network } from '@wemap/geo';\n\nimport { N, E } from './OsmNetworkUtils.js';\n\nexport default class OsmNetwork extends Network<N, E>{\n static fromCoordinates<A = N, B = E>(segments: Coordinates[][]) {\n return super.fromCoordinates<N, E>(segments) as Network<A, B>;\n }\n}","import { GraphProjection } from '@wemap/geo';\n\nimport { N, E } from './OsmNetworkUtils.js';\n\nexport default class OsmGraphProjection extends GraphProjection<N, E>{ }\n","import { GraphRouter } from '@wemap/geo';\n\nimport { N, E } from './OsmNetworkUtils.js';\n\nexport default class OsmGraphRouter extends GraphRouter<N, E>{ }\n","import { GraphRouterOptions } from '@wemap/geo';\n\nimport { N, E } from './OsmNetworkUtils.js';\n\nexport default class OsmGraphRouterOptions extends GraphRouterOptions<N, E>{ }\n","import { MapMatching } from '@wemap/geo';\n\nimport { N, E } from './OsmNetworkUtils.js';\n\nexport default class OsmMapMatching extends MapMatching<N, E>{ }\n","import { Level } from '@wemap/geo';\nimport OsmGraphNode from './OsmGraphNode';\nimport OsmGraphEdge from './OsmGraphEdge';\nimport OsmModel from '../OsmModel';\nimport OsmNode from '../OsmNode';\nimport OsmWay from '../OsmWay';\nimport OsmNetwork from './OsmNetwork';\n\nexport type N = OsmNode;\nexport type E = OsmNode | OsmWay;\n\nexport const HIGHWAYS_PEDESTRIANS = ['footway', 'steps', 'pedestrian', 'living_street', 'path', 'track', 'sidewalk'];\n\nexport const DEFAULT_WAY_SELECTOR = (way: OsmWay) => {\n return HIGHWAYS_PEDESTRIANS.includes(way.tags.highway)\n || way.tags.footway === 'sidewalk'\n || way.tags.public_transport === 'platform'\n || way.tags.railway === 'platform';\n};\n\nexport function getNodeByName(network: OsmNetwork, name: string) {\n return network.nodes.find(({ builtFrom }) => builtFrom?.tags.name === name);\n}\n\nexport function getEdgeByName(network: OsmNetwork, name: string) {\n return network.edges.find(({ builtFrom }) => builtFrom?.tags.name === name);\n}\n\nfunction manageOneWay(edge: OsmGraphEdge, way: OsmWay) {\n\n const { highway, oneway, conveying } = way.tags;\n\n edge.isOneway = Boolean((oneway === 'yes' || oneway === 'true' || oneway === '1')\n || (conveying && highway && ['forward', 'backward'].includes(conveying)));\n\n if (edge.isOneway && conveying === 'backward') {\n const tmpNode = edge.node1;\n edge.node1 = edge.node2;\n edge.node2 = tmpNode;\n }\n}\n\n\nfunction createNodesAndEdgesFromElevator(\n nodes: OsmGraphNode[],\n edges: OsmGraphEdge[],\n elevatorNode: OsmGraphNode\n) {\n\n const createdNodes: OsmGraphNode[] = [];\n const getOrCreateLevelNode = (level: number | null, builtFrom: N | null) => {\n let levelNode = createdNodes.find(({ coords }) => Level.equals(level, coords.level));\n if (!levelNode) {\n levelNode = new OsmGraphNode(elevatorNode.coords.clone(), builtFrom);\n levelNode.coords.level = level;\n createdNodes.push(levelNode);\n nodes.push(levelNode);\n }\n return levelNode;\n };\n\n // Create nodes from node.edges\n elevatorNode.edges.forEach(edge => {\n if (Level.isRange(edge.level)) {\n throw new Error('Cannot handle this elevator edge due to ambiguity');\n }\n\n const levelNode = getOrCreateLevelNode(edge.level, elevatorNode.builtFrom);\n if (edge.node1 === elevatorNode) {\n edge.node1 = levelNode;\n } else {\n edge.node2 = levelNode;\n }\n levelNode.edges.push(edge);\n });\n\n // Create edges from createdNodes\n for (let i = 0; i < createdNodes.length; i++) {\n for (let j = i + 1; j < createdNodes.length; j++) {\n\n const createdNode1 = createdNodes[i];\n const createdNode2 = createdNodes[j];\n\n if (createdNode1.coords.level === null || createdNode2.coords.level === null) {\n // TODO: not the best approach... but cannot do better with [number, number] range for levels\n continue;\n }\n\n const minLevel = Math.min(createdNode1.coords.level as number, createdNode2.coords.level as number);\n const maxLevel = Math.max(createdNode1.coords.level as number, createdNode2.coords.level as number);\n\n const newEdge = new OsmGraphEdge(\n createdNode1,\n createdNode2,\n [minLevel, maxLevel],\n elevatorNode.builtFrom\n );\n edges.push(newEdge);\n }\n }\n\n // Remove the historical elevator node from the network\n const elevatorNodeIndex = nodes.indexOf(elevatorNode);\n if (elevatorNodeIndex > -1) {\n nodes.splice(elevatorNodeIndex, 1);\n }\n}\n\nexport function createNetworkFromOsmModel(\n osmModel: OsmModel,\n waySelectionFilter = DEFAULT_WAY_SELECTOR\n) {\n\n const nodes: OsmGraphNode[] = [];\n const edges: OsmGraphEdge[] = [];\n\n const nodesCreated: { [key: number]: OsmGraphNode } = {};\n const elevatorNodes: OsmGraphNode[] = [];\n\n const getOrCreateNode = (osmNode: OsmNode) => {\n let node = nodesCreated[osmNode.id];\n if (!node) {\n node = new OsmGraphNode(osmNode.coords, osmNode);\n nodesCreated[osmNode.id] = node;\n nodes.push(node);\n\n if (osmNode.tags.highway === 'elevator') {\n elevatorNodes.push(node);\n }\n }\n return node;\n };\n\n osmModel.ways.forEach(way => {\n if (!waySelectionFilter(way)) {\n return;\n }\n\n let firstNode = getOrCreateNode(way.nodes[0]);\n for (let i = 1; i < way.nodes.length; i++) {\n const secondNode = getOrCreateNode(way.nodes[i]);\n\n const edge = new OsmGraphEdge(firstNode, secondNode, way.level, way);\n manageOneWay(edge, way);\n edges.push(edge);\n firstNode = secondNode;\n }\n\n });\n\n elevatorNodes.forEach(node => {\n // We have to clone this node for each connected edge\n createNodesAndEdgesFromElevator(nodes, edges, node);\n });\n\n const networkModel = new OsmNetwork(nodes, edges);\n\n OsmGraphNode.generateNodesLevels(networkModel.nodes);\n\n return networkModel;\n}\n\n\n// /**\n// * @param {GraphNode} node\n// * @param {object} tags\n// */\n// static _applyNodePropertiesFromTags(node, tags) {\n// node.name = tags.name || null;\n// node.subwayEntrance = tags.railway === 'subway_entrance';\n// if (node.subwayEntrance && tags.ref) {\n// node.subwayEntranceRef = tags.ref;\n// }\n// }\n\n// /**\n// * @param {GraphEdge} edge\n// * @param {object} tags\n// */\n// static _applyEdgePropertiesFromTags(edge, tags) {\n// const { highway, oneway, conveying, name } = tags;\n// edge.name = name || null;\n// edge.isStairs = highway === 'steps';\n// edge.isConveying = 'conveying' in tags;\n// edge.isOneway = Boolean((oneway === 'yes' || oneway === 'true' || oneway === '1')\n// || (conveying && highway && ['yes', 'forward', 'backward'].includes(conveying)));\n\n// if (conveying === 'backward') {\n// const tmpNode = edge.node1;\n// edge.node1 = edge.node2;\n// edge.node2 = tmpNode;\n// }\n\n// }\n"],"names":["SaxesParser","Level","Coordinates","OsmGraphNode","GraphNode","GraphEdge","GraphItinerary","Network","GraphProjection","GraphRouter","GraphRouterOptions","MapMatching","OsmGraphEdge"],"mappings":"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"}
package/dist/index.mjs ADDED
@@ -0,0 +1,296 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => {
4
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
+ return value;
6
+ };
7
+ import { SaxesParser } from "saxes";
8
+ import { Level, Coordinates, GraphNode, GraphEdge, GraphItinerary, Network, GraphProjection, GraphRouter, GraphRouterOptions, MapMatching } from "@wemap/geo";
9
+ class OsmElement {
10
+ constructor(id, tags) {
11
+ __publicField(this, "id");
12
+ __publicField(this, "tags");
13
+ this.id = id;
14
+ this.tags = tags || {};
15
+ }
16
+ }
17
+ class OsmModel {
18
+ constructor(nodes, ways) {
19
+ __publicField(this, "nodes");
20
+ __publicField(this, "ways");
21
+ this.nodes = nodes || [];
22
+ this.ways = ways || [];
23
+ }
24
+ getNodeById(id) {
25
+ return this.nodes.find((node) => node.id === id) || null;
26
+ }
27
+ getNodeByName(name) {
28
+ return this.nodes.find((node) => node.tags.name === name) || null;
29
+ }
30
+ getWayById(id) {
31
+ return this.ways.find((way) => way.id === id) || null;
32
+ }
33
+ getWayByName(name) {
34
+ return this.ways.find((way) => way.tags.name === name) || null;
35
+ }
36
+ }
37
+ class OsmNode extends OsmElement {
38
+ constructor(id, coords, tags) {
39
+ super(id, tags);
40
+ __publicField(this, "coords");
41
+ __publicField(this, "ways", []);
42
+ this.coords = coords;
43
+ }
44
+ get isElevator() {
45
+ return this.tags.highway === "elevator";
46
+ }
47
+ get isConveying() {
48
+ return this.isElevator;
49
+ }
50
+ }
51
+ class OsmWay extends OsmElement {
52
+ constructor(id, tags, level = null) {
53
+ super(id, tags);
54
+ __publicField(this, "nodes", []);
55
+ __publicField(this, "level", null);
56
+ this.level = level;
57
+ }
58
+ get areStairs() {
59
+ return this.tags.highway === "steps";
60
+ }
61
+ get isConveying() {
62
+ return this.tags.hasOwnProperty("conveying");
63
+ }
64
+ get isEscalator() {
65
+ return this.areStairs && this.isConveying;
66
+ }
67
+ get isMovingWalkway() {
68
+ return !this.areStairs && this.isConveying;
69
+ }
70
+ get isArea() {
71
+ return this.nodes[0] === this.nodes[this.nodes.length - 1];
72
+ }
73
+ }
74
+ class OsmParser {
75
+ static parseOsmXmlString(osmXmlString) {
76
+ const model = new OsmModel();
77
+ const parser = new SaxesParser();
78
+ let buffer;
79
+ const isDeleted = (element) => element.attributes.action && element.attributes.action === "delete";
80
+ parser.on("opentag", (node) => {
81
+ switch (node.name) {
82
+ case "node": {
83
+ if (isDeleted(node)) {
84
+ buffer = null;
85
+ break;
86
+ }
87
+ const osmNode = this._parseNode(node.attributes);
88
+ buffer = osmNode;
89
+ model.nodes.push(osmNode);
90
+ break;
91
+ }
92
+ case "way": {
93
+ if (isDeleted(node)) {
94
+ buffer = null;
95
+ break;
96
+ }
97
+ const osmWay = this._parseWay(node.attributes);
98
+ buffer = osmWay;
99
+ model.ways.push(osmWay);
100
+ break;
101
+ }
102
+ case "tag": {
103
+ if (!buffer) {
104
+ return;
105
+ }
106
+ const {
107
+ k,
108
+ v
109
+ } = node.attributes;
110
+ buffer.tags[k] = v;
111
+ break;
112
+ }
113
+ case "nd": {
114
+ if (!buffer || !(buffer instanceof OsmWay)) {
115
+ return;
116
+ }
117
+ const nodeId = Number(node.attributes.ref);
118
+ const refNode = model.getNodeById(nodeId);
119
+ if (!refNode) {
120
+ throw Error("Node: " + nodeId + " in way " + buffer.id + " not found");
121
+ }
122
+ buffer.nodes.push(refNode);
123
+ refNode.ways.push(buffer);
124
+ break;
125
+ }
126
+ }
127
+ });
128
+ parser.write(osmXmlString);
129
+ for (let i = 0; i < model.ways.length; i++) {
130
+ const way = model.ways[i];
131
+ if (way.tags.level) {
132
+ way.level = Level.fromString(way.tags.level);
133
+ }
134
+ }
135
+ return model;
136
+ }
137
+ static _parseNode(attr) {
138
+ return new OsmNode(
139
+ Number(attr.id),
140
+ new Coordinates(Number(attr.lat), Number(attr.lon))
141
+ );
142
+ }
143
+ static _parseWay(attr) {
144
+ return new OsmWay(Number(attr.id));
145
+ }
146
+ }
147
+ class OsmGraphNode$1 extends GraphNode {
148
+ }
149
+ class OsmGraphNode extends GraphEdge {
150
+ }
151
+ class OsmGraphItinerary extends GraphItinerary {
152
+ static fromNetworkNodes(start, end, networkNodes, edgesWeights) {
153
+ return super.fromNetworkNodes(start, end, networkNodes, edgesWeights);
154
+ }
155
+ }
156
+ class OsmNetwork extends Network {
157
+ static fromCoordinates(segments) {
158
+ return super.fromCoordinates(segments);
159
+ }
160
+ }
161
+ class OsmGraphProjection extends GraphProjection {
162
+ }
163
+ class OsmGraphRouter extends GraphRouter {
164
+ }
165
+ class OsmGraphRouterOptions extends GraphRouterOptions {
166
+ }
167
+ class OsmMapMatching extends MapMatching {
168
+ }
169
+ const HIGHWAYS_PEDESTRIANS = ["footway", "steps", "pedestrian", "living_street", "path", "track", "sidewalk"];
170
+ const DEFAULT_WAY_SELECTOR = (way) => {
171
+ return HIGHWAYS_PEDESTRIANS.includes(way.tags.highway) || way.tags.footway === "sidewalk" || way.tags.public_transport === "platform" || way.tags.railway === "platform";
172
+ };
173
+ function getNodeByName(network, name) {
174
+ return network.nodes.find(({ builtFrom }) => (builtFrom == null ? void 0 : builtFrom.tags.name) === name);
175
+ }
176
+ function getEdgeByName(network, name) {
177
+ return network.edges.find(({ builtFrom }) => (builtFrom == null ? void 0 : builtFrom.tags.name) === name);
178
+ }
179
+ function manageOneWay(edge, way) {
180
+ const { highway, oneway, conveying } = way.tags;
181
+ edge.isOneway = Boolean(oneway === "yes" || oneway === "true" || oneway === "1" || conveying && highway && ["forward", "backward"].includes(conveying));
182
+ if (edge.isOneway && conveying === "backward") {
183
+ const tmpNode = edge.node1;
184
+ edge.node1 = edge.node2;
185
+ edge.node2 = tmpNode;
186
+ }
187
+ }
188
+ function createNodesAndEdgesFromElevator(nodes, edges, elevatorNode) {
189
+ const createdNodes = [];
190
+ const getOrCreateLevelNode = (level, builtFrom) => {
191
+ let levelNode = createdNodes.find(({ coords }) => Level.equals(level, coords.level));
192
+ if (!levelNode) {
193
+ levelNode = new OsmGraphNode$1(elevatorNode.coords.clone(), builtFrom);
194
+ levelNode.coords.level = level;
195
+ createdNodes.push(levelNode);
196
+ nodes.push(levelNode);
197
+ }
198
+ return levelNode;
199
+ };
200
+ elevatorNode.edges.forEach((edge) => {
201
+ if (Level.isRange(edge.level)) {
202
+ throw new Error("Cannot handle this elevator edge due to ambiguity");
203
+ }
204
+ const levelNode = getOrCreateLevelNode(edge.level, elevatorNode.builtFrom);
205
+ if (edge.node1 === elevatorNode) {
206
+ edge.node1 = levelNode;
207
+ } else {
208
+ edge.node2 = levelNode;
209
+ }
210
+ levelNode.edges.push(edge);
211
+ });
212
+ for (let i = 0; i < createdNodes.length; i++) {
213
+ for (let j = i + 1; j < createdNodes.length; j++) {
214
+ const createdNode1 = createdNodes[i];
215
+ const createdNode2 = createdNodes[j];
216
+ if (createdNode1.coords.level === null || createdNode2.coords.level === null) {
217
+ continue;
218
+ }
219
+ const minLevel = Math.min(createdNode1.coords.level, createdNode2.coords.level);
220
+ const maxLevel = Math.max(createdNode1.coords.level, createdNode2.coords.level);
221
+ const newEdge = new OsmGraphNode(
222
+ createdNode1,
223
+ createdNode2,
224
+ [minLevel, maxLevel],
225
+ elevatorNode.builtFrom
226
+ );
227
+ edges.push(newEdge);
228
+ }
229
+ }
230
+ const elevatorNodeIndex = nodes.indexOf(elevatorNode);
231
+ if (elevatorNodeIndex > -1) {
232
+ nodes.splice(elevatorNodeIndex, 1);
233
+ }
234
+ }
235
+ function createNetworkFromOsmModel(osmModel, waySelectionFilter = DEFAULT_WAY_SELECTOR) {
236
+ const nodes = [];
237
+ const edges = [];
238
+ const nodesCreated = {};
239
+ const elevatorNodes = [];
240
+ const getOrCreateNode = (osmNode) => {
241
+ let node = nodesCreated[osmNode.id];
242
+ if (!node) {
243
+ node = new OsmGraphNode$1(osmNode.coords, osmNode);
244
+ nodesCreated[osmNode.id] = node;
245
+ nodes.push(node);
246
+ if (osmNode.tags.highway === "elevator") {
247
+ elevatorNodes.push(node);
248
+ }
249
+ }
250
+ return node;
251
+ };
252
+ osmModel.ways.forEach((way) => {
253
+ if (!waySelectionFilter(way)) {
254
+ return;
255
+ }
256
+ let firstNode = getOrCreateNode(way.nodes[0]);
257
+ for (let i = 1; i < way.nodes.length; i++) {
258
+ const secondNode = getOrCreateNode(way.nodes[i]);
259
+ const edge = new OsmGraphNode(firstNode, secondNode, way.level, way);
260
+ manageOneWay(edge, way);
261
+ edges.push(edge);
262
+ firstNode = secondNode;
263
+ }
264
+ });
265
+ elevatorNodes.forEach((node) => {
266
+ createNodesAndEdgesFromElevator(nodes, edges, node);
267
+ });
268
+ const networkModel = new OsmNetwork(nodes, edges);
269
+ OsmGraphNode$1.generateNodesLevels(networkModel.nodes);
270
+ return networkModel;
271
+ }
272
+ const OsmNetworkUtils = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
273
+ __proto__: null,
274
+ HIGHWAYS_PEDESTRIANS,
275
+ DEFAULT_WAY_SELECTOR,
276
+ getNodeByName,
277
+ getEdgeByName,
278
+ createNetworkFromOsmModel
279
+ }, Symbol.toStringTag, { value: "Module" }));
280
+ export {
281
+ OsmElement,
282
+ OsmGraphNode as OsmGraphEdge,
283
+ OsmGraphItinerary,
284
+ OsmGraphNode$1 as OsmGraphNode,
285
+ OsmGraphProjection,
286
+ OsmGraphRouter,
287
+ OsmGraphRouterOptions,
288
+ OsmMapMatching,
289
+ OsmModel,
290
+ OsmNetwork,
291
+ OsmNetworkUtils,
292
+ OsmNode,
293
+ OsmParser,
294
+ OsmWay
295
+ };
296
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../src/OsmElement.ts","../src/OsmModel.ts","../src/OsmNode.ts","../src/OsmWay.ts","../src/OsmParser.ts","../src/graph/OsmGraphNode.ts","../src/graph/OsmGraphEdge.ts","../src/graph/OsmGraphItinerary.ts","../src/graph/OsmNetwork.ts","../src/graph/OsmGraphProjection.ts","../src/graph/OsmGraphRouter.ts","../src/graph/OsmGraphRouterOptions.ts","../src/graph/OsmMapMatching.ts","../src/graph/OsmNetworkUtils.ts"],"sourcesContent":["\nexport type OsmTags = { [key: string]: string };\n\nclass OsmElement {\n\n id: number;\n tags: OsmTags;\n\n constructor(id: number, tags?: OsmTags) {\n this.id = id;\n this.tags = tags || {};\n }\n}\n\nexport default OsmElement;\n","import OsmNode from './OsmNode.js';\nimport OsmWay from './OsmWay.js';\n\nclass OsmModel {\n\n nodes: OsmNode[];\n ways: OsmWay[];\n\n constructor(nodes?: OsmNode[], ways?: OsmWay[]) {\n this.nodes = nodes || [];\n this.ways = ways || [];\n }\n\n getNodeById(id: number) {\n return this.nodes.find(node => node.id === id) || null;\n }\n\n getNodeByName(name: string) {\n return this.nodes.find(node => node.tags.name === name) || null;\n }\n\n getWayById(id: number) {\n return this.ways.find(way => way.id === id) || null;\n }\n\n getWayByName(name: string) {\n return this.ways.find(way => way.tags.name === name) || null;\n }\n\n}\n\nexport default OsmModel;\n","import { Coordinates } from '@wemap/geo';\n\nimport OsmElement, { OsmTags } from './OsmElement.js';\nimport OsmWay from './OsmWay.js';\n\nclass OsmNode extends OsmElement {\n\n coords : Coordinates;\n ways: OsmWay[] = [];\n\n\n constructor(id: number, coords: Coordinates, tags?: OsmTags) {\n super(id, tags);\n this.coords = coords;\n }\n\n get isElevator() {\n return this.tags.highway === 'elevator';\n }\n\n get isConveying() {\n return this.isElevator;\n }\n}\n\nexport default OsmNode;\n","import { Level_t } from '@wemap/geo';\nimport OsmElement, { OsmTags } from './OsmElement.js';\nimport OsmNode from './OsmNode.js';\n\nclass OsmWay extends OsmElement {\n\n nodes: OsmNode[] = [];\n level: Level_t = null;\n\n constructor(id: number, tags?: OsmTags, level: Level_t = null) {\n super(id, tags);\n this.level = level;\n }\n\n get areStairs() {\n return this.tags.highway === 'steps';\n }\n\n get isConveying() {\n return this.tags.hasOwnProperty('conveying');\n }\n\n get isEscalator() {\n return this.areStairs && this.isConveying;\n }\n\n get isMovingWalkway() {\n return !this.areStairs && this.isConveying;\n }\n\n get isArea() {\n // That is not the real definition for OSM\n return this.nodes[0] === this.nodes[this.nodes.length - 1];\n }\n}\n\nexport default OsmWay;\n","/* eslint-disable max-statements */\nimport { SaxesParser } from 'saxes';\n\nimport {\n Level, Coordinates\n} from '@wemap/geo';\n\nimport OsmModel from './OsmModel.js';\nimport OsmNode from './OsmNode.js';\nimport OsmWay from './OsmWay.js';\n\ntype OsmXmlElement = { action?: 'delete' };\ntype OsmXmlNode = { id: string, lat: string, lon: string } & OsmXmlElement;\ntype OsmXmlWay = { id: string } & OsmXmlElement;\n\nclass OsmParser {\n\n static parseOsmXmlString(osmXmlString: string) {\n\n const model = new OsmModel();\n const parser = new SaxesParser();\n\n let buffer: OsmNode | OsmWay | null;\n\n const isDeleted = (element: { attributes: OsmXmlElement }) =>\n element.attributes.action && element.attributes.action === 'delete';\n\n parser.on('opentag', (node) => {\n\n switch (node.name) {\n case 'node': {\n if (isDeleted(node)) {\n buffer = null;\n break;\n }\n const osmNode = this._parseNode(node.attributes as OsmXmlNode);\n buffer = osmNode;\n model.nodes.push(osmNode);\n break;\n }\n case 'way': {\n if (isDeleted(node)) {\n buffer = null;\n break;\n }\n const osmWay = this._parseWay(node.attributes as OsmXmlWay);\n buffer = osmWay;\n model.ways.push(osmWay);\n break;\n }\n case 'tag': {\n if (!buffer) {\n return;\n }\n const {\n k, v\n } = node.attributes;\n buffer.tags[k] = v;\n break;\n }\n case 'nd': {\n if (!buffer || !(buffer instanceof OsmWay)) {\n return;\n }\n const nodeId = Number(node.attributes.ref);\n const refNode = model.getNodeById(nodeId);\n if (!refNode) {\n throw Error('Node: ' + nodeId + ' in way ' + buffer.id + ' not found');\n }\n\n buffer.nodes.push(refNode);\n refNode.ways.push(buffer);\n break;\n }\n }\n });\n\n parser.write(osmXmlString);\n\n for (let i = 0; i < model.ways.length; i++) {\n const way = model.ways[i];\n if (way.tags.level) {\n way.level = Level.fromString(way.tags.level);\n }\n }\n\n return model;\n }\n\n\n static _parseNode(attr: OsmXmlNode) {\n return new OsmNode(\n Number(attr.id),\n new Coordinates(Number(attr.lat), Number(attr.lon)));\n }\n\n static _parseWay(attr: { id: string }) {\n return new OsmWay(Number(attr.id));\n }\n}\n\nexport default OsmParser;\n","import { GraphNode } from \"@wemap/geo\";\nimport OsmNode from \"../OsmNode\";\nimport OsmWay from \"../OsmWay\";\n\nexport default class OsmGraphNode extends GraphNode<OsmNode, OsmNode | OsmWay>{ }","import { GraphEdge } from \"@wemap/geo\";\nimport OsmNode from \"../OsmNode\";\nimport OsmWay from \"../OsmWay\";\n\nexport default class OsmGraphNode extends GraphEdge<OsmNode | OsmWay, OsmNode>{ }","import { Coordinates, GraphItinerary, GraphNode } from '@wemap/geo';\n\nimport { N, E } from './OsmNetworkUtils.js';\n\nexport default class OsmGraphItinerary extends GraphItinerary<N, E>{ \n\n static fromNetworkNodes<A = N, B = E>(\n start: Coordinates, end: Coordinates,\n networkNodes: GraphNode<A, B>[], edgesWeights: number[]\n ) {\n return super.fromNetworkNodes(start, end, networkNodes, edgesWeights) as GraphItinerary<A, B>;\n }\n}\n","import { Coordinates, Network } from '@wemap/geo';\n\nimport { N, E } from './OsmNetworkUtils.js';\n\nexport default class OsmNetwork extends Network<N, E>{\n static fromCoordinates<A = N, B = E>(segments: Coordinates[][]) {\n return super.fromCoordinates<N, E>(segments) as Network<A, B>;\n }\n}","import { GraphProjection } from '@wemap/geo';\n\nimport { N, E } from './OsmNetworkUtils.js';\n\nexport default class OsmGraphProjection extends GraphProjection<N, E>{ }\n","import { GraphRouter } from '@wemap/geo';\n\nimport { N, E } from './OsmNetworkUtils.js';\n\nexport default class OsmGraphRouter extends GraphRouter<N, E>{ }\n","import { GraphRouterOptions } from '@wemap/geo';\n\nimport { N, E } from './OsmNetworkUtils.js';\n\nexport default class OsmGraphRouterOptions extends GraphRouterOptions<N, E>{ }\n","import { MapMatching } from '@wemap/geo';\n\nimport { N, E } from './OsmNetworkUtils.js';\n\nexport default class OsmMapMatching extends MapMatching<N, E>{ }\n","import { Level } from '@wemap/geo';\nimport OsmGraphNode from './OsmGraphNode';\nimport OsmGraphEdge from './OsmGraphEdge';\nimport OsmModel from '../OsmModel';\nimport OsmNode from '../OsmNode';\nimport OsmWay from '../OsmWay';\nimport OsmNetwork from './OsmNetwork';\n\nexport type N = OsmNode;\nexport type E = OsmNode | OsmWay;\n\nexport const HIGHWAYS_PEDESTRIANS = ['footway', 'steps', 'pedestrian', 'living_street', 'path', 'track', 'sidewalk'];\n\nexport const DEFAULT_WAY_SELECTOR = (way: OsmWay) => {\n return HIGHWAYS_PEDESTRIANS.includes(way.tags.highway)\n || way.tags.footway === 'sidewalk'\n || way.tags.public_transport === 'platform'\n || way.tags.railway === 'platform';\n};\n\nexport function getNodeByName(network: OsmNetwork, name: string) {\n return network.nodes.find(({ builtFrom }) => builtFrom?.tags.name === name);\n}\n\nexport function getEdgeByName(network: OsmNetwork, name: string) {\n return network.edges.find(({ builtFrom }) => builtFrom?.tags.name === name);\n}\n\nfunction manageOneWay(edge: OsmGraphEdge, way: OsmWay) {\n\n const { highway, oneway, conveying } = way.tags;\n\n edge.isOneway = Boolean((oneway === 'yes' || oneway === 'true' || oneway === '1')\n || (conveying && highway && ['forward', 'backward'].includes(conveying)));\n\n if (edge.isOneway && conveying === 'backward') {\n const tmpNode = edge.node1;\n edge.node1 = edge.node2;\n edge.node2 = tmpNode;\n }\n}\n\n\nfunction createNodesAndEdgesFromElevator(\n nodes: OsmGraphNode[],\n edges: OsmGraphEdge[],\n elevatorNode: OsmGraphNode\n) {\n\n const createdNodes: OsmGraphNode[] = [];\n const getOrCreateLevelNode = (level: number | null, builtFrom: N | null) => {\n let levelNode = createdNodes.find(({ coords }) => Level.equals(level, coords.level));\n if (!levelNode) {\n levelNode = new OsmGraphNode(elevatorNode.coords.clone(), builtFrom);\n levelNode.coords.level = level;\n createdNodes.push(levelNode);\n nodes.push(levelNode);\n }\n return levelNode;\n };\n\n // Create nodes from node.edges\n elevatorNode.edges.forEach(edge => {\n if (Level.isRange(edge.level)) {\n throw new Error('Cannot handle this elevator edge due to ambiguity');\n }\n\n const levelNode = getOrCreateLevelNode(edge.level, elevatorNode.builtFrom);\n if (edge.node1 === elevatorNode) {\n edge.node1 = levelNode;\n } else {\n edge.node2 = levelNode;\n }\n levelNode.edges.push(edge);\n });\n\n // Create edges from createdNodes\n for (let i = 0; i < createdNodes.length; i++) {\n for (let j = i + 1; j < createdNodes.length; j++) {\n\n const createdNode1 = createdNodes[i];\n const createdNode2 = createdNodes[j];\n\n if (createdNode1.coords.level === null || createdNode2.coords.level === null) {\n // TODO: not the best approach... but cannot do better with [number, number] range for levels\n continue;\n }\n\n const minLevel = Math.min(createdNode1.coords.level as number, createdNode2.coords.level as number);\n const maxLevel = Math.max(createdNode1.coords.level as number, createdNode2.coords.level as number);\n\n const newEdge = new OsmGraphEdge(\n createdNode1,\n createdNode2,\n [minLevel, maxLevel],\n elevatorNode.builtFrom\n );\n edges.push(newEdge);\n }\n }\n\n // Remove the historical elevator node from the network\n const elevatorNodeIndex = nodes.indexOf(elevatorNode);\n if (elevatorNodeIndex > -1) {\n nodes.splice(elevatorNodeIndex, 1);\n }\n}\n\nexport function createNetworkFromOsmModel(\n osmModel: OsmModel,\n waySelectionFilter = DEFAULT_WAY_SELECTOR\n) {\n\n const nodes: OsmGraphNode[] = [];\n const edges: OsmGraphEdge[] = [];\n\n const nodesCreated: { [key: number]: OsmGraphNode } = {};\n const elevatorNodes: OsmGraphNode[] = [];\n\n const getOrCreateNode = (osmNode: OsmNode) => {\n let node = nodesCreated[osmNode.id];\n if (!node) {\n node = new OsmGraphNode(osmNode.coords, osmNode);\n nodesCreated[osmNode.id] = node;\n nodes.push(node);\n\n if (osmNode.tags.highway === 'elevator') {\n elevatorNodes.push(node);\n }\n }\n return node;\n };\n\n osmModel.ways.forEach(way => {\n if (!waySelectionFilter(way)) {\n return;\n }\n\n let firstNode = getOrCreateNode(way.nodes[0]);\n for (let i = 1; i < way.nodes.length; i++) {\n const secondNode = getOrCreateNode(way.nodes[i]);\n\n const edge = new OsmGraphEdge(firstNode, secondNode, way.level, way);\n manageOneWay(edge, way);\n edges.push(edge);\n firstNode = secondNode;\n }\n\n });\n\n elevatorNodes.forEach(node => {\n // We have to clone this node for each connected edge\n createNodesAndEdgesFromElevator(nodes, edges, node);\n });\n\n const networkModel = new OsmNetwork(nodes, edges);\n\n OsmGraphNode.generateNodesLevels(networkModel.nodes);\n\n return networkModel;\n}\n\n\n// /**\n// * @param {GraphNode} node\n// * @param {object} tags\n// */\n// static _applyNodePropertiesFromTags(node, tags) {\n// node.name = tags.name || null;\n// node.subwayEntrance = tags.railway === 'subway_entrance';\n// if (node.subwayEntrance && tags.ref) {\n// node.subwayEntranceRef = tags.ref;\n// }\n// }\n\n// /**\n// * @param {GraphEdge} edge\n// * @param {object} tags\n// */\n// static _applyEdgePropertiesFromTags(edge, tags) {\n// const { highway, oneway, conveying, name } = tags;\n// edge.name = name || null;\n// edge.isStairs = highway === 'steps';\n// edge.isConveying = 'conveying' in tags;\n// edge.isOneway = Boolean((oneway === 'yes' || oneway === 'true' || oneway === '1')\n// || (conveying && highway && ['yes', 'forward', 'backward'].includes(conveying)));\n\n// if (conveying === 'backward') {\n// const tmpNode = edge.node1;\n// edge.node1 = edge.node2;\n// edge.node2 = tmpNode;\n// }\n\n// }\n"],"names":["OsmGraphNode","OsmGraphEdge"],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,62 @@
1
+ import { Coordinates, GraphEdge, GraphNode, Level_t, Network } from "@wemap/geo";
2
+
3
+ declare module '@wemap/osm' {
4
+
5
+ export type OsmTags = { [key: string]: string };
6
+
7
+ export class OsmElement {
8
+ id: number | null;
9
+ tags: OsmTags;
10
+ constructor(id: number, tags?: OsmTags)
11
+ }
12
+
13
+ export class OsmModel {
14
+ nodes: OsmNode[];
15
+ ways: OsmWay[];
16
+
17
+ constructor(nodes?: OsmNode[], ways?: OsmWay[]);
18
+
19
+ getNodeById(id: number): OsmNode | null;
20
+ getNodeByName(name: string): OsmNode | null;
21
+ getWayById(id: number): OsmWay | null;
22
+ getWayByName(name: string): OsmWay | null;
23
+ }
24
+
25
+ export class OsmNode extends OsmElement {
26
+ coords: Coordinates | null;
27
+ ways: OsmWay[];
28
+
29
+ constructor(id: number, coords: Coordinates, tags?: OsmTags);
30
+
31
+ get isElevator(): boolean;
32
+ get isConveying(): boolean;
33
+ }
34
+
35
+ export class OsmParser {
36
+ static parseOsmXmlString(osmXmlString: string): OsmModel;
37
+ }
38
+
39
+ export class OsmWay {
40
+ nodes: OsmNode[];
41
+ level: Level_t;
42
+
43
+ constructor(id: number, tags?: OsmTags, level?: Level_t);
44
+
45
+ get areStairs(): boolean;
46
+ get isConveying(): boolean;
47
+ get isEscalator(): boolean;
48
+ get isMovingWalkway(): boolean;
49
+ get isArea(): boolean;
50
+ }
51
+
52
+ export type WaySelector = (way: OsmWay) => boolean;
53
+ export const DEFAULT_WAY_SELECTOR: WaySelector;
54
+ export const HIGHWAYS_PEDESTRIANS: string[];
55
+
56
+ export class OsmNetworkUtils {
57
+ static getNodeByName(network: Network<OsmElement>, name: string): GraphNode<OsmElement> | null;
58
+ static getEdgeByName(network: Network<OsmElement>, name: string): GraphEdge<OsmElement> | null;
59
+ static createNetworkFromOsmModel(osmModel: OsmModel, waySelectionFilter?: WaySelector): Network<OsmElement>;
60
+ }
61
+
62
+ }
package/package.json CHANGED
@@ -5,13 +5,14 @@
5
5
  ],
6
6
  "description": "Wemap OSM utils package",
7
7
  "main": "index.js",
8
+ "typings": "index.d.ts",
8
9
  "repository": {
9
10
  "type": "git",
10
11
  "url": "git+https://github.com/wemap/wemap-modules-js.git",
11
12
  "directory": "packages/osm"
12
13
  },
13
14
  "name": "@wemap/osm",
14
- "version": "10.10.0",
15
+ "version": "10.11.2",
15
16
  "bugs": {
16
17
  "url": "https://github.com/wemap/wemap-modules-js/issues"
17
18
  },
@@ -25,9 +26,9 @@
25
26
  ],
26
27
  "license": "ISC",
27
28
  "dependencies": {
28
- "@wemap/geo": "^10.10.0",
29
- "@wemap/logger": "^10.0.0",
29
+ "@wemap/geo": "^10.11.2",
30
+ "@wemap/logger": "^10.11.1",
30
31
  "saxes": "^5.0.1"
31
32
  },
32
- "gitHead": "61c5899e7feb7b75f228a9ee6dc6e8c3e39beb11"
33
+ "gitHead": "a79f02211a7ecccbe9472bdf7d4c2daacff24324"
33
34
  }
@@ -2,7 +2,7 @@ import { Level, GraphEdge, GraphNode, Network } from '@wemap/geo';
2
2
  import { OsmElement, OsmModel, OsmNode, OsmWay } from '@wemap/osm';
3
3
 
4
4
 
5
- export const HIGHWAYS_PEDESTRIANS = ['footway', 'steps', 'pedestrian', 'living_street', 'path', 'track', 'sidewalk'];
5
+ export const HIGHWAYS_PEDESTRIANS = ['footway', 'steps', 'pedestrian', 'living_street', 'path', 'track', 'sidewalk', 'elevator'];
6
6
 
7
7
  export const DEFAULT_WAY_SELECTOR = way => {
8
8
  return HIGHWAYS_PEDESTRIANS.includes(way.tags.highway)
package/src/OsmWay.js CHANGED
@@ -54,6 +54,14 @@ class OsmWay extends OsmElement {
54
54
  // That is not the real definition for OSM
55
55
  return this.nodes[0] === this.nodes[this.nodes.length - 1];
56
56
  }
57
+
58
+ /**
59
+ * @returns {boolean}
60
+ */
61
+ get isElevator() {
62
+ return this.tags.highway === 'elevator';
63
+ }
64
+
57
65
  }
58
66
 
59
67
  export default OsmWay;
@@ -1,254 +0,0 @@
1
- import { Level, Coordinates } from '@wemap/geo';
2
- import { SaxesParser } from 'saxes';
3
-
4
- class OsmElement {
5
-
6
- /** @type {number|null} */
7
- id;
8
-
9
- /** @type {object} */
10
- tags;
11
-
12
- /**
13
- * @param {number} id
14
- * @param {object} tags
15
- */
16
- constructor(id, tags) {
17
- this.id = id;
18
- this.tags = tags || {};
19
- }
20
- }
21
-
22
- class OsmWay extends OsmElement {
23
-
24
- /** @type {OsmNode[]} */
25
- nodes = [];
26
-
27
- /** @type {null|number|[number, number]} */
28
- level = null;
29
-
30
- /**
31
- * @param {number} id
32
- * @param {object} tags
33
- * @param {null|number|[number, number]} level
34
- */
35
- constructor(id, tags, level = null) {
36
- super(id, tags);
37
- this.level = level;
38
- }
39
-
40
- /**
41
- * @returns {boolean}
42
- */
43
- get areStairs() {
44
- return this.tags.highway === 'steps';
45
- }
46
-
47
- /**
48
- * @returns {boolean}
49
- */
50
- get isConveying() {
51
- return this.tags.hasOwnProperty('conveying');
52
- }
53
-
54
- /**
55
- * @returns {boolean}
56
- */
57
- get isEscalator() {
58
- return this.areStairs && this.isConveying;
59
- }
60
-
61
- /**
62
- * @returns {boolean}
63
- */
64
- get isMovingWalkway() {
65
- return !this.areStairs && this.isConveying;
66
- }
67
-
68
- /**
69
- * @returns {boolean}
70
- */
71
- get isArea() {
72
- // That is not the real definition for OSM
73
- return this.nodes[0] === this.nodes[this.nodes.length - 1];
74
- }
75
- }
76
-
77
- class OsmNode extends OsmElement {
78
-
79
- /** @type {Coordinates} */
80
- coords = null;
81
-
82
- /** @type {OsmWay[]} */
83
- ways = [];
84
-
85
- /**
86
- * @param {number} id
87
- * @param {Coordinates} coords
88
- * @param {object} tags
89
- */
90
- constructor(id, coords, tags) {
91
- super(id, tags);
92
- this.coords = coords;
93
- }
94
-
95
- /**
96
- * @returns {boolean}
97
- */
98
- get isElevator() {
99
- return this.tags.highway === 'elevator';
100
- }
101
-
102
- /**
103
- * @returns {boolean}
104
- */
105
- get isConveying() {
106
- return this.isElevator;
107
- }
108
- }
109
-
110
- class OsmModel {
111
-
112
- /** @type {OsmNode[]} */
113
- nodes;
114
-
115
- /** @type {OsmWay[]} */
116
- ways;
117
-
118
- /**
119
- * @param {OsmNode[]|undefined} nodes
120
- * @param {OsmWay[]|undefined} ways
121
- */
122
- constructor(nodes, ways) {
123
- this.nodes = nodes || [];
124
- this.ways = ways || [];
125
- }
126
-
127
- /**
128
- * @param {number} id
129
- * @returns {OsmNode|null}
130
- */
131
- getNodeById(id) {
132
- return this.nodes.find(node => node.id === id) || null;
133
- }
134
-
135
- /**
136
- * @param {string} name
137
- * @returns {OsmNode|null}
138
- */
139
- getNodeByName(name) {
140
- return this.nodes.find(node => node.tags.name === name) || null;
141
- }
142
-
143
-
144
- /**
145
- * @param {number} id
146
- * @returns {OsmWay|null}
147
- */
148
- getWayById(id) {
149
- return this.ways.find(way => way.id === id) || null;
150
- }
151
-
152
- /**
153
- * @param {string} name
154
- * @returns {OsmWay|null}
155
- */
156
- getWayByName(name) {
157
- return this.ways.find(way => way.tags.name === name) || null;
158
- }
159
-
160
- }
161
-
162
- /* eslint-disable max-statements */
163
-
164
- class OsmParser {
165
-
166
- /**
167
- * @param {string} osmXmlString
168
- * @returns {OsmModel}
169
- */
170
- static parseOsmXmlString(osmXmlString) {
171
-
172
- const model = new OsmModel();
173
- const parser = new SaxesParser(true);
174
-
175
- let buffer;
176
-
177
- const isDeleted = element => element.attributes.action && element.attributes.action === 'delete';
178
-
179
- parser.on('opentag', (node) => {
180
-
181
- switch (node.name) {
182
- case 'node': {
183
- if (isDeleted(node)) {
184
- buffer = null;
185
- break;
186
- }
187
- const osmNode = this._parseNode(node.attributes);
188
- buffer = osmNode;
189
- model.nodes.push(osmNode);
190
- break;
191
- }
192
- case 'way': {
193
- if (isDeleted(node)) {
194
- buffer = null;
195
- break;
196
- }
197
- const osmWay = this._parseWay(node.attributes);
198
- buffer = osmWay;
199
- model.ways.push(osmWay);
200
- break;
201
- }
202
- case 'tag': {
203
- if (!buffer) {
204
- return;
205
- }
206
- const {
207
- k, v
208
- } = node.attributes;
209
- buffer.tags[k] = v;
210
- break;
211
- }
212
- case 'nd': {
213
- if (!buffer || !(buffer instanceof OsmWay)) {
214
- return;
215
- }
216
- const nodeId = Number(node.attributes.ref);
217
- const refNode = model.getNodeById(nodeId);
218
- if (!refNode) {
219
- throw Error('Node: ' + nodeId + ' in way ' + buffer.id + ' not found');
220
- }
221
-
222
- buffer.nodes.push(refNode);
223
- refNode.ways.push(buffer);
224
- break;
225
- }
226
- }
227
- });
228
-
229
- parser.write(osmXmlString);
230
-
231
- for (let i = 0; i < model.ways.length; i++) {
232
- const way = model.ways[i];
233
- if (way.tags.level) {
234
- way.level = Level.fromString(way.tags.level);
235
- }
236
- }
237
-
238
- return model;
239
- }
240
-
241
-
242
- static _parseNode(attr) {
243
- return new OsmNode(
244
- Number(attr.id),
245
- new Coordinates(Number(attr.lat), Number(attr.lon)));
246
- }
247
-
248
- static _parseWay(attr) {
249
- return new OsmWay(Number(attr.id));
250
- }
251
- }
252
-
253
- export { OsmElement, OsmModel, OsmNode, OsmParser, OsmWay };
254
- //# sourceMappingURL=wemap-osm.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wemap-osm.es.js","sources":["../src/OsmElement.js","../src/OsmWay.js","../src/OsmNode.js","../src/OsmModel.js","../src/OsmParser.js"],"sourcesContent":["class OsmElement {\n\n /** @type {number|null} */\n id;\n\n /** @type {object} */\n tags;\n\n /**\n * @param {number} id\n * @param {object} tags\n */\n constructor(id, tags) {\n this.id = id;\n this.tags = tags || {};\n }\n}\n\nexport default OsmElement;\n","import OsmElement from './OsmElement.js';\nimport OsmNode from './OsmNode.js';\n\nclass OsmWay extends OsmElement {\n\n /** @type {OsmNode[]} */\n nodes = [];\n\n /** @type {null|number|[number, number]} */\n level = null;\n\n /**\n * @param {number} id\n * @param {object} tags\n * @param {null|number|[number, number]} level\n */\n constructor(id, tags, level = null) {\n super(id, tags);\n this.level = level;\n }\n\n /**\n * @returns {boolean}\n */\n get areStairs() {\n return this.tags.highway === 'steps';\n }\n\n /**\n * @returns {boolean}\n */\n get isConveying() {\n return this.tags.hasOwnProperty('conveying');\n }\n\n /**\n * @returns {boolean}\n */\n get isEscalator() {\n return this.areStairs && this.isConveying;\n }\n\n /**\n * @returns {boolean}\n */\n get isMovingWalkway() {\n return !this.areStairs && this.isConveying;\n }\n\n /**\n * @returns {boolean}\n */\n get isArea() {\n // That is not the real definition for OSM\n return this.nodes[0] === this.nodes[this.nodes.length - 1];\n }\n}\n\nexport default OsmWay;\n","import { Coordinates } from '@wemap/geo';\n\nimport OsmElement from './OsmElement.js';\nimport OsmWay from './OsmWay.js';\n\nclass OsmNode extends OsmElement {\n\n /** @type {Coordinates} */\n coords = null;\n\n /** @type {OsmWay[]} */\n ways = [];\n\n /**\n * @param {number} id\n * @param {Coordinates} coords\n * @param {object} tags\n */\n constructor(id, coords, tags) {\n super(id, tags);\n this.coords = coords;\n }\n\n /**\n * @returns {boolean}\n */\n get isElevator() {\n return this.tags.highway === 'elevator';\n }\n\n /**\n * @returns {boolean}\n */\n get isConveying() {\n return this.isElevator;\n }\n}\n\nexport default OsmNode;\n","import OsmNode from './OsmNode.js';\nimport OsmWay from './OsmWay.js';\n\nclass OsmModel {\n\n /** @type {OsmNode[]} */\n nodes;\n\n /** @type {OsmWay[]} */\n ways;\n\n /**\n * @param {OsmNode[]|undefined} nodes\n * @param {OsmWay[]|undefined} ways\n */\n constructor(nodes, ways) {\n this.nodes = nodes || [];\n this.ways = ways || [];\n }\n\n /**\n * @param {number} id\n * @returns {OsmNode|null}\n */\n getNodeById(id) {\n return this.nodes.find(node => node.id === id) || null;\n }\n\n /**\n * @param {string} name\n * @returns {OsmNode|null}\n */\n getNodeByName(name) {\n return this.nodes.find(node => node.tags.name === name) || null;\n }\n\n\n /**\n * @param {number} id\n * @returns {OsmWay|null}\n */\n getWayById(id) {\n return this.ways.find(way => way.id === id) || null;\n }\n\n /**\n * @param {string} name\n * @returns {OsmWay|null}\n */\n getWayByName(name) {\n return this.ways.find(way => way.tags.name === name) || null;\n }\n\n}\n\nexport default OsmModel;\n","/* eslint-disable max-statements */\nimport { SaxesParser } from 'saxes';\n\nimport {\n Level, Coordinates\n} from '@wemap/geo';\n\nimport OsmModel from './OsmModel.js';\nimport OsmNode from './OsmNode.js';\nimport OsmWay from './OsmWay.js';\n\nclass OsmParser {\n\n /**\n * @param {string} osmXmlString\n * @returns {OsmModel}\n */\n static parseOsmXmlString(osmXmlString) {\n\n const model = new OsmModel();\n const parser = new SaxesParser(true);\n\n let buffer;\n\n const isDeleted = element => element.attributes.action && element.attributes.action === 'delete';\n\n parser.on('opentag', (node) => {\n\n switch (node.name) {\n case 'node': {\n if (isDeleted(node)) {\n buffer = null;\n break;\n }\n const osmNode = this._parseNode(node.attributes);\n buffer = osmNode;\n model.nodes.push(osmNode);\n break;\n }\n case 'way': {\n if (isDeleted(node)) {\n buffer = null;\n break;\n }\n const osmWay = this._parseWay(node.attributes);\n buffer = osmWay;\n model.ways.push(osmWay);\n break;\n }\n case 'tag': {\n if (!buffer) {\n return;\n }\n const {\n k, v\n } = node.attributes;\n buffer.tags[k] = v;\n break;\n }\n case 'nd': {\n if (!buffer || !(buffer instanceof OsmWay)) {\n return;\n }\n const nodeId = Number(node.attributes.ref);\n const refNode = model.getNodeById(nodeId);\n if (!refNode) {\n throw Error('Node: ' + nodeId + ' in way ' + buffer.id + ' not found');\n }\n\n buffer.nodes.push(refNode);\n refNode.ways.push(buffer);\n break;\n }\n }\n });\n\n parser.write(osmXmlString);\n\n for (let i = 0; i < model.ways.length; i++) {\n const way = model.ways[i];\n if (way.tags.level) {\n way.level = Level.fromString(way.tags.level);\n }\n }\n\n return model;\n }\n\n\n static _parseNode(attr) {\n return new OsmNode(\n Number(attr.id),\n new Coordinates(Number(attr.lat), Number(attr.lon)));\n }\n\n static _parseWay(attr) {\n return new OsmWay(Number(attr.id));\n }\n}\n\nexport default OsmParser;\n"],"names":[],"mappings":"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"}