@wemap/osm 11.0.0-alpha.18 → 11.0.0-alpha.19

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.
@@ -75,10 +75,10 @@
75
75
  <tag k='name' v='p21' />
76
76
  </node>
77
77
  <node id='-441273' action='modify' visible='true' lat='43.6095297' lon='3.8845039'>
78
- <tag k='name' v='p22' />
78
+ <tag k='name' v='p26' />
79
79
  </node>
80
80
  <node id='-441286' action='modify' visible='true' lat='43.6095624' lon='3.8845134'>
81
- <tag k='name' v='p23' />
81
+ <tag k='name' v='p27' />
82
82
  </node>
83
83
  <way id='-440499' action='modify' visible='true'>
84
84
  <nd ref='-440476' />
package/dist/index.js CHANGED
@@ -214,151 +214,10 @@ class OsmParser {
214
214
  return new OsmRelation(Number(attr.id));
215
215
  }
216
216
  }
217
- class OsmGraphNode extends geo.GraphNode {
218
- }
219
- class OsmGraphEdge extends geo.GraphEdge {
220
- }
221
- class OsmGraphItinerary extends geo.GraphItinerary {
222
- static fromNetworkNodes(start, end, networkNodes, edgesWeights) {
223
- return super.fromNetworkNodes(start, end, networkNodes, edgesWeights);
224
- }
225
- }
226
- class OsmNetwork extends geo.Network {
227
- static fromCoordinates(segments) {
228
- return super.fromCoordinates(segments);
229
- }
230
- }
231
- class OsmGraphProjection extends geo.GraphProjection {
232
- }
233
- class OsmGraphRouter extends geo.GraphRouter {
234
- }
235
- class OsmGraphRouterOptions extends geo.GraphRouterOptions {
236
- }
237
- class OsmMapMatching extends geo.MapMatching {
238
- }
239
- const HIGHWAYS_PEDESTRIANS = ["footway", "steps", "pedestrian", "living_street", "path", "track", "sidewalk", "elevator"];
240
- const DEFAULT_WAY_SELECTOR = (way) => {
241
- return HIGHWAYS_PEDESTRIANS.includes(way.tags.highway) || way.tags.footway === "sidewalk" || way.tags.public_transport === "platform" || way.tags.railway === "platform";
242
- };
243
- function getNodeByName(network, name) {
244
- return network.nodes.find(({ builtFrom }) => (builtFrom == null ? void 0 : builtFrom.tags.name) === name);
245
- }
246
- function getEdgeByName(network, name) {
247
- return network.edges.find(({ builtFrom }) => (builtFrom == null ? void 0 : builtFrom.tags.name) === name);
248
- }
249
- function manageOneWay(edge, way) {
250
- const { highway, oneway, conveying } = way.tags;
251
- edge.isOneway = Boolean(oneway === "yes" || oneway === "true" || oneway === "1" || conveying && highway && ["forward", "backward"].includes(conveying));
252
- if (edge.isOneway && conveying === "backward") {
253
- const tmpNode = edge.node1;
254
- edge.node1 = edge.node2;
255
- edge.node2 = tmpNode;
256
- }
257
- }
258
- function createNodesAndEdgesFromElevator(nodes, edges, elevatorNode) {
259
- const createdNodes = [];
260
- const getOrCreateLevelNode = (level, builtFrom) => {
261
- let levelNode = createdNodes.find(({ coords }) => geo.Level.equals(level, coords.level));
262
- if (!levelNode) {
263
- levelNode = new OsmGraphNode(elevatorNode.coords.clone(), builtFrom);
264
- levelNode.coords.level = level;
265
- createdNodes.push(levelNode);
266
- nodes.push(levelNode);
267
- }
268
- return levelNode;
269
- };
270
- elevatorNode.edges.forEach((edge) => {
271
- if (geo.Level.isRange(edge.level)) {
272
- throw new Error("Cannot handle this elevator edge due to ambiguity");
273
- }
274
- const levelNode = getOrCreateLevelNode(edge.level, elevatorNode.builtFrom);
275
- if (edge.node1 === elevatorNode) {
276
- edge.node1 = levelNode;
277
- } else {
278
- edge.node2 = levelNode;
279
- }
280
- levelNode.edges.push(edge);
281
- });
282
- for (let i = 0; i < createdNodes.length; i++) {
283
- for (let j = i + 1; j < createdNodes.length; j++) {
284
- const createdNode1 = createdNodes[i];
285
- const createdNode2 = createdNodes[j];
286
- if (createdNode1.coords.level === null || createdNode2.coords.level === null) {
287
- continue;
288
- }
289
- const minLevel = Math.min(createdNode1.coords.level, createdNode2.coords.level);
290
- const maxLevel = Math.max(createdNode1.coords.level, createdNode2.coords.level);
291
- const newEdge = new OsmGraphEdge(
292
- createdNode1,
293
- createdNode2,
294
- [minLevel, maxLevel],
295
- elevatorNode.builtFrom
296
- );
297
- edges.push(newEdge);
298
- }
299
- }
300
- const elevatorNodeIndex = nodes.indexOf(elevatorNode);
301
- if (elevatorNodeIndex > -1) {
302
- nodes.splice(elevatorNodeIndex, 1);
303
- }
304
- }
305
- function createNetworkFromOsmModel(osmModel, waySelectionFilter = DEFAULT_WAY_SELECTOR) {
306
- const nodes = [];
307
- const edges = [];
308
- const nodesCreated = {};
309
- const elevatorNodes = [];
310
- const getOrCreateNode = (osmNode) => {
311
- let node = nodesCreated[osmNode.id];
312
- if (!node) {
313
- node = new OsmGraphNode(osmNode.coords, osmNode);
314
- nodesCreated[osmNode.id] = node;
315
- nodes.push(node);
316
- if (osmNode.tags.highway === "elevator") {
317
- elevatorNodes.push(node);
318
- }
319
- }
320
- return node;
321
- };
322
- osmModel.ways.forEach((way) => {
323
- if (!waySelectionFilter(way)) {
324
- return;
325
- }
326
- let firstNode = getOrCreateNode(way.nodes[0]);
327
- for (let i = 1; i < way.nodes.length; i++) {
328
- const secondNode = getOrCreateNode(way.nodes[i]);
329
- const edge = new OsmGraphEdge(firstNode, secondNode, way.level, way);
330
- manageOneWay(edge, way);
331
- edges.push(edge);
332
- firstNode = secondNode;
333
- }
334
- });
335
- elevatorNodes.forEach((node) => {
336
- createNodesAndEdgesFromElevator(nodes, edges, node);
337
- });
338
- const networkModel = new OsmNetwork(nodes, edges);
339
- OsmGraphNode.generateNodesLevels(networkModel.nodes);
340
- return networkModel;
341
- }
342
- const OsmNetworkUtils = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
343
- __proto__: null,
344
- HIGHWAYS_PEDESTRIANS,
345
- DEFAULT_WAY_SELECTOR,
346
- getNodeByName,
347
- getEdgeByName,
348
- createNetworkFromOsmModel
349
- }, Symbol.toStringTag, { value: "Module" }));
350
217
  exports.OsmElement = OsmElement;
351
- exports.OsmGraphEdge = OsmGraphEdge;
352
- exports.OsmGraphItinerary = OsmGraphItinerary;
353
- exports.OsmGraphNode = OsmGraphNode;
354
- exports.OsmGraphProjection = OsmGraphProjection;
355
- exports.OsmGraphRouter = OsmGraphRouter;
356
- exports.OsmGraphRouterOptions = OsmGraphRouterOptions;
357
- exports.OsmMapMatching = OsmMapMatching;
358
218
  exports.OsmModel = OsmModel;
359
- exports.OsmNetwork = OsmNetwork;
360
- exports.OsmNetworkUtils = OsmNetworkUtils;
361
219
  exports.OsmNode = OsmNode;
362
220
  exports.OsmParser = OsmParser;
221
+ exports.OsmRelation = OsmRelation;
363
222
  exports.OsmWay = OsmWay;
364
223
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/OsmElement.ts","../src/OsmModel.ts","../src/OsmNode.ts","../src/OsmWay.ts","../src/OsmRelation.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 OsmRelation from './OsmRelation.js';\nimport OsmWay from './OsmWay.js';\n\nclass OsmModel {\n\n nodes: OsmNode[];\n ways: OsmWay[];\n relations: OsmRelation[];\n\n constructor(nodes?: OsmNode[], ways?: OsmWay[], relations?: OsmRelation[]) {\n this.nodes = nodes || [];\n this.ways = ways || [];\n this.relations = relations || [];\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 getRelationById(id: number) {\n return this.relations.find(way => way.id === id) || null;\n }\n\n getRelationByName(name: string) {\n return this.relations.find(way => way.tags.name === name) || null;\n }\n}\n\nexport default OsmModel;\n","import { Coordinates } from '@wemap/geo';\n\nimport OsmElement, { OsmTags } from './OsmElement.js';\nimport OsmRelation from './OsmRelation.js';\nimport OsmWay from './OsmWay.js';\n\nclass OsmNode extends OsmElement {\n\n coords : Coordinates;\n ways: OsmWay[] = [];\n relations: OsmRelation[] = [];\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';\nimport OsmRelation from './OsmRelation.js';\n\nclass OsmWay extends OsmElement {\n\n nodes: OsmNode[] = [];\n relations: OsmRelation[] = [];\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 isElevator() {\n return this.tags.highway === 'elevator';\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","import OsmElement, { OsmTags } from './OsmElement.js';\nimport OsmNode from './OsmNode.js';\nimport OsmWay from './OsmWay.js';\nimport type { Position, Polygon } from 'geojson';\n\nexport type OsmRelationMember = {\n ref: OsmRelation | OsmWay | OsmNode,\n role: string\n}\n\nclass OsmRelation extends OsmElement {\n\n relations: OsmRelation[] = [];\n\n constructor(\n id: number,\n public members: OsmRelationMember[] = [],\n tags?: OsmTags\n ) {\n super(id, tags);\n }\n\n isMultipolygon() {\n return this.tags.type === 'multipolygon';\n }\n\n getGeoJsonPolygon(): Polygon | null {\n if (!this.isMultipolygon()) return null;\n const outer = this.members.find(member => member.ref instanceof OsmWay && member.role === 'outer');\n if (!outer) return null;\n const inners = this.members.filter(member => member.ref instanceof OsmWay && member.role === 'inner');\n return {\n type: \"Polygon\",\n coordinates: [outer, ...inners].map(member => {\n const way = member.ref as OsmWay;\n return way.nodes.map(node => [node.coords.lng, node.coords.lat] as Position);\n })\n }\n }\n}\n\nexport default OsmRelation;\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';\nimport OsmRelation from './OsmRelation.js';\n\ntype OsmXmlElement = { action?: 'delete' };\ntype OsmXmlNode = { id: string, lat: string, lon: string } & OsmXmlElement;\ntype OsmXmlWay = { id: string } & OsmXmlElement;\ntype OsmXmlRelation = { 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 | OsmRelation | 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 'relation': {\n if (isDeleted(node)) {\n buffer = null;\n break;\n }\n const osmRelation = this._parseRelation(node.attributes as OsmXmlRelation);\n buffer = osmRelation;\n model.relations.push(osmRelation);\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 case 'member': {\n if (!buffer || !(buffer instanceof OsmRelation)) {\n return;\n }\n const memberId = Number(node.attributes.ref);\n const memberType = node.attributes.type;\n let refElement: OsmNode | OsmWay | OsmRelation | null = null;\n memberType === 'node' && (refElement = model.getNodeById(memberId));\n memberType === 'way' && (refElement = model.getWayById(memberId));\n memberType === 'relation' && (refElement = model.getRelationById(memberId));\n\n if (!refElement) {\n throw Error('Member: ' + memberId + ' in relation ' + buffer.id + ' not found');\n }\n\n buffer.members.push({ ref: refElement, role: node.attributes.role });\n refElement.relations.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 static _parseRelation(attr: { id: string }) {\n return new OsmRelation(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 OsmGraphEdge 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', 'elevator'];\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","GraphNode","GraphEdge","GraphItinerary","Network","GraphProjection","GraphRouter","GraphRouterOptions","MapMatching"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/OsmElement.ts","../src/OsmModel.ts","../src/OsmNode.ts","../src/OsmWay.ts","../src/OsmRelation.ts","../src/OsmParser.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 OsmRelation from './OsmRelation.js';\nimport OsmWay from './OsmWay.js';\n\nclass OsmModel {\n\n nodes: OsmNode[];\n ways: OsmWay[];\n relations: OsmRelation[];\n\n constructor(nodes?: OsmNode[], ways?: OsmWay[], relations?: OsmRelation[]) {\n this.nodes = nodes || [];\n this.ways = ways || [];\n this.relations = relations || [];\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 getRelationById(id: number) {\n return this.relations.find(way => way.id === id) || null;\n }\n\n getRelationByName(name: string) {\n return this.relations.find(way => way.tags.name === name) || null;\n }\n}\n\nexport default OsmModel;\n","import { Coordinates } from '@wemap/geo';\n\nimport OsmElement, { OsmTags } from './OsmElement.js';\nimport OsmRelation from './OsmRelation.js';\nimport OsmWay from './OsmWay.js';\n\nclass OsmNode extends OsmElement {\n\n coords : Coordinates;\n ways: OsmWay[] = [];\n relations: OsmRelation[] = [];\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';\nimport OsmRelation from './OsmRelation.js';\n\nclass OsmWay extends OsmElement {\n\n nodes: OsmNode[] = [];\n relations: OsmRelation[] = [];\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 isElevator() {\n return this.tags.highway === 'elevator';\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","import OsmElement, { OsmTags } from './OsmElement.js';\nimport OsmNode from './OsmNode.js';\nimport OsmWay from './OsmWay.js';\nimport type { Position, Polygon } from 'geojson';\n\nexport type OsmRelationMember = {\n ref: OsmRelation | OsmWay | OsmNode,\n role: string\n}\n\nclass OsmRelation extends OsmElement {\n\n relations: OsmRelation[] = [];\n\n constructor(\n id: number,\n public members: OsmRelationMember[] = [],\n tags?: OsmTags\n ) {\n super(id, tags);\n }\n\n isMultipolygon() {\n return this.tags.type === 'multipolygon';\n }\n\n getGeoJsonPolygon(): Polygon | null {\n if (!this.isMultipolygon()) return null;\n const outer = this.members.find(member => member.ref instanceof OsmWay && member.role === 'outer');\n if (!outer) return null;\n const inners = this.members.filter(member => member.ref instanceof OsmWay && member.role === 'inner');\n return {\n type: \"Polygon\",\n coordinates: [outer, ...inners].map(member => {\n const way = member.ref as OsmWay;\n return way.nodes.map(node => [node.coords.lng, node.coords.lat] as Position);\n })\n }\n }\n}\n\nexport default OsmRelation;\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';\nimport OsmRelation from './OsmRelation.js';\n\ntype OsmXmlElement = { action?: 'delete' };\ntype OsmXmlNode = { id: string, lat: string, lon: string } & OsmXmlElement;\ntype OsmXmlWay = { id: string } & OsmXmlElement;\ntype OsmXmlRelation = { 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 | OsmRelation | 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 'relation': {\n if (isDeleted(node)) {\n buffer = null;\n break;\n }\n const osmRelation = this._parseRelation(node.attributes as OsmXmlRelation);\n buffer = osmRelation;\n model.relations.push(osmRelation);\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 case 'member': {\n if (!buffer || !(buffer instanceof OsmRelation)) {\n return;\n }\n const memberId = Number(node.attributes.ref);\n const memberType = node.attributes.type;\n let refElement: OsmNode | OsmWay | OsmRelation | null = null;\n memberType === 'node' && (refElement = model.getNodeById(memberId));\n memberType === 'way' && (refElement = model.getWayById(memberId));\n memberType === 'relation' && (refElement = model.getRelationById(memberId));\n\n if (!refElement) {\n throw Error('Member: ' + memberId + ' in relation ' + buffer.id + ' not found');\n }\n\n buffer.members.push({ ref: refElement, role: node.attributes.role });\n refElement.relations.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 static _parseRelation(attr: { id: string }) {\n return new OsmRelation(Number(attr.id));\n }\n}\n\nexport default OsmParser;\n"],"names":["SaxesParser","Level","Coordinates"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -5,7 +5,7 @@ var __publicField = (obj, key, value) => {
5
5
  return value;
6
6
  };
7
7
  import { SaxesParser } from "saxes";
8
- import { Level, Coordinates, GraphNode, GraphEdge, GraphItinerary, Network, GraphProjection, GraphRouter, GraphRouterOptions, MapMatching } from "@wemap/geo";
8
+ import { Level, Coordinates } from "@wemap/geo";
9
9
  class OsmElement {
10
10
  constructor(id, tags) {
11
11
  __publicField(this, "id");
@@ -212,153 +212,12 @@ class OsmParser {
212
212
  return new OsmRelation(Number(attr.id));
213
213
  }
214
214
  }
215
- class OsmGraphNode extends GraphNode {
216
- }
217
- class OsmGraphEdge extends GraphEdge {
218
- }
219
- class OsmGraphItinerary extends GraphItinerary {
220
- static fromNetworkNodes(start, end, networkNodes, edgesWeights) {
221
- return super.fromNetworkNodes(start, end, networkNodes, edgesWeights);
222
- }
223
- }
224
- class OsmNetwork extends Network {
225
- static fromCoordinates(segments) {
226
- return super.fromCoordinates(segments);
227
- }
228
- }
229
- class OsmGraphProjection extends GraphProjection {
230
- }
231
- class OsmGraphRouter extends GraphRouter {
232
- }
233
- class OsmGraphRouterOptions extends GraphRouterOptions {
234
- }
235
- class OsmMapMatching extends MapMatching {
236
- }
237
- const HIGHWAYS_PEDESTRIANS = ["footway", "steps", "pedestrian", "living_street", "path", "track", "sidewalk", "elevator"];
238
- const DEFAULT_WAY_SELECTOR = (way) => {
239
- return HIGHWAYS_PEDESTRIANS.includes(way.tags.highway) || way.tags.footway === "sidewalk" || way.tags.public_transport === "platform" || way.tags.railway === "platform";
240
- };
241
- function getNodeByName(network, name) {
242
- return network.nodes.find(({ builtFrom }) => (builtFrom == null ? void 0 : builtFrom.tags.name) === name);
243
- }
244
- function getEdgeByName(network, name) {
245
- return network.edges.find(({ builtFrom }) => (builtFrom == null ? void 0 : builtFrom.tags.name) === name);
246
- }
247
- function manageOneWay(edge, way) {
248
- const { highway, oneway, conveying } = way.tags;
249
- edge.isOneway = Boolean(oneway === "yes" || oneway === "true" || oneway === "1" || conveying && highway && ["forward", "backward"].includes(conveying));
250
- if (edge.isOneway && conveying === "backward") {
251
- const tmpNode = edge.node1;
252
- edge.node1 = edge.node2;
253
- edge.node2 = tmpNode;
254
- }
255
- }
256
- function createNodesAndEdgesFromElevator(nodes, edges, elevatorNode) {
257
- const createdNodes = [];
258
- const getOrCreateLevelNode = (level, builtFrom) => {
259
- let levelNode = createdNodes.find(({ coords }) => Level.equals(level, coords.level));
260
- if (!levelNode) {
261
- levelNode = new OsmGraphNode(elevatorNode.coords.clone(), builtFrom);
262
- levelNode.coords.level = level;
263
- createdNodes.push(levelNode);
264
- nodes.push(levelNode);
265
- }
266
- return levelNode;
267
- };
268
- elevatorNode.edges.forEach((edge) => {
269
- if (Level.isRange(edge.level)) {
270
- throw new Error("Cannot handle this elevator edge due to ambiguity");
271
- }
272
- const levelNode = getOrCreateLevelNode(edge.level, elevatorNode.builtFrom);
273
- if (edge.node1 === elevatorNode) {
274
- edge.node1 = levelNode;
275
- } else {
276
- edge.node2 = levelNode;
277
- }
278
- levelNode.edges.push(edge);
279
- });
280
- for (let i = 0; i < createdNodes.length; i++) {
281
- for (let j = i + 1; j < createdNodes.length; j++) {
282
- const createdNode1 = createdNodes[i];
283
- const createdNode2 = createdNodes[j];
284
- if (createdNode1.coords.level === null || createdNode2.coords.level === null) {
285
- continue;
286
- }
287
- const minLevel = Math.min(createdNode1.coords.level, createdNode2.coords.level);
288
- const maxLevel = Math.max(createdNode1.coords.level, createdNode2.coords.level);
289
- const newEdge = new OsmGraphEdge(
290
- createdNode1,
291
- createdNode2,
292
- [minLevel, maxLevel],
293
- elevatorNode.builtFrom
294
- );
295
- edges.push(newEdge);
296
- }
297
- }
298
- const elevatorNodeIndex = nodes.indexOf(elevatorNode);
299
- if (elevatorNodeIndex > -1) {
300
- nodes.splice(elevatorNodeIndex, 1);
301
- }
302
- }
303
- function createNetworkFromOsmModel(osmModel, waySelectionFilter = DEFAULT_WAY_SELECTOR) {
304
- const nodes = [];
305
- const edges = [];
306
- const nodesCreated = {};
307
- const elevatorNodes = [];
308
- const getOrCreateNode = (osmNode) => {
309
- let node = nodesCreated[osmNode.id];
310
- if (!node) {
311
- node = new OsmGraphNode(osmNode.coords, osmNode);
312
- nodesCreated[osmNode.id] = node;
313
- nodes.push(node);
314
- if (osmNode.tags.highway === "elevator") {
315
- elevatorNodes.push(node);
316
- }
317
- }
318
- return node;
319
- };
320
- osmModel.ways.forEach((way) => {
321
- if (!waySelectionFilter(way)) {
322
- return;
323
- }
324
- let firstNode = getOrCreateNode(way.nodes[0]);
325
- for (let i = 1; i < way.nodes.length; i++) {
326
- const secondNode = getOrCreateNode(way.nodes[i]);
327
- const edge = new OsmGraphEdge(firstNode, secondNode, way.level, way);
328
- manageOneWay(edge, way);
329
- edges.push(edge);
330
- firstNode = secondNode;
331
- }
332
- });
333
- elevatorNodes.forEach((node) => {
334
- createNodesAndEdgesFromElevator(nodes, edges, node);
335
- });
336
- const networkModel = new OsmNetwork(nodes, edges);
337
- OsmGraphNode.generateNodesLevels(networkModel.nodes);
338
- return networkModel;
339
- }
340
- const OsmNetworkUtils = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
341
- __proto__: null,
342
- HIGHWAYS_PEDESTRIANS,
343
- DEFAULT_WAY_SELECTOR,
344
- getNodeByName,
345
- getEdgeByName,
346
- createNetworkFromOsmModel
347
- }, Symbol.toStringTag, { value: "Module" }));
348
215
  export {
349
216
  OsmElement,
350
- OsmGraphEdge,
351
- OsmGraphItinerary,
352
- OsmGraphNode,
353
- OsmGraphProjection,
354
- OsmGraphRouter,
355
- OsmGraphRouterOptions,
356
- OsmMapMatching,
357
217
  OsmModel,
358
- OsmNetwork,
359
- OsmNetworkUtils,
360
218
  OsmNode,
361
219
  OsmParser,
220
+ OsmRelation,
362
221
  OsmWay
363
222
  };
364
223
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/OsmElement.ts","../src/OsmModel.ts","../src/OsmNode.ts","../src/OsmWay.ts","../src/OsmRelation.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 OsmRelation from './OsmRelation.js';\nimport OsmWay from './OsmWay.js';\n\nclass OsmModel {\n\n nodes: OsmNode[];\n ways: OsmWay[];\n relations: OsmRelation[];\n\n constructor(nodes?: OsmNode[], ways?: OsmWay[], relations?: OsmRelation[]) {\n this.nodes = nodes || [];\n this.ways = ways || [];\n this.relations = relations || [];\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 getRelationById(id: number) {\n return this.relations.find(way => way.id === id) || null;\n }\n\n getRelationByName(name: string) {\n return this.relations.find(way => way.tags.name === name) || null;\n }\n}\n\nexport default OsmModel;\n","import { Coordinates } from '@wemap/geo';\n\nimport OsmElement, { OsmTags } from './OsmElement.js';\nimport OsmRelation from './OsmRelation.js';\nimport OsmWay from './OsmWay.js';\n\nclass OsmNode extends OsmElement {\n\n coords : Coordinates;\n ways: OsmWay[] = [];\n relations: OsmRelation[] = [];\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';\nimport OsmRelation from './OsmRelation.js';\n\nclass OsmWay extends OsmElement {\n\n nodes: OsmNode[] = [];\n relations: OsmRelation[] = [];\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 isElevator() {\n return this.tags.highway === 'elevator';\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","import OsmElement, { OsmTags } from './OsmElement.js';\nimport OsmNode from './OsmNode.js';\nimport OsmWay from './OsmWay.js';\nimport type { Position, Polygon } from 'geojson';\n\nexport type OsmRelationMember = {\n ref: OsmRelation | OsmWay | OsmNode,\n role: string\n}\n\nclass OsmRelation extends OsmElement {\n\n relations: OsmRelation[] = [];\n\n constructor(\n id: number,\n public members: OsmRelationMember[] = [],\n tags?: OsmTags\n ) {\n super(id, tags);\n }\n\n isMultipolygon() {\n return this.tags.type === 'multipolygon';\n }\n\n getGeoJsonPolygon(): Polygon | null {\n if (!this.isMultipolygon()) return null;\n const outer = this.members.find(member => member.ref instanceof OsmWay && member.role === 'outer');\n if (!outer) return null;\n const inners = this.members.filter(member => member.ref instanceof OsmWay && member.role === 'inner');\n return {\n type: \"Polygon\",\n coordinates: [outer, ...inners].map(member => {\n const way = member.ref as OsmWay;\n return way.nodes.map(node => [node.coords.lng, node.coords.lat] as Position);\n })\n }\n }\n}\n\nexport default OsmRelation;\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';\nimport OsmRelation from './OsmRelation.js';\n\ntype OsmXmlElement = { action?: 'delete' };\ntype OsmXmlNode = { id: string, lat: string, lon: string } & OsmXmlElement;\ntype OsmXmlWay = { id: string } & OsmXmlElement;\ntype OsmXmlRelation = { 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 | OsmRelation | 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 'relation': {\n if (isDeleted(node)) {\n buffer = null;\n break;\n }\n const osmRelation = this._parseRelation(node.attributes as OsmXmlRelation);\n buffer = osmRelation;\n model.relations.push(osmRelation);\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 case 'member': {\n if (!buffer || !(buffer instanceof OsmRelation)) {\n return;\n }\n const memberId = Number(node.attributes.ref);\n const memberType = node.attributes.type;\n let refElement: OsmNode | OsmWay | OsmRelation | null = null;\n memberType === 'node' && (refElement = model.getNodeById(memberId));\n memberType === 'way' && (refElement = model.getWayById(memberId));\n memberType === 'relation' && (refElement = model.getRelationById(memberId));\n\n if (!refElement) {\n throw Error('Member: ' + memberId + ' in relation ' + buffer.id + ' not found');\n }\n\n buffer.members.push({ ref: refElement, role: node.attributes.role });\n refElement.relations.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 static _parseRelation(attr: { id: string }) {\n return new OsmRelation(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 OsmGraphEdge 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', 'elevator'];\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":[],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/OsmElement.ts","../src/OsmModel.ts","../src/OsmNode.ts","../src/OsmWay.ts","../src/OsmRelation.ts","../src/OsmParser.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 OsmRelation from './OsmRelation.js';\nimport OsmWay from './OsmWay.js';\n\nclass OsmModel {\n\n nodes: OsmNode[];\n ways: OsmWay[];\n relations: OsmRelation[];\n\n constructor(nodes?: OsmNode[], ways?: OsmWay[], relations?: OsmRelation[]) {\n this.nodes = nodes || [];\n this.ways = ways || [];\n this.relations = relations || [];\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 getRelationById(id: number) {\n return this.relations.find(way => way.id === id) || null;\n }\n\n getRelationByName(name: string) {\n return this.relations.find(way => way.tags.name === name) || null;\n }\n}\n\nexport default OsmModel;\n","import { Coordinates } from '@wemap/geo';\n\nimport OsmElement, { OsmTags } from './OsmElement.js';\nimport OsmRelation from './OsmRelation.js';\nimport OsmWay from './OsmWay.js';\n\nclass OsmNode extends OsmElement {\n\n coords : Coordinates;\n ways: OsmWay[] = [];\n relations: OsmRelation[] = [];\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';\nimport OsmRelation from './OsmRelation.js';\n\nclass OsmWay extends OsmElement {\n\n nodes: OsmNode[] = [];\n relations: OsmRelation[] = [];\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 isElevator() {\n return this.tags.highway === 'elevator';\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","import OsmElement, { OsmTags } from './OsmElement.js';\nimport OsmNode from './OsmNode.js';\nimport OsmWay from './OsmWay.js';\nimport type { Position, Polygon } from 'geojson';\n\nexport type OsmRelationMember = {\n ref: OsmRelation | OsmWay | OsmNode,\n role: string\n}\n\nclass OsmRelation extends OsmElement {\n\n relations: OsmRelation[] = [];\n\n constructor(\n id: number,\n public members: OsmRelationMember[] = [],\n tags?: OsmTags\n ) {\n super(id, tags);\n }\n\n isMultipolygon() {\n return this.tags.type === 'multipolygon';\n }\n\n getGeoJsonPolygon(): Polygon | null {\n if (!this.isMultipolygon()) return null;\n const outer = this.members.find(member => member.ref instanceof OsmWay && member.role === 'outer');\n if (!outer) return null;\n const inners = this.members.filter(member => member.ref instanceof OsmWay && member.role === 'inner');\n return {\n type: \"Polygon\",\n coordinates: [outer, ...inners].map(member => {\n const way = member.ref as OsmWay;\n return way.nodes.map(node => [node.coords.lng, node.coords.lat] as Position);\n })\n }\n }\n}\n\nexport default OsmRelation;\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';\nimport OsmRelation from './OsmRelation.js';\n\ntype OsmXmlElement = { action?: 'delete' };\ntype OsmXmlNode = { id: string, lat: string, lon: string } & OsmXmlElement;\ntype OsmXmlWay = { id: string } & OsmXmlElement;\ntype OsmXmlRelation = { 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 | OsmRelation | 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 'relation': {\n if (isDeleted(node)) {\n buffer = null;\n break;\n }\n const osmRelation = this._parseRelation(node.attributes as OsmXmlRelation);\n buffer = osmRelation;\n model.relations.push(osmRelation);\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 case 'member': {\n if (!buffer || !(buffer instanceof OsmRelation)) {\n return;\n }\n const memberId = Number(node.attributes.ref);\n const memberType = node.attributes.type;\n let refElement: OsmNode | OsmWay | OsmRelation | null = null;\n memberType === 'node' && (refElement = model.getNodeById(memberId));\n memberType === 'way' && (refElement = model.getWayById(memberId));\n memberType === 'relation' && (refElement = model.getRelationById(memberId));\n\n if (!refElement) {\n throw Error('Member: ' + memberId + ' in relation ' + buffer.id + ' not found');\n }\n\n buffer.members.push({ ref: refElement, role: node.attributes.role });\n refElement.relations.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 static _parseRelation(attr: { id: string }) {\n return new OsmRelation(Number(attr.id));\n }\n}\n\nexport default OsmParser;\n"],"names":[],"mappings":";;;;;;;;AAGA,MAAM,WAAW;AAAA,EAKb,YAAY,IAAY,MAAgB;AAHxC;AACA;AAGI,SAAK,KAAK;AACL,SAAA,OAAO,QAAQ;EACxB;AACJ;ACRA,MAAM,SAAS;AAAA,EAMX,YAAY,OAAmB,MAAiB,WAA2B;AAJ3E;AACA;AACA;AAGS,SAAA,QAAQ,SAAS;AACjB,SAAA,OAAO,QAAQ;AACf,SAAA,YAAY,aAAa;EAClC;AAAA,EAEA,YAAY,IAAY;AACpB,WAAO,KAAK,MAAM,KAAK,UAAQ,KAAK,OAAO,EAAE,KAAK;AAAA,EACtD;AAAA,EAEA,cAAc,MAAc;AACjB,WAAA,KAAK,MAAM,KAAK,CAAA,SAAQ,KAAK,KAAK,SAAS,IAAI,KAAK;AAAA,EAC/D;AAAA,EAEA,WAAW,IAAY;AACnB,WAAO,KAAK,KAAK,KAAK,SAAO,IAAI,OAAO,EAAE,KAAK;AAAA,EACnD;AAAA,EAEA,aAAa,MAAc;AAChB,WAAA,KAAK,KAAK,KAAK,CAAA,QAAO,IAAI,KAAK,SAAS,IAAI,KAAK;AAAA,EAC5D;AAAA,EAEA,gBAAgB,IAAY;AACxB,WAAO,KAAK,UAAU,KAAK,SAAO,IAAI,OAAO,EAAE,KAAK;AAAA,EACxD;AAAA,EAEA,kBAAkB,MAAc;AACrB,WAAA,KAAK,UAAU,KAAK,CAAA,QAAO,IAAI,KAAK,SAAS,IAAI,KAAK;AAAA,EACjE;AACJ;ACjCA,MAAM,gBAAgB,WAAW;AAAA,EAM7B,YAAY,IAAY,QAAqB,MAAgB;AACzD,UAAM,IAAI,IAAI;AALlB;AACA,gCAAiB,CAAA;AACjB,qCAA2B,CAAA;AAIvB,SAAK,SAAS;AAAA,EAClB;AAAA,EAEA,IAAI,aAAa;AACN,WAAA,KAAK,KAAK,YAAY;AAAA,EACjC;AAAA,EAEA,IAAI,cAAc;AACd,WAAO,KAAK;AAAA,EAChB;AACJ;ACnBA,MAAM,eAAe,WAAW;AAAA,EAM5B,YAAY,IAAY,MAAgB,QAAiB,MAAM;AAC3D,UAAM,IAAI,IAAI;AALlB,iCAAmB,CAAA;AACnB,qCAA2B,CAAA;AAC3B,iCAAiB;AAIb,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEA,IAAI,YAAY;AACL,WAAA,KAAK,KAAK,YAAY;AAAA,EACjC;AAAA,EAEA,IAAI,cAAc;AACP,WAAA,KAAK,KAAK,eAAe,WAAW;AAAA,EAC/C;AAAA,EAEA,IAAI,cAAc;AACP,WAAA,KAAK,aAAa,KAAK;AAAA,EAClC;AAAA,EAEA,IAAI,kBAAkB;AACX,WAAA,CAAC,KAAK,aAAa,KAAK;AAAA,EACnC;AAAA,EAEA,IAAI,aAAa;AACN,WAAA,KAAK,KAAK,YAAY;AAAA,EACjC;AAAA,EAEA,IAAI,SAAS;AAET,WAAO,KAAK,MAAM,OAAO,KAAK,MAAM,KAAK,MAAM,SAAS;AAAA,EAC5D;AACJ;AC9BA,MAAM,oBAAoB,WAAW;AAAA,EAIjC,YACI,IACO,UAA+B,CAAA,GACtC,MACF;AACE,UAAM,IAAI,IAAI;AAPlB,qCAA2B,CAAA;AAIhB,SAAA,UAAA;AAAA,EAIX;AAAA,EAEA,iBAAiB;AACN,WAAA,KAAK,KAAK,SAAS;AAAA,EAC9B;AAAA,EAEA,oBAAoC;AAC5B,QAAA,CAAC,KAAK,eAAe;AAAU,aAAA;AAC7B,UAAA,QAAQ,KAAK,QAAQ,KAAK,CAAA,WAAU,OAAO,eAAe,UAAU,OAAO,SAAS,OAAO;AACjG,QAAI,CAAC;AAAc,aAAA;AACb,UAAA,SAAS,KAAK,QAAQ,OAAO,CAAA,WAAU,OAAO,eAAe,UAAU,OAAO,SAAS,OAAO;AAC7F,WAAA;AAAA,MACH,MAAM;AAAA,MACN,aAAa,CAAC,OAAO,GAAG,MAAM,EAAE,IAAI,CAAU,WAAA;AAC1C,cAAM,MAAM,OAAO;AACZ,eAAA,IAAI,MAAM,IAAI,CAAQ,SAAA,CAAC,KAAK,OAAO,KAAK,KAAK,OAAO,GAAG,CAAa;AAAA,MAAA,CAC9E;AAAA,IAAA;AAAA,EAET;AACJ;ACtBA,MAAM,UAAU;AAAA,EAEZ,OAAO,kBAAkB,cAAsB;AAErC,UAAA,QAAQ,IAAI;AACZ,UAAA,SAAS,IAAI;AAEf,QAAA;AAEE,UAAA,YAAY,CAAC,YACf,QAAQ,WAAW,UAAU,QAAQ,WAAW,WAAW;AAExD,WAAA,GAAG,WAAW,CAAC,SAAS;AAE3B,cAAQ,KAAK,MAAM;AAAA,QACf,KAAK,QAAQ;AACL,cAAA,UAAU,IAAI,GAAG;AACR,qBAAA;AACT;AAAA,UACJ;AACA,gBAAM,UAAU,KAAK,WAAW,KAAK,UAAwB;AACpD,mBAAA;AACH,gBAAA,MAAM,KAAK,OAAO;AACxB;AAAA,QACJ;AAAA,QACA,KAAK,OAAO;AACJ,cAAA,UAAU,IAAI,GAAG;AACR,qBAAA;AACT;AAAA,UACJ;AACA,gBAAM,SAAS,KAAK,UAAU,KAAK,UAAuB;AACjD,mBAAA;AACH,gBAAA,KAAK,KAAK,MAAM;AACtB;AAAA,QACJ;AAAA,QACA,KAAK,YAAY;AACT,cAAA,UAAU,IAAI,GAAG;AACR,qBAAA;AACT;AAAA,UACJ;AACA,gBAAM,cAAc,KAAK,eAAe,KAAK,UAA4B;AAChE,mBAAA;AACH,gBAAA,UAAU,KAAK,WAAW;AAChC;AAAA,QACJ;AAAA,QACA,KAAK,OAAO;AACR,cAAI,CAAC,QAAQ;AACT;AAAA,UACJ;AACM,gBAAA;AAAA,YACF;AAAA,YAAG;AAAA,UAAA,IACH,KAAK;AACT,iBAAO,KAAK,KAAK;AACjB;AAAA,QACJ;AAAA,QACA,KAAK,MAAM;AACP,cAAI,CAAC,UAAU,EAAE,kBAAkB,SAAS;AACxC;AAAA,UACJ;AACA,gBAAM,SAAS,OAAO,KAAK,WAAW,GAAG;AACnC,gBAAA,UAAU,MAAM,YAAY,MAAM;AACxC,cAAI,CAAC,SAAS;AACV,kBAAM,MAAM,WAAW,SAAS,aAAa,OAAO,KAAK,YAAY;AAAA,UACzE;AAEO,iBAAA,MAAM,KAAK,OAAO;AACjB,kBAAA,KAAK,KAAK,MAAM;AACxB;AAAA,QACJ;AAAA,QACA,KAAK,UAAU;AACX,cAAI,CAAC,UAAU,EAAE,kBAAkB,cAAc;AAC7C;AAAA,UACJ;AACA,gBAAM,WAAW,OAAO,KAAK,WAAW,GAAG;AACrC,gBAAA,aAAa,KAAK,WAAW;AACnC,cAAI,aAAoD;AACxD,yBAAe,WAAW,aAAa,MAAM,YAAY,QAAQ;AACjE,yBAAe,UAAU,aAAa,MAAM,WAAW,QAAQ;AAC/D,yBAAe,eAAe,aAAa,MAAM,gBAAgB,QAAQ;AAEzE,cAAI,CAAC,YAAY;AACb,kBAAM,MAAM,aAAa,WAAW,kBAAkB,OAAO,KAAK,YAAY;AAAA,UAClF;AAEO,iBAAA,QAAQ,KAAK,EAAE,KAAK,YAAY,MAAM,KAAK,WAAW,KAAA,CAAM;AACxD,qBAAA,UAAU,KAAK,MAAM;AAChC;AAAA,QACJ;AAAA,MACJ;AAAA,IAAA,CACH;AAED,WAAO,MAAM,YAAY;AAEzB,aAAS,IAAI,GAAG,IAAI,MAAM,KAAK,QAAQ,KAAK;AAClC,YAAA,MAAM,MAAM,KAAK;AACnB,UAAA,IAAI,KAAK,OAAO;AAChB,YAAI,QAAQ,MAAM,WAAW,IAAI,KAAK,KAAK;AAAA,MAC/C;AAAA,IACJ;AAEO,WAAA;AAAA,EACX;AAAA,EAGA,OAAO,WAAW,MAAkB;AAChC,WAAO,IAAI;AAAA,MACP,OAAO,KAAK,EAAE;AAAA,MACd,IAAI,YAAY,OAAO,KAAK,GAAG,GAAG,OAAO,KAAK,GAAG,CAAC;AAAA,IAAA;AAAA,EAC1D;AAAA,EAEA,OAAO,UAAU,MAAsB;AACnC,WAAO,IAAI,OAAO,OAAO,KAAK,EAAE,CAAC;AAAA,EACrC;AAAA,EAEA,OAAO,eAAe,MAAsB;AACxC,WAAO,IAAI,YAAY,OAAO,KAAK,EAAE,CAAC;AAAA,EAC1C;AACJ;"}
package/index.ts CHANGED
@@ -1,15 +1,6 @@
1
- export { default as OsmElement } from './src/OsmElement.js';
1
+ export { default as OsmElement, type OsmTags } from './src/OsmElement.js';
2
2
  export { default as OsmModel } from './src/OsmModel.js';
3
3
  export { default as OsmNode } from './src/OsmNode.js';
4
4
  export { default as OsmParser } from './src/OsmParser.js';
5
+ export { default as OsmRelation } from './src/OsmRelation.js';
5
6
  export { default as OsmWay } from './src/OsmWay.js';
6
-
7
- export { default as OsmGraphNode } from './src/graph/OsmGraphNode.js';
8
- export { default as OsmGraphEdge } from './src/graph/OsmGraphEdge.js';
9
- export { default as OsmGraphItinerary } from './src/graph/OsmGraphItinerary.js';
10
- export { default as OsmNetwork } from './src/graph/OsmNetwork.js';
11
- export { default as OsmGraphProjection } from './src/graph/OsmGraphProjection.js';
12
- export { default as OsmGraphRouter } from './src/graph/OsmGraphRouter.js';
13
- export { default as OsmGraphRouterOptions } from './src/graph/OsmGraphRouterOptions.js';
14
- export { default as OsmMapMatching } from './src/graph/OsmMapMatching.js';
15
- export * as OsmNetworkUtils from './src/graph/OsmNetworkUtils.js';
package/package.json CHANGED
@@ -12,7 +12,7 @@
12
12
  "directory": "packages/osm"
13
13
  },
14
14
  "name": "@wemap/osm",
15
- "version": "11.0.0-alpha.18",
15
+ "version": "11.0.0-alpha.19",
16
16
  "bugs": {
17
17
  "url": "https://github.com/wemap/wemap-modules-js/issues"
18
18
  },
@@ -29,8 +29,8 @@
29
29
  ],
30
30
  "license": "ISC",
31
31
  "dependencies": {
32
- "@wemap/geo": "^11.0.0-alpha.16",
33
- "@wemap/logger": "^11.0.0-alpha.16",
32
+ "@wemap/geo": "^11.0.0-alpha.19",
33
+ "@wemap/logger": "^11.0.0-alpha.19",
34
34
  "saxes": "^5.0.1"
35
35
  },
36
36
  "exports": {
@@ -39,5 +39,5 @@
39
39
  "require": "./dist/index.js"
40
40
  }
41
41
  },
42
- "gitHead": "46bef48dec0bce16030ab353c300db8d0f649bd1"
42
+ "gitHead": "36f2c147abea666db5b5192b42ee7aaf455cef3c"
43
43
  }
@@ -1,5 +0,0 @@
1
- import { GraphEdge } from "@wemap/geo";
2
- import OsmNode from "../OsmNode";
3
- import OsmWay from "../OsmWay";
4
-
5
- export default class OsmGraphEdge extends GraphEdge<OsmNode | OsmWay, OsmNode>{ }
@@ -1,13 +0,0 @@
1
- import { Coordinates, GraphItinerary, GraphNode } from '@wemap/geo';
2
-
3
- import { N, E } from './OsmNetworkUtils.js';
4
-
5
- export default class OsmGraphItinerary extends GraphItinerary<N, E>{
6
-
7
- static fromNetworkNodes<A = N, B = E>(
8
- start: Coordinates, end: Coordinates,
9
- networkNodes: GraphNode<A, B>[], edgesWeights: number[]
10
- ) {
11
- return super.fromNetworkNodes(start, end, networkNodes, edgesWeights) as GraphItinerary<A, B>;
12
- }
13
- }
@@ -1,5 +0,0 @@
1
- import { GraphNode } from "@wemap/geo";
2
- import OsmNode from "../OsmNode";
3
- import OsmWay from "../OsmWay";
4
-
5
- export default class OsmGraphNode extends GraphNode<OsmNode, OsmNode | OsmWay>{ }
@@ -1,5 +0,0 @@
1
- import { GraphProjection } from '@wemap/geo';
2
-
3
- import { N, E } from './OsmNetworkUtils.js';
4
-
5
- export default class OsmGraphProjection extends GraphProjection<N, E>{ }
@@ -1,5 +0,0 @@
1
- import { GraphRouter } from '@wemap/geo';
2
-
3
- import { N, E } from './OsmNetworkUtils.js';
4
-
5
- export default class OsmGraphRouter extends GraphRouter<N, E>{ }
@@ -1,5 +0,0 @@
1
- import { GraphRouterOptions } from '@wemap/geo';
2
-
3
- import { N, E } from './OsmNetworkUtils.js';
4
-
5
- export default class OsmGraphRouterOptions extends GraphRouterOptions<N, E>{ }
@@ -1,5 +0,0 @@
1
- import { MapMatching } from '@wemap/geo';
2
-
3
- import { N, E } from './OsmNetworkUtils.js';
4
-
5
- export default class OsmMapMatching extends MapMatching<N, E>{ }
@@ -1,9 +0,0 @@
1
- import { Coordinates, Network } from '@wemap/geo';
2
-
3
- import { N, E } from './OsmNetworkUtils.js';
4
-
5
- export default class OsmNetwork extends Network<N, E>{
6
- static fromCoordinates<A = N, B = E>(segments: Coordinates[][]) {
7
- return super.fromCoordinates<N, E>(segments) as Network<A, B>;
8
- }
9
- }
@@ -1,100 +0,0 @@
1
- import chai from 'chai';
2
- import fs from 'fs';
3
- import path from 'path';
4
- import { fileURLToPath } from 'url';
5
-
6
- import { verifyCoherence } from '../../../geo/tests/CommonTest.js';
7
-
8
- import OsmModel from '../OsmModel.js';
9
- import OsmParser from '../OsmParser.js';
10
- import OsmNetwork from './OsmNetwork.js';
11
- import { createNetworkFromOsmModel, getNodeByName, getEdgeByName } from './OsmNetworkUtils.js';
12
-
13
- const { expect } = chai;
14
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
15
-
16
- const loadFile = (fileName: string) => {
17
- const filePath = path.resolve(__dirname, '../../assets/' + fileName);
18
- return fs.readFileSync(filePath, 'utf8');
19
- };
20
-
21
- describe('OsmNetwork - simple', () => {
22
-
23
- let osmModel: OsmModel;
24
-
25
- let network: OsmNetwork;
26
- const osmXmlString = loadFile('network-simple.osm');
27
-
28
- it('Network creation', () => {
29
-
30
- osmModel = OsmParser.parseOsmXmlString(osmXmlString);
31
- network = createNetworkFromOsmModel(osmModel);
32
-
33
- verifyCoherence(network);
34
- expect(network.nodes.length).equals(3);
35
- expect(network.edges.length).equals(2);
36
- });
37
-
38
-
39
- it('Network creation - waySelectionFilter', () => {
40
-
41
- const selectionNetwork = createNetworkFromOsmModel(osmModel, () => true);
42
-
43
- verifyCoherence(selectionNetwork);
44
- expect(selectionNetwork.nodes.length).equals(4);
45
- expect(selectionNetwork.edges.length).equals(3);
46
- });
47
-
48
- it('Network creation - elevator', () => {
49
-
50
- const elevatorModel = OsmParser.parseOsmXmlString(loadFile('network-elevator.osm'));
51
- const elevatorNetwork = createNetworkFromOsmModel(elevatorModel);
52
-
53
- verifyCoherence(elevatorNetwork);
54
- expect(elevatorNetwork.nodes.length).equals(7);
55
- expect(elevatorNetwork.edges.length).equals(7);
56
-
57
-
58
- const osmModel2 = OsmParser.parseOsmXmlString(`
59
- <osm>
60
- <node id='1' lat='43' lon='4'>
61
- <tag k='highway' v='elevator' />
62
- <tag k='level' v='0;1' />
63
- </node>
64
- <node id='2' lat='43' lon='3' />
65
- <way id='3'>
66
- <nd ref='1' />
67
- <nd ref='2' />
68
- <tag k='highway' v='footway' />
69
- <tag k='level' v='0;1' />
70
- </way>
71
- </osm>
72
- `);
73
- expect(() => createNetworkFromOsmModel(osmModel2)).throw(Error);
74
- });
75
-
76
- it('getNodeByName', () => {
77
- let node = getNodeByName(network, 'p1');
78
- expect(node).not.undefined;
79
-
80
- node = getNodeByName(network, 'p5');
81
- expect(node).is.undefined;
82
- });
83
- });
84
-
85
-
86
- describe('OsmNetwork - with stairs', () => {
87
-
88
- const osmXmlString = loadFile('bureaux-wemap-montpellier-network.osm');
89
-
90
- it('Network creation', () => {
91
-
92
- const osmModel = OsmParser.parseOsmXmlString(osmXmlString);
93
- const network = createNetworkFromOsmModel(osmModel);
94
-
95
- verifyCoherence(network);
96
-
97
- expect(getEdgeByName(network, 'w6')?.builtFrom?.tags.highway).equal('steps');
98
- });
99
-
100
- });
@@ -1,194 +0,0 @@
1
- import { Level } from '@wemap/geo';
2
- import OsmGraphNode from './OsmGraphNode';
3
- import OsmGraphEdge from './OsmGraphEdge';
4
- import OsmModel from '../OsmModel';
5
- import OsmNode from '../OsmNode';
6
- import OsmWay from '../OsmWay';
7
- import OsmNetwork from './OsmNetwork';
8
-
9
- export type N = OsmNode;
10
- export type E = OsmNode | OsmWay;
11
-
12
- export const HIGHWAYS_PEDESTRIANS = ['footway', 'steps', 'pedestrian', 'living_street', 'path', 'track', 'sidewalk', 'elevator'];
13
-
14
- export const DEFAULT_WAY_SELECTOR = (way: OsmWay) => {
15
- return HIGHWAYS_PEDESTRIANS.includes(way.tags.highway)
16
- || way.tags.footway === 'sidewalk'
17
- || way.tags.public_transport === 'platform'
18
- || way.tags.railway === 'platform';
19
- };
20
-
21
- export function getNodeByName(network: OsmNetwork, name: string) {
22
- return network.nodes.find(({ builtFrom }) => builtFrom?.tags.name === name);
23
- }
24
-
25
- export function getEdgeByName(network: OsmNetwork, name: string) {
26
- return network.edges.find(({ builtFrom }) => builtFrom?.tags.name === name);
27
- }
28
-
29
- function manageOneWay(edge: OsmGraphEdge, way: OsmWay) {
30
-
31
- const { highway, oneway, conveying } = way.tags;
32
-
33
- edge.isOneway = Boolean((oneway === 'yes' || oneway === 'true' || oneway === '1')
34
- || (conveying && highway && ['forward', 'backward'].includes(conveying)));
35
-
36
- if (edge.isOneway && conveying === 'backward') {
37
- const tmpNode = edge.node1;
38
- edge.node1 = edge.node2;
39
- edge.node2 = tmpNode;
40
- }
41
- }
42
-
43
-
44
- function createNodesAndEdgesFromElevator(
45
- nodes: OsmGraphNode[],
46
- edges: OsmGraphEdge[],
47
- elevatorNode: OsmGraphNode
48
- ) {
49
-
50
- const createdNodes: OsmGraphNode[] = [];
51
- const getOrCreateLevelNode = (level: number | null, builtFrom: N | null) => {
52
- let levelNode = createdNodes.find(({ coords }) => Level.equals(level, coords.level));
53
- if (!levelNode) {
54
- levelNode = new OsmGraphNode(elevatorNode.coords.clone(), builtFrom);
55
- levelNode.coords.level = level;
56
- createdNodes.push(levelNode);
57
- nodes.push(levelNode);
58
- }
59
- return levelNode;
60
- };
61
-
62
- // Create nodes from node.edges
63
- elevatorNode.edges.forEach(edge => {
64
- if (Level.isRange(edge.level)) {
65
- throw new Error('Cannot handle this elevator edge due to ambiguity');
66
- }
67
-
68
- const levelNode = getOrCreateLevelNode(edge.level, elevatorNode.builtFrom);
69
- if (edge.node1 === elevatorNode) {
70
- edge.node1 = levelNode;
71
- } else {
72
- edge.node2 = levelNode;
73
- }
74
- levelNode.edges.push(edge);
75
- });
76
-
77
- // Create edges from createdNodes
78
- for (let i = 0; i < createdNodes.length; i++) {
79
- for (let j = i + 1; j < createdNodes.length; j++) {
80
-
81
- const createdNode1 = createdNodes[i];
82
- const createdNode2 = createdNodes[j];
83
-
84
- if (createdNode1.coords.level === null || createdNode2.coords.level === null) {
85
- // TODO: not the best approach... but cannot do better with [number, number] range for levels
86
- continue;
87
- }
88
-
89
- const minLevel = Math.min(createdNode1.coords.level as number, createdNode2.coords.level as number);
90
- const maxLevel = Math.max(createdNode1.coords.level as number, createdNode2.coords.level as number);
91
-
92
- const newEdge = new OsmGraphEdge(
93
- createdNode1,
94
- createdNode2,
95
- [minLevel, maxLevel],
96
- elevatorNode.builtFrom
97
- );
98
- edges.push(newEdge);
99
- }
100
- }
101
-
102
- // Remove the historical elevator node from the network
103
- const elevatorNodeIndex = nodes.indexOf(elevatorNode);
104
- if (elevatorNodeIndex > -1) {
105
- nodes.splice(elevatorNodeIndex, 1);
106
- }
107
- }
108
-
109
- export function createNetworkFromOsmModel(
110
- osmModel: OsmModel,
111
- waySelectionFilter = DEFAULT_WAY_SELECTOR
112
- ) {
113
-
114
- const nodes: OsmGraphNode[] = [];
115
- const edges: OsmGraphEdge[] = [];
116
-
117
- const nodesCreated: { [key: number]: OsmGraphNode } = {};
118
- const elevatorNodes: OsmGraphNode[] = [];
119
-
120
- const getOrCreateNode = (osmNode: OsmNode) => {
121
- let node = nodesCreated[osmNode.id];
122
- if (!node) {
123
- node = new OsmGraphNode(osmNode.coords, osmNode);
124
- nodesCreated[osmNode.id] = node;
125
- nodes.push(node);
126
-
127
- if (osmNode.tags.highway === 'elevator') {
128
- elevatorNodes.push(node);
129
- }
130
- }
131
- return node;
132
- };
133
-
134
- osmModel.ways.forEach(way => {
135
- if (!waySelectionFilter(way)) {
136
- return;
137
- }
138
-
139
- let firstNode = getOrCreateNode(way.nodes[0]);
140
- for (let i = 1; i < way.nodes.length; i++) {
141
- const secondNode = getOrCreateNode(way.nodes[i]);
142
-
143
- const edge = new OsmGraphEdge(firstNode, secondNode, way.level, way);
144
- manageOneWay(edge, way);
145
- edges.push(edge);
146
- firstNode = secondNode;
147
- }
148
-
149
- });
150
-
151
- elevatorNodes.forEach(node => {
152
- // We have to clone this node for each connected edge
153
- createNodesAndEdgesFromElevator(nodes, edges, node);
154
- });
155
-
156
- const networkModel = new OsmNetwork(nodes, edges);
157
-
158
- OsmGraphNode.generateNodesLevels(networkModel.nodes);
159
-
160
- return networkModel;
161
- }
162
-
163
-
164
- // /**
165
- // * @param {GraphNode} node
166
- // * @param {object} tags
167
- // */
168
- // static _applyNodePropertiesFromTags(node, tags) {
169
- // node.name = tags.name || null;
170
- // node.subwayEntrance = tags.railway === 'subway_entrance';
171
- // if (node.subwayEntrance && tags.ref) {
172
- // node.subwayEntranceRef = tags.ref;
173
- // }
174
- // }
175
-
176
- // /**
177
- // * @param {GraphEdge} edge
178
- // * @param {object} tags
179
- // */
180
- // static _applyEdgePropertiesFromTags(edge, tags) {
181
- // const { highway, oneway, conveying, name } = tags;
182
- // edge.name = name || null;
183
- // edge.isStairs = highway === 'steps';
184
- // edge.isConveying = 'conveying' in tags;
185
- // edge.isOneway = Boolean((oneway === 'yes' || oneway === 'true' || oneway === '1')
186
- // || (conveying && highway && ['yes', 'forward', 'backward'].includes(conveying)));
187
-
188
- // if (conveying === 'backward') {
189
- // const tmpNode = edge.node1;
190
- // edge.node1 = edge.node2;
191
- // edge.node2 = tmpNode;
192
- // }
193
-
194
- // }