@wemap/osm 12.11.3 → 12.12.0

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.d.ts CHANGED
@@ -1,6 +1,8 @@
1
- export { default as OsmElement, type OsmTags } from './src/OsmElement.js';
1
+ export { default as OsmElement } 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
5
  export { default as OsmRelation } from './src/OsmRelation.js';
6
+ export * from './src/OsmTags.js';
7
+ export { default as OsmTagsUtils } from './src/OsmTagsUtils.js';
6
8
  export { default as OsmWay } from './src/OsmWay.js';
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var e=Object.defineProperty,t=(t,s,r)=>(((t,s,r)=>{s in t?e(t,s,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[s]=r})(t,"symbol"!=typeof s?s+"":s,r),r);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("@wemap/geo"),r=require("saxes");class i{constructor(e,s){t(this,"id"),t(this,"tags"),this.id=e,this.tags=s||{}}get name(){return this.tags.name}}class n{constructor(e,s,r){t(this,"nodes"),t(this,"ways"),t(this,"relations"),this.nodes=e||[],this.ways=s||[],this.relations=r||[]}getNodeById(e){return this.nodes.find((t=>t.id===e))||null}getNodeByName(e){return this.nodes.find((t=>t.tags.name===e))||null}getWayById(e){return this.ways.find((t=>t.id===e))||null}getWayByName(e){return this.ways.find((t=>t.tags.name===e))||null}getRelationById(e){return this.relations.find((t=>t.id===e))||null}getRelationByName(e){return this.relations.find((t=>t.tags.name===e))||null}}class a extends i{constructor(e,s,r){super(e,r),t(this,"coords"),t(this,"ways",[]),t(this,"relations",[]),this.coords=s,this.computeCoordsLevelFromTags()}computeCoordsLevelFromTags(){"level"in this.tags&&(this.coords.level=s.Level.fromString(this.tags.level))}get isElevator(){return"elevator"===this.tags.highway}get isConveying(){return this.isElevator}get isGate(){return"gate"===this.tags.barrier||"gate"===this.tags.aeroway}get isSubwayEntrance(){return"subway_entrance"===this.tags.railway}get subwayEntranceRef(){if(this.isSubwayEntrance)return this.tags.ref}}class o extends i{constructor(e,s,r=null){super(e,s),t(this,"nodes",[]),t(this,"relations",[]),t(this,"level",null),this.level=r,this.computeLevelFromTags()}computeLevelFromTags(){"level"in this.tags&&(this.level=s.Level.fromString(this.tags.level))}get areStairs(){return"steps"===this.tags.highway&&!this.isConveying}get isConveying(){return Boolean(this.tags.conveying)}get areEscalators(){return"steps"===this.tags.highway&&this.isConveying}get isMovingWalkway(){return Boolean(this.tags.highway)&&"steps"!==this.tags.highway&&this.isConveying}get isElevator(){return"elevator"===this.tags.highway}get isOneway(){const{highway:e,oneway:t,conveying:s}=this.tags;return Boolean("yes"===t||"true"===t||"1"===t||s&&e&&["forward","backward"].includes(s))}get isOnewayBackward(){return this.isOneway&&"backward"===this.tags.conveying}get isArea(){return"yes"===this.tags.area}get isGeometryClosed(){return this.nodes[0]===this.nodes[this.nodes.length-1]}get needTicket(){return!1}get incline(){if(["up","down"].includes(this.tags.incline))return this.tags.incline}get wheelchair(){return"wheelchair"in this.tags?this.tags.wheelchair:void 0}get surface(){return"surface"in this.tags?this.tags.surface:void 0}get smoothness(){return"smoothness"in this.tags?this.tags.smoothness:void 0}}class l extends i{constructor(e,s=[],r){super(e,r),t(this,"relations",[]),this.members=s}isMultipolygon(){return"multipolygon"===this.tags.type}getGeoJsonPolygon(){if(!this.isMultipolygon())return null;const e=this.members.find((e=>e.ref instanceof o&&"outer"===e.role));if(!e)return null;return{type:"Polygon",coordinates:[e,...this.members.filter((e=>e.ref instanceof o&&"inner"===e.role))].map((e=>e.ref.nodes.map((e=>[e.coords.lng,e.coords.lat]))))}}}exports.OsmElement=i,exports.OsmModel=n,exports.OsmNode=a,exports.OsmParser=class{static parseOsmXmlString(e){const t=new n,s=new r.SaxesParser;let i;const a=e=>e.attributes.action&&"delete"===e.attributes.action;return s.on("opentag",(e=>{switch(e.name){case"node":{if(a(e)){i=null;break}const s=this._parseNode(e.attributes);i=s,t.nodes.push(s);break}case"way":{if(a(e)){i=null;break}const s=this._parseWay(e.attributes);i=s,t.ways.push(s);break}case"relation":{if(a(e)){i=null;break}const s=this._parseRelation(e.attributes);i=s,t.relations.push(s);break}case"tag":{if(!i)return;const{k:t,v:s}=e.attributes;i.tags[t]=s;break}case"nd":{if(!(i&&i instanceof o))return;const s=Number(e.attributes.ref),r=t.getNodeById(s);if(!r)throw Error("Node: "+s+" in way "+i.id+" not found");i.nodes.push(r),r.ways.push(i);break}case"member":{if(!(i&&i instanceof l))return;const s=Number(e.attributes.ref),r=e.attributes.type;let n=null;if("node"===r&&(n=t.getNodeById(s)),"way"===r&&(n=t.getWayById(s)),"relation"===r&&(n=t.getRelationById(s)),!n)throw Error("Member: "+s+" in relation "+i.id+" not found");i.members.push({ref:n,role:e.attributes.role}),n.relations.push(i);break}}})),s.write(e),t.nodes.forEach((e=>e.computeCoordsLevelFromTags())),t.ways.forEach((e=>e.computeLevelFromTags())),t}static _parseNode(e){return new a(Number(e.id),new s.Coordinates(Number(e.lat),Number(e.lon)))}static _parseWay(e){return new o(Number(e.id))}static _parseRelation(e){return new l(Number(e.id))}},exports.OsmRelation=l,exports.OsmWay=o;
1
+ "use strict";var e=Object.defineProperty,t=(t,s,r)=>(((t,s,r)=>{s in t?e(t,s,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[s]=r})(t,"symbol"!=typeof s?s+"":s,r),r);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("@wemap/geo"),r=require("saxes");class n{constructor(e,s){t(this,"id"),t(this,"tags"),this.id=e,this.tags=s||{}}get name(){return this.tags.name}}class i{constructor(e,s,r){t(this,"nodes"),t(this,"ways"),t(this,"relations"),this.nodes=e||[],this.ways=s||[],this.relations=r||[]}getNodeById(e){return this.nodes.find((t=>t.id===e))||null}getNodeByName(e){return this.nodes.find((t=>t.tags.name===e))||null}getWayById(e){return this.ways.find((t=>t.id===e))||null}getWayByName(e){return this.ways.find((t=>t.tags.name===e))||null}getRelationById(e){return this.relations.find((t=>t.id===e))||null}getRelationByName(e){return this.relations.find((t=>t.tags.name===e))||null}}class o extends n{constructor(e,s,r){super(e,r),t(this,"coords"),t(this,"ways",[]),t(this,"relations",[]),this.coords=s,this.computeCoordsLevelFromTags()}computeCoordsLevelFromTags(){void 0!==this.tags.level&&(this.coords.level=s.Level.fromString(this.tags.level))}}class a extends n{constructor(e,s,r=null){super(e,s),t(this,"nodes",[]),t(this,"relations",[]),t(this,"level",null),this.level=r,this.computeLevelFromTags()}computeLevelFromTags(){void 0!==this.tags.level&&(this.level=s.Level.fromString(this.tags.level))}get isGeometryClosed(){return this.nodes[0]===this.nodes[this.nodes.length-1]}getGeoJsonPolygon(){const e=this.nodes.map((e=>[e.coords.lng,e.coords.lat]));return this.isGeometryClosed||e.push([this.nodes[0].coords.lng,this.nodes[0].coords.lat]),{type:"Polygon",coordinates:[e]}}}class l extends n{constructor(e,s=[],r){super(e,r),t(this,"relations",[]),this.members=s}isMultipolygon(){return"multipolygon"===this.tags.type}getGeoJsonPolygon(){if(!this.isMultipolygon())return null;const e=this.members.find((e=>e.ref instanceof a&&"outer"===e.role));if(!e)return null;return{type:"Polygon",coordinates:[e,...this.members.filter((e=>e.ref instanceof a&&"inner"===e.role))].map((e=>e.ref.nodes.map((e=>[e.coords.lng,e.coords.lat]))))}}}exports.OsmElement=n,exports.OsmModel=i,exports.OsmNode=o,exports.OsmParser=class{static parseOsmXmlString(e){const t=new i,s=new r.SaxesParser;let n;const o=e=>e.attributes.action&&"delete"===e.attributes.action;return s.on("opentag",(e=>{switch(e.name){case"node":{if(o(e)){n=null;break}const s=this._parseNode(e.attributes);n=s,t.nodes.push(s);break}case"way":{if(o(e)){n=null;break}const s=this._parseWay(e.attributes);n=s,t.ways.push(s);break}case"relation":{if(o(e)){n=null;break}const s=this._parseRelation(e.attributes);n=s,t.relations.push(s);break}case"tag":{if(!n)return;const{k:t,v:s}=e.attributes;n.tags[t]=s;break}case"nd":{if(!(n&&n instanceof a))return;const s=Number(e.attributes.ref),r=t.getNodeById(s);if(!r)throw Error("Node: "+s+" in way "+n.id+" not found");n.nodes.push(r),r.ways.push(n);break}case"member":{if(!(n&&n instanceof l))return;const s=Number(e.attributes.ref),r=e.attributes.type;let i=null;if("node"===r&&(i=t.getNodeById(s)),"way"===r&&(i=t.getWayById(s)),"relation"===r&&(i=t.getRelationById(s)),!i)throw Error("Member: "+s+" in relation "+n.id+" not found");n.members.push({ref:i,role:e.attributes.role}),i.relations.push(n);break}}})),s.write(e),t.nodes.forEach((e=>e.computeCoordsLevelFromTags())),t.ways.forEach((e=>e.computeLevelFromTags())),t}static _parseNode(e){return new o(Number(e.id),new s.Coordinates(Number(e.lat),Number(e.lon)))}static _parseWay(e){return new a(Number(e.id))}static _parseRelation(e){return new l(Number(e.id))}},exports.OsmRelation=l,exports.OsmTagsUtils=class{static name(e){return e.name}static areStairs(e){return"steps"===e.highway&&!e.conveying}static isConveying(e){return Boolean(e.conveying)||this.isElevator(e)}static isElevator(e){return"elevator"===e.highway}static isEscalator(e){return"steps"===e.highway&&this.isConveying(e)}static isMovingWalkway(e){return Boolean(e.highway)&&"steps"!==e.highway&&this.isConveying(e)}static isOneway(e){const{highway:t,oneway:s,conveying:r}=e;return Boolean("yes"===s||r&&t&&["forward","backward"].includes(r))}static isOnewayBackward(e){return this.isOneway(e)&&"backward"===e.conveying}static needTicket(e){return!1}static getIncline(e){if(e.incline&&["up","down"].includes(e.incline))return e.incline}static getWheelchair(e){return"wheelchair"in e?e.wheelchair:void 0}static getSurface(e){return"surface"in e?e.surface:void 0}static getSmoothness(e){return"smoothness"in e?e.smoothness:void 0}static isSubwayEntrance(e){return"subway_entrance"===e.railway}static getRef(e){return e.ref}static isGate(e){return"gate"===e.barrier||"gate"===e.aeroway}static isArea(e){return"yes"===e.area}static isRoutingBounds(e){return"yes"===e["wemap:routing-bounds"]}static isRoutingBoundsEntryPoint(e){return"yes"===e["wemap:routing-io"]}},exports.OsmWay=a;
2
2
  //# 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"],"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 get name(): string | undefined {\n return this.tags.name;\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, Level } 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 this.computeCoordsLevelFromTags();\n }\n\n computeCoordsLevelFromTags() {\n if ('level' in this.tags) {\n this.coords.level = Level.fromString(this.tags.level);\n }\n }\n\n get isElevator() {\n return this.tags.highway === 'elevator';\n }\n\n get isConveying() {\n return this.isElevator;\n }\n\n get isGate() {\n return this.tags.barrier === 'gate' || this.tags.aeroway === 'gate';\n }\n\n get isSubwayEntrance() {\n return this.tags.railway === 'subway_entrance';\n }\n\n get subwayEntranceRef() {\n if (!this.isSubwayEntrance) return;\n return this.tags.ref;\n }\n\n}\n\nexport default OsmNode;\n","import { Level, Level_t } from '@wemap/geo';\nimport OsmElement, { OsmTags } from './OsmElement.js';\nimport OsmNode from './OsmNode.js';\nimport OsmRelation from './OsmRelation.js';\nimport { OsmSmoothness, OsmSurface, OsmWheelchair } from './OsmTypes.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 this.computeLevelFromTags();\n }\n\n computeLevelFromTags() {\n if ('level' in this.tags) {\n this.level = Level.fromString(this.tags.level);\n }\n }\n\n get areStairs() {\n return this.tags.highway === 'steps' && !this.isConveying;\n }\n\n get isConveying() {\n return Boolean(this.tags.conveying);\n }\n\n get areEscalators() {\n return this.tags.highway === 'steps' && this.isConveying;\n }\n\n get isMovingWalkway() {\n return Boolean(this.tags.highway) && this.tags.highway !== 'steps' && this.isConveying;\n }\n\n get isElevator() {\n return this.tags.highway === 'elevator';\n }\n\n get isOneway() {\n const { highway, oneway, conveying } = this.tags;\n return Boolean((oneway === 'yes' || oneway === 'true' || oneway === '1')\n || (conveying && highway && ['forward', 'backward'].includes(conveying)));\n }\n\n get isOnewayBackward() {\n return this.isOneway && this.tags.conveying === 'backward';\n }\n\n get isArea() {\n return this.tags.area === 'yes';\n }\n\n get isGeometryClosed() {\n return this.nodes[0] === this.nodes[this.nodes.length - 1];\n }\n\n get needTicket() {\n // TODO\n return false;\n }\n\n get incline(): 'up' | 'down' | undefined {\n if (['up', 'down'].includes(this.tags.incline))\n return this.tags.incline as 'up' | 'down';\n }\n\n get wheelchair(): OsmWheelchair | undefined {\n return 'wheelchair' in this.tags ? this.tags.wheelchair as OsmWheelchair : undefined;\n }\n\n get surface(): OsmSurface | undefined {\n return 'surface' in this.tags ? this.tags.surface as OsmSurface : undefined;\n }\n\n get smoothness(): OsmSmoothness | undefined {\n return 'smoothness' in this.tags ? this.tags.smoothness as OsmSmoothness : undefined;\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 { Coordinates } 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 model.nodes.forEach(node => node.computeCoordsLevelFromTags());\n model.ways.forEach(way => way.computeLevelFromTags());\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":["OsmElement","constructor","id","tags","__publicField","this","name","OsmModel","nodes","ways","relations","getNodeById","find","node","getNodeByName","getWayById","way","getWayByName","getRelationById","getRelationByName","OsmNode","coords","super","computeCoordsLevelFromTags","level","Level","fromString","isElevator","highway","isConveying","isGate","barrier","aeroway","isSubwayEntrance","railway","subwayEntranceRef","ref","OsmWay","computeLevelFromTags","areStairs","Boolean","conveying","areEscalators","isMovingWalkway","isOneway","oneway","includes","isOnewayBackward","isArea","area","isGeometryClosed","length","needTicket","incline","wheelchair","surface","smoothness","OsmRelation","members","isMultipolygon","type","getGeoJsonPolygon","outer","member","role","coordinates","filter","map","lng","lat","parseOsmXmlString","osmXmlString","model","parser","SaxesParser","buffer","isDeleted","element","attributes","action","on","osmNode","_parseNode","push","osmWay","_parseWay","osmRelation","_parseRelation","k","v","nodeId","Number","refNode","Error","memberId","memberType","refElement","write","forEach","attr","Coordinates","lon"],"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","../src/OsmTagsUtils.ts"],"sourcesContent":["import { OsmTags } from './OsmTags.js';\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 get name(): string | undefined {\n return this.tags.name;\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, Level } from '@wemap/geo';\n\nimport OsmElement from './OsmElement.js';\nimport OsmRelation from './OsmRelation.js';\nimport OsmWay from './OsmWay.js';\nimport type { OsmTags } from './OsmTags.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 this.computeCoordsLevelFromTags();\n }\n\n computeCoordsLevelFromTags() {\n if (typeof this.tags.level !== 'undefined') {\n this.coords.level = Level.fromString(this.tags.level);\n }\n }\n\n}\n\nexport default OsmNode;\n","import { Polygon } from 'geojson';\n\nimport { Level, Level_t } from '@wemap/geo';\n\nimport OsmElement from './OsmElement.js';\nimport OsmNode from './OsmNode.js';\nimport OsmRelation from './OsmRelation.js';\nimport { OsmTags } from './OsmTags.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 this.computeLevelFromTags();\n }\n\n computeLevelFromTags() {\n if (typeof this.tags.level !== 'undefined') {\n this.level = Level.fromString(this.tags.level);\n }\n }\n\n get isGeometryClosed() {\n return this.nodes[0] === this.nodes[this.nodes.length - 1];\n }\n\n getGeoJsonPolygon() : Polygon {\n const coordinates = this.nodes.map(node => [node.coords.lng, node.coords.lat]);\n \n // If the way is not already closed, add the first node at the end\n if (!this.isGeometryClosed) {\n coordinates.push([this.nodes[0].coords.lng, this.nodes[0].coords.lat]);\n }\n\n return {\n type: 'Polygon',\n coordinates: [coordinates]\n };\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 { Coordinates } 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 model.nodes.forEach(node => node.computeCoordsLevelFromTags());\n model.ways.forEach(way => way.computeLevelFromTags());\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 { OsmTags } from './OsmTags.js';\n\nexport default class OsmTagsUtils {\n\n static name(tags: OsmTags) {\n return tags.name;\n }\n\n static areStairs(tags: OsmTags) {\n return tags.highway === 'steps' && !tags.conveying;\n }\n\n static isConveying(tags: OsmTags) {\n return Boolean(tags.conveying) || this.isElevator(tags);\n }\n\n static isElevator(tags: OsmTags) {\n return tags.highway === 'elevator';\n }\n\n static isEscalator(tags: OsmTags) {\n return tags.highway === 'steps' && this.isConveying(tags);\n }\n\n static isMovingWalkway(tags: OsmTags) {\n return Boolean(tags.highway) && tags.highway !== 'steps' && this.isConveying(tags);\n }\n\n static isOneway(tags: OsmTags) {\n const { highway, oneway, conveying } = tags;\n return Boolean((oneway === 'yes')\n || (conveying && highway && ['forward', 'backward'].includes(conveying)));\n }\n\n static isOnewayBackward(tags: OsmTags) {\n return this.isOneway(tags) && tags.conveying === 'backward';\n }\n\n static needTicket(tags: OsmTags) {\n // TODO\n return false;\n }\n\n static getIncline(tags: OsmTags) {\n if (tags.incline && ['up', 'down'].includes(tags.incline))\n return tags.incline;\n }\n\n static getWheelchair(tags: OsmTags) {\n return 'wheelchair' in tags ? tags.wheelchair : undefined;\n }\n\n static getSurface(tags: OsmTags) {\n return 'surface' in tags ? tags.surface : undefined;\n }\n\n static getSmoothness(tags: OsmTags) {\n return 'smoothness' in tags ? tags.smoothness : undefined;\n }\n\n static isSubwayEntrance(tags: OsmTags) {\n return tags.railway === 'subway_entrance';\n }\n\n static getRef(tags: OsmTags) {\n return tags.ref;\n }\n\n static isGate(tags: OsmTags) {\n return tags.barrier === 'gate' || tags.aeroway === 'gate';\n }\n\n static isArea(tags: OsmTags) {\n return tags.area === 'yes';\n }\n\n // Wemap specific\n\n static isRoutingBounds(tags: OsmTags) {\n return tags['wemap:routing-bounds'] === 'yes';\n }\n\n static isRoutingBoundsEntryPoint(tags: OsmTags) {\n return tags['wemap:routing-io'] === 'yes';\n }\n \n \n}"],"names":["OsmElement","constructor","id","tags","__publicField","this","name","OsmModel","nodes","ways","relations","getNodeById","find","node","getNodeByName","getWayById","way","getWayByName","getRelationById","getRelationByName","OsmNode","coords","super","computeCoordsLevelFromTags","level","Level","fromString","OsmWay","computeLevelFromTags","isGeometryClosed","length","getGeoJsonPolygon","coordinates","map","lng","lat","push","type","OsmRelation","members","isMultipolygon","outer","member","ref","role","filter","parseOsmXmlString","osmXmlString","model","parser","SaxesParser","buffer","isDeleted","element","attributes","action","on","osmNode","_parseNode","osmWay","_parseWay","osmRelation","_parseRelation","k","v","nodeId","Number","refNode","Error","memberId","memberType","refElement","write","forEach","attr","Coordinates","lon","areStairs","highway","conveying","isConveying","Boolean","isElevator","isEscalator","isMovingWalkway","isOneway","oneway","includes","isOnewayBackward","needTicket","getIncline","incline","getWheelchair","wheelchair","getSurface","surface","getSmoothness","smoothness","isSubwayEntrance","railway","getRef","isGate","barrier","aeroway","isArea","area","isRoutingBounds","isRoutingBoundsEntryPoint"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -55,27 +55,10 @@ class OsmNode extends OsmElement {
55
55
  this.computeCoordsLevelFromTags();
56
56
  }
57
57
  computeCoordsLevelFromTags() {
58
- if ("level" in this.tags) {
58
+ if (typeof this.tags.level !== "undefined") {
59
59
  this.coords.level = Level.fromString(this.tags.level);
60
60
  }
61
61
  }
62
- get isElevator() {
63
- return this.tags.highway === "elevator";
64
- }
65
- get isConveying() {
66
- return this.isElevator;
67
- }
68
- get isGate() {
69
- return this.tags.barrier === "gate" || this.tags.aeroway === "gate";
70
- }
71
- get isSubwayEntrance() {
72
- return this.tags.railway === "subway_entrance";
73
- }
74
- get subwayEntranceRef() {
75
- if (!this.isSubwayEntrance)
76
- return;
77
- return this.tags.ref;
78
- }
79
62
  }
80
63
  class OsmWay extends OsmElement {
81
64
  constructor(id, tags, level = null) {
@@ -87,53 +70,22 @@ class OsmWay extends OsmElement {
87
70
  this.computeLevelFromTags();
88
71
  }
89
72
  computeLevelFromTags() {
90
- if ("level" in this.tags) {
73
+ if (typeof this.tags.level !== "undefined") {
91
74
  this.level = Level.fromString(this.tags.level);
92
75
  }
93
76
  }
94
- get areStairs() {
95
- return this.tags.highway === "steps" && !this.isConveying;
96
- }
97
- get isConveying() {
98
- return Boolean(this.tags.conveying);
99
- }
100
- get areEscalators() {
101
- return this.tags.highway === "steps" && this.isConveying;
102
- }
103
- get isMovingWalkway() {
104
- return Boolean(this.tags.highway) && this.tags.highway !== "steps" && this.isConveying;
105
- }
106
- get isElevator() {
107
- return this.tags.highway === "elevator";
108
- }
109
- get isOneway() {
110
- const { highway, oneway, conveying } = this.tags;
111
- return Boolean(oneway === "yes" || oneway === "true" || oneway === "1" || conveying && highway && ["forward", "backward"].includes(conveying));
112
- }
113
- get isOnewayBackward() {
114
- return this.isOneway && this.tags.conveying === "backward";
115
- }
116
- get isArea() {
117
- return this.tags.area === "yes";
118
- }
119
77
  get isGeometryClosed() {
120
78
  return this.nodes[0] === this.nodes[this.nodes.length - 1];
121
79
  }
122
- get needTicket() {
123
- return false;
124
- }
125
- get incline() {
126
- if (["up", "down"].includes(this.tags.incline))
127
- return this.tags.incline;
128
- }
129
- get wheelchair() {
130
- return "wheelchair" in this.tags ? this.tags.wheelchair : void 0;
131
- }
132
- get surface() {
133
- return "surface" in this.tags ? this.tags.surface : void 0;
134
- }
135
- get smoothness() {
136
- return "smoothness" in this.tags ? this.tags.smoothness : void 0;
80
+ getGeoJsonPolygon() {
81
+ const coordinates = this.nodes.map((node) => [node.coords.lng, node.coords.lat]);
82
+ if (!this.isGeometryClosed) {
83
+ coordinates.push([this.nodes[0].coords.lng, this.nodes[0].coords.lat]);
84
+ }
85
+ return {
86
+ type: "Polygon",
87
+ coordinates: [coordinates]
88
+ };
137
89
  }
138
90
  }
139
91
  class OsmRelation extends OsmElement {
@@ -260,12 +212,75 @@ class OsmParser {
260
212
  return new OsmRelation(Number(attr.id));
261
213
  }
262
214
  }
215
+ class OsmTagsUtils {
216
+ static name(tags) {
217
+ return tags.name;
218
+ }
219
+ static areStairs(tags) {
220
+ return tags.highway === "steps" && !tags.conveying;
221
+ }
222
+ static isConveying(tags) {
223
+ return Boolean(tags.conveying) || this.isElevator(tags);
224
+ }
225
+ static isElevator(tags) {
226
+ return tags.highway === "elevator";
227
+ }
228
+ static isEscalator(tags) {
229
+ return tags.highway === "steps" && this.isConveying(tags);
230
+ }
231
+ static isMovingWalkway(tags) {
232
+ return Boolean(tags.highway) && tags.highway !== "steps" && this.isConveying(tags);
233
+ }
234
+ static isOneway(tags) {
235
+ const { highway, oneway, conveying } = tags;
236
+ return Boolean(oneway === "yes" || conveying && highway && ["forward", "backward"].includes(conveying));
237
+ }
238
+ static isOnewayBackward(tags) {
239
+ return this.isOneway(tags) && tags.conveying === "backward";
240
+ }
241
+ static needTicket(tags) {
242
+ return false;
243
+ }
244
+ static getIncline(tags) {
245
+ if (tags.incline && ["up", "down"].includes(tags.incline))
246
+ return tags.incline;
247
+ }
248
+ static getWheelchair(tags) {
249
+ return "wheelchair" in tags ? tags.wheelchair : void 0;
250
+ }
251
+ static getSurface(tags) {
252
+ return "surface" in tags ? tags.surface : void 0;
253
+ }
254
+ static getSmoothness(tags) {
255
+ return "smoothness" in tags ? tags.smoothness : void 0;
256
+ }
257
+ static isSubwayEntrance(tags) {
258
+ return tags.railway === "subway_entrance";
259
+ }
260
+ static getRef(tags) {
261
+ return tags.ref;
262
+ }
263
+ static isGate(tags) {
264
+ return tags.barrier === "gate" || tags.aeroway === "gate";
265
+ }
266
+ static isArea(tags) {
267
+ return tags.area === "yes";
268
+ }
269
+ // Wemap specific
270
+ static isRoutingBounds(tags) {
271
+ return tags["wemap:routing-bounds"] === "yes";
272
+ }
273
+ static isRoutingBoundsEntryPoint(tags) {
274
+ return tags["wemap:routing-io"] === "yes";
275
+ }
276
+ }
263
277
  export {
264
278
  OsmElement,
265
279
  OsmModel,
266
280
  OsmNode,
267
281
  OsmParser,
268
282
  OsmRelation,
283
+ OsmTagsUtils,
269
284
  OsmWay
270
285
  };
271
286
  //# 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"],"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 get name(): string | undefined {\n return this.tags.name;\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, Level } 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 this.computeCoordsLevelFromTags();\n }\n\n computeCoordsLevelFromTags() {\n if ('level' in this.tags) {\n this.coords.level = Level.fromString(this.tags.level);\n }\n }\n\n get isElevator() {\n return this.tags.highway === 'elevator';\n }\n\n get isConveying() {\n return this.isElevator;\n }\n\n get isGate() {\n return this.tags.barrier === 'gate' || this.tags.aeroway === 'gate';\n }\n\n get isSubwayEntrance() {\n return this.tags.railway === 'subway_entrance';\n }\n\n get subwayEntranceRef() {\n if (!this.isSubwayEntrance) return;\n return this.tags.ref;\n }\n\n}\n\nexport default OsmNode;\n","import { Level, Level_t } from '@wemap/geo';\nimport OsmElement, { OsmTags } from './OsmElement.js';\nimport OsmNode from './OsmNode.js';\nimport OsmRelation from './OsmRelation.js';\nimport { OsmSmoothness, OsmSurface, OsmWheelchair } from './OsmTypes.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 this.computeLevelFromTags();\n }\n\n computeLevelFromTags() {\n if ('level' in this.tags) {\n this.level = Level.fromString(this.tags.level);\n }\n }\n\n get areStairs() {\n return this.tags.highway === 'steps' && !this.isConveying;\n }\n\n get isConveying() {\n return Boolean(this.tags.conveying);\n }\n\n get areEscalators() {\n return this.tags.highway === 'steps' && this.isConveying;\n }\n\n get isMovingWalkway() {\n return Boolean(this.tags.highway) && this.tags.highway !== 'steps' && this.isConveying;\n }\n\n get isElevator() {\n return this.tags.highway === 'elevator';\n }\n\n get isOneway() {\n const { highway, oneway, conveying } = this.tags;\n return Boolean((oneway === 'yes' || oneway === 'true' || oneway === '1')\n || (conveying && highway && ['forward', 'backward'].includes(conveying)));\n }\n\n get isOnewayBackward() {\n return this.isOneway && this.tags.conveying === 'backward';\n }\n\n get isArea() {\n return this.tags.area === 'yes';\n }\n\n get isGeometryClosed() {\n return this.nodes[0] === this.nodes[this.nodes.length - 1];\n }\n\n get needTicket() {\n // TODO\n return false;\n }\n\n get incline(): 'up' | 'down' | undefined {\n if (['up', 'down'].includes(this.tags.incline))\n return this.tags.incline as 'up' | 'down';\n }\n\n get wheelchair(): OsmWheelchair | undefined {\n return 'wheelchair' in this.tags ? this.tags.wheelchair as OsmWheelchair : undefined;\n }\n\n get surface(): OsmSurface | undefined {\n return 'surface' in this.tags ? this.tags.surface as OsmSurface : undefined;\n }\n\n get smoothness(): OsmSmoothness | undefined {\n return 'smoothness' in this.tags ? this.tags.smoothness as OsmSmoothness : undefined;\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 { Coordinates } 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 model.nodes.forEach(node => node.computeCoordsLevelFromTags());\n model.ways.forEach(way => way.computeLevelFromTags());\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":"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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","../src/OsmTagsUtils.ts"],"sourcesContent":["import { OsmTags } from './OsmTags.js';\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 get name(): string | undefined {\n return this.tags.name;\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, Level } from '@wemap/geo';\n\nimport OsmElement from './OsmElement.js';\nimport OsmRelation from './OsmRelation.js';\nimport OsmWay from './OsmWay.js';\nimport type { OsmTags } from './OsmTags.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 this.computeCoordsLevelFromTags();\n }\n\n computeCoordsLevelFromTags() {\n if (typeof this.tags.level !== 'undefined') {\n this.coords.level = Level.fromString(this.tags.level);\n }\n }\n\n}\n\nexport default OsmNode;\n","import { Polygon } from 'geojson';\n\nimport { Level, Level_t } from '@wemap/geo';\n\nimport OsmElement from './OsmElement.js';\nimport OsmNode from './OsmNode.js';\nimport OsmRelation from './OsmRelation.js';\nimport { OsmTags } from './OsmTags.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 this.computeLevelFromTags();\n }\n\n computeLevelFromTags() {\n if (typeof this.tags.level !== 'undefined') {\n this.level = Level.fromString(this.tags.level);\n }\n }\n\n get isGeometryClosed() {\n return this.nodes[0] === this.nodes[this.nodes.length - 1];\n }\n\n getGeoJsonPolygon() : Polygon {\n const coordinates = this.nodes.map(node => [node.coords.lng, node.coords.lat]);\n \n // If the way is not already closed, add the first node at the end\n if (!this.isGeometryClosed) {\n coordinates.push([this.nodes[0].coords.lng, this.nodes[0].coords.lat]);\n }\n\n return {\n type: 'Polygon',\n coordinates: [coordinates]\n };\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 { Coordinates } 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 model.nodes.forEach(node => node.computeCoordsLevelFromTags());\n model.ways.forEach(way => way.computeLevelFromTags());\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 { OsmTags } from './OsmTags.js';\n\nexport default class OsmTagsUtils {\n\n static name(tags: OsmTags) {\n return tags.name;\n }\n\n static areStairs(tags: OsmTags) {\n return tags.highway === 'steps' && !tags.conveying;\n }\n\n static isConveying(tags: OsmTags) {\n return Boolean(tags.conveying) || this.isElevator(tags);\n }\n\n static isElevator(tags: OsmTags) {\n return tags.highway === 'elevator';\n }\n\n static isEscalator(tags: OsmTags) {\n return tags.highway === 'steps' && this.isConveying(tags);\n }\n\n static isMovingWalkway(tags: OsmTags) {\n return Boolean(tags.highway) && tags.highway !== 'steps' && this.isConveying(tags);\n }\n\n static isOneway(tags: OsmTags) {\n const { highway, oneway, conveying } = tags;\n return Boolean((oneway === 'yes')\n || (conveying && highway && ['forward', 'backward'].includes(conveying)));\n }\n\n static isOnewayBackward(tags: OsmTags) {\n return this.isOneway(tags) && tags.conveying === 'backward';\n }\n\n static needTicket(tags: OsmTags) {\n // TODO\n return false;\n }\n\n static getIncline(tags: OsmTags) {\n if (tags.incline && ['up', 'down'].includes(tags.incline))\n return tags.incline;\n }\n\n static getWheelchair(tags: OsmTags) {\n return 'wheelchair' in tags ? tags.wheelchair : undefined;\n }\n\n static getSurface(tags: OsmTags) {\n return 'surface' in tags ? tags.surface : undefined;\n }\n\n static getSmoothness(tags: OsmTags) {\n return 'smoothness' in tags ? tags.smoothness : undefined;\n }\n\n static isSubwayEntrance(tags: OsmTags) {\n return tags.railway === 'subway_entrance';\n }\n\n static getRef(tags: OsmTags) {\n return tags.ref;\n }\n\n static isGate(tags: OsmTags) {\n return tags.barrier === 'gate' || tags.aeroway === 'gate';\n }\n\n static isArea(tags: OsmTags) {\n return tags.area === 'yes';\n }\n\n // Wemap specific\n\n static isRoutingBounds(tags: OsmTags) {\n return tags['wemap:routing-bounds'] === 'yes';\n }\n\n static isRoutingBoundsEntryPoint(tags: OsmTags) {\n return tags['wemap:routing-io'] === 'yes';\n }\n \n \n}"],"names":[],"mappings":"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"}
@@ -1,6 +1,4 @@
1
- export type OsmTags = {
2
- [key: string]: string;
3
- };
1
+ import { OsmTags } from './OsmTags.js';
4
2
  declare class OsmElement {
5
3
  id: number;
6
4
  tags: OsmTags;
@@ -1,17 +1,13 @@
1
1
  import { Coordinates } from '@wemap/geo';
2
- import { default as OsmElement, OsmTags } from './OsmElement.js';
2
+ import { default as OsmElement } from './OsmElement.js';
3
3
  import { default as OsmRelation } from './OsmRelation.js';
4
4
  import { default as OsmWay } from './OsmWay.js';
5
+ import { OsmTags } from './OsmTags.js';
5
6
  declare class OsmNode extends OsmElement {
6
7
  coords: Coordinates;
7
8
  ways: OsmWay[];
8
9
  relations: OsmRelation[];
9
10
  constructor(id: number, coords: Coordinates, tags?: OsmTags);
10
11
  computeCoordsLevelFromTags(): void;
11
- get isElevator(): boolean;
12
- get isConveying(): boolean;
13
- get isGate(): boolean;
14
- get isSubwayEntrance(): boolean;
15
- get subwayEntranceRef(): string | undefined;
16
12
  }
17
13
  export default OsmNode;
@@ -0,0 +1,27 @@
1
+ export type OsmSurface = 'asphalt' | 'compacted' | 'concrete' | 'grass' | 'gravel' | 'ground' | 'metal' | 'paving_stones' | 'wood';
2
+ export type OsmSmoothness = 'excellent' | 'good' | 'intermediate' | 'bad' | 'horrible';
3
+ export type OsmWheelchair = 'yes' | 'no' | 'designated';
4
+ export type OsmHighway = 'footway' | 'steps' | 'elevator' | 'moving_walkway';
5
+ export type OsmTags = {
6
+ name?: string;
7
+ repeat_on?: string;
8
+ level?: string;
9
+ highway?: OsmHighway;
10
+ conveying?: 'yes' | 'forward' | 'backward' | 'reversible';
11
+ oneway?: 'yes' | 'no';
12
+ incline?: 'up' | 'down';
13
+ surface?: OsmSurface;
14
+ smoothness?: OsmSmoothness;
15
+ wheelchair?: OsmWheelchair;
16
+ railway?: 'rail' | 'switch' | 'level_crossing' | 'subway_entrance' | 'platform';
17
+ ref?: string;
18
+ barrier?: 'gate' | 'fence' | 'wall' | 'hedge' | 'kerb';
19
+ aeroway?: 'taxiway' | 'gate';
20
+ foot?: 'yes' | 'no' | 'designated';
21
+ access?: 'yes' | 'no' | 'private' | 'customers' | 'permissive' | 'destination';
22
+ footway?: 'sidewalk' | 'crossing';
23
+ public_transport?: 'platform' | 'stop_position' | 'station' | 'stop_area';
24
+ area?: 'yes';
25
+ 'wemap:routing-bounds'?: 'yes';
26
+ 'wemap:routing-io'?: 'yes';
27
+ };
@@ -0,0 +1,22 @@
1
+ import { OsmTags } from './OsmTags.js';
2
+ export default class OsmTagsUtils {
3
+ static name(tags: OsmTags): string | undefined;
4
+ static areStairs(tags: OsmTags): boolean;
5
+ static isConveying(tags: OsmTags): boolean;
6
+ static isElevator(tags: OsmTags): boolean;
7
+ static isEscalator(tags: OsmTags): boolean;
8
+ static isMovingWalkway(tags: OsmTags): boolean;
9
+ static isOneway(tags: OsmTags): boolean;
10
+ static isOnewayBackward(tags: OsmTags): boolean;
11
+ static needTicket(tags: OsmTags): boolean;
12
+ static getIncline(tags: OsmTags): "up" | "down" | undefined;
13
+ static getWheelchair(tags: OsmTags): import('./OsmTags.js').OsmWheelchair | undefined;
14
+ static getSurface(tags: OsmTags): import('./OsmTags.js').OsmSurface | undefined;
15
+ static getSmoothness(tags: OsmTags): import('./OsmTags.js').OsmSmoothness | undefined;
16
+ static isSubwayEntrance(tags: OsmTags): boolean;
17
+ static getRef(tags: OsmTags): string | undefined;
18
+ static isGate(tags: OsmTags): boolean;
19
+ static isArea(tags: OsmTags): boolean;
20
+ static isRoutingBounds(tags: OsmTags): boolean;
21
+ static isRoutingBoundsEntryPoint(tags: OsmTags): boolean;
22
+ }
@@ -1,27 +1,16 @@
1
+ import { Polygon } from 'geojson';
1
2
  import { Level_t } from '@wemap/geo';
2
- import { default as OsmElement, OsmTags } from './OsmElement.js';
3
+ import { default as OsmElement } from './OsmElement.js';
3
4
  import { default as OsmNode } from './OsmNode.js';
4
5
  import { default as OsmRelation } from './OsmRelation.js';
5
- import { OsmSmoothness, OsmSurface, OsmWheelchair } from './OsmTypes.js';
6
+ import { OsmTags } from './OsmTags.js';
6
7
  declare class OsmWay extends OsmElement {
7
8
  nodes: OsmNode[];
8
9
  relations: OsmRelation[];
9
10
  level: Level_t;
10
11
  constructor(id: number, tags?: OsmTags, level?: Level_t);
11
12
  computeLevelFromTags(): void;
12
- get areStairs(): boolean;
13
- get isConveying(): boolean;
14
- get areEscalators(): boolean;
15
- get isMovingWalkway(): boolean;
16
- get isElevator(): boolean;
17
- get isOneway(): boolean;
18
- get isOnewayBackward(): boolean;
19
- get isArea(): boolean;
20
13
  get isGeometryClosed(): boolean;
21
- get needTicket(): boolean;
22
- get incline(): 'up' | 'down' | undefined;
23
- get wheelchair(): OsmWheelchair | undefined;
24
- get surface(): OsmSurface | undefined;
25
- get smoothness(): OsmSmoothness | undefined;
14
+ getGeoJsonPolygon(): Polygon;
26
15
  }
27
16
  export default OsmWay;
package/package.json CHANGED
@@ -12,7 +12,7 @@
12
12
  "directory": "packages/osm"
13
13
  },
14
14
  "name": "@wemap/osm",
15
- "version": "12.11.3",
15
+ "version": "12.12.0",
16
16
  "bugs": {
17
17
  "url": "https://github.com/wemap/wemap-modules-js/issues"
18
18
  },
@@ -29,7 +29,7 @@
29
29
  ],
30
30
  "license": "ISC",
31
31
  "dependencies": {
32
- "@wemap/geo": "^12.11.3",
32
+ "@wemap/geo": "^12.12.0",
33
33
  "@wemap/logger": "^12.10.9",
34
34
  "saxes": "^5.0.1"
35
35
  },
@@ -46,5 +46,5 @@
46
46
  "devDependencies": {
47
47
  "@types/geojson": "^7946.0.14"
48
48
  },
49
- "gitHead": "720dada72f8a6e15e7054d86e082ff21b294708a"
49
+ "gitHead": "37e99664e922120a00c513e7c6eb7897b50dbe45"
50
50
  }