@wemap/osm 12.10.8-alpha.0 → 12.10.8-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -261
- package/dist/index.js.map +1 -1
- package/dist/src/OsmElement.d.ts +10 -0
- package/dist/src/OsmElement.spec.d.ts +1 -0
- package/dist/src/OsmModel.d.ts +16 -0
- package/dist/src/OsmModel.spec.d.ts +1 -0
- package/dist/src/OsmNode.d.ts +17 -0
- package/dist/src/OsmNode.spec.d.ts +1 -0
- package/dist/src/OsmParser.d.ts +23 -0
- package/dist/src/OsmParser.spec.d.ts +1 -0
- package/dist/src/OsmRelation.d.ts +16 -0
- package/dist/src/OsmWay.d.ts +23 -0
- package/dist/src/OsmWay.spec.d.ts +1 -0
- package/dist/vite.config.d.ts +19 -0
- package/package.json +8 -5
- package/assets/simple.osm +0 -31
- package/src/OsmElement.spec.ts +0 -13
- package/src/OsmElement.ts +0 -19
- package/src/OsmModel.spec.ts +0 -59
- package/src/OsmModel.ts +0 -42
- package/src/OsmNode.spec.ts +0 -31
- package/src/OsmNode.ts +0 -48
- package/src/OsmParser.spec.ts +0 -51
- package/src/OsmParser.ts +0 -131
- package/src/OsmRelation.ts +0 -42
- package/src/OsmWay.spec.ts +0 -61
- package/src/OsmWay.ts +0 -73
- package/tsconfig.json +0 -3
- package/vite.config.ts +0 -4
- /package/{index.ts → dist/index.d.ts} +0 -0
package/dist/index.js
CHANGED
|
@@ -1,262 +1,2 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
4
|
-
var __publicField = (obj, key, value) => {
|
|
5
|
-
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
6
|
-
return value;
|
|
7
|
-
};
|
|
8
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
9
|
-
const geo = require("@wemap/geo");
|
|
10
|
-
const saxes = require("saxes");
|
|
11
|
-
class OsmElement {
|
|
12
|
-
constructor(id, tags) {
|
|
13
|
-
__publicField(this, "id");
|
|
14
|
-
__publicField(this, "tags");
|
|
15
|
-
this.id = id;
|
|
16
|
-
this.tags = tags || {};
|
|
17
|
-
}
|
|
18
|
-
get name() {
|
|
19
|
-
return this.tags.name;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
class OsmModel {
|
|
23
|
-
constructor(nodes, ways, relations) {
|
|
24
|
-
__publicField(this, "nodes");
|
|
25
|
-
__publicField(this, "ways");
|
|
26
|
-
__publicField(this, "relations");
|
|
27
|
-
this.nodes = nodes || [];
|
|
28
|
-
this.ways = ways || [];
|
|
29
|
-
this.relations = relations || [];
|
|
30
|
-
}
|
|
31
|
-
getNodeById(id) {
|
|
32
|
-
return this.nodes.find((node) => node.id === id) || null;
|
|
33
|
-
}
|
|
34
|
-
getNodeByName(name) {
|
|
35
|
-
return this.nodes.find((node) => node.tags.name === name) || null;
|
|
36
|
-
}
|
|
37
|
-
getWayById(id) {
|
|
38
|
-
return this.ways.find((way) => way.id === id) || null;
|
|
39
|
-
}
|
|
40
|
-
getWayByName(name) {
|
|
41
|
-
return this.ways.find((way) => way.tags.name === name) || null;
|
|
42
|
-
}
|
|
43
|
-
getRelationById(id) {
|
|
44
|
-
return this.relations.find((way) => way.id === id) || null;
|
|
45
|
-
}
|
|
46
|
-
getRelationByName(name) {
|
|
47
|
-
return this.relations.find((way) => way.tags.name === name) || null;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
class OsmNode extends OsmElement {
|
|
51
|
-
constructor(id, coords, tags) {
|
|
52
|
-
super(id, tags);
|
|
53
|
-
__publicField(this, "coords");
|
|
54
|
-
__publicField(this, "ways", []);
|
|
55
|
-
__publicField(this, "relations", []);
|
|
56
|
-
this.coords = coords;
|
|
57
|
-
this.computeCoordsLevelFromTags();
|
|
58
|
-
}
|
|
59
|
-
computeCoordsLevelFromTags() {
|
|
60
|
-
if ("level" in this.tags) {
|
|
61
|
-
this.coords.level = geo.Level.fromString(this.tags.level);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
get isElevator() {
|
|
65
|
-
return this.tags.highway === "elevator";
|
|
66
|
-
}
|
|
67
|
-
get isConveying() {
|
|
68
|
-
return this.isElevator;
|
|
69
|
-
}
|
|
70
|
-
get isGate() {
|
|
71
|
-
return this.tags.barrier === "gate" || this.tags.aeroway === "gate";
|
|
72
|
-
}
|
|
73
|
-
get isSubwayEntrance() {
|
|
74
|
-
return this.tags.railway === "subway_entrance";
|
|
75
|
-
}
|
|
76
|
-
get subwayEntranceRef() {
|
|
77
|
-
if (!this.isSubwayEntrance)
|
|
78
|
-
return;
|
|
79
|
-
return this.tags.ref;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
class OsmWay extends OsmElement {
|
|
83
|
-
constructor(id, tags, level = null) {
|
|
84
|
-
super(id, tags);
|
|
85
|
-
__publicField(this, "nodes", []);
|
|
86
|
-
__publicField(this, "relations", []);
|
|
87
|
-
__publicField(this, "level", null);
|
|
88
|
-
this.level = level;
|
|
89
|
-
this.computeLevelFromTags();
|
|
90
|
-
}
|
|
91
|
-
computeLevelFromTags() {
|
|
92
|
-
if ("level" in this.tags) {
|
|
93
|
-
this.level = geo.Level.fromString(this.tags.level);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
get areStairs() {
|
|
97
|
-
return this.tags.highway === "steps" && !this.isConveying;
|
|
98
|
-
}
|
|
99
|
-
get isConveying() {
|
|
100
|
-
return Boolean(this.tags.conveying);
|
|
101
|
-
}
|
|
102
|
-
get areEscalators() {
|
|
103
|
-
return this.tags.highway === "steps" && this.isConveying;
|
|
104
|
-
}
|
|
105
|
-
get isMovingWalkway() {
|
|
106
|
-
return Boolean(this.tags.highway) && this.tags.highway !== "steps" && this.isConveying;
|
|
107
|
-
}
|
|
108
|
-
get isElevator() {
|
|
109
|
-
return this.tags.highway === "elevator";
|
|
110
|
-
}
|
|
111
|
-
get isOneway() {
|
|
112
|
-
const { highway, oneway, conveying } = this.tags;
|
|
113
|
-
return Boolean(oneway === "yes" || oneway === "true" || oneway === "1" || conveying && highway && ["forward", "backward"].includes(conveying));
|
|
114
|
-
}
|
|
115
|
-
get isOnewayBackward() {
|
|
116
|
-
return this.isOneway && this.tags.conveying === "backward";
|
|
117
|
-
}
|
|
118
|
-
get isArea() {
|
|
119
|
-
return this.tags.area === "yes";
|
|
120
|
-
}
|
|
121
|
-
get isGeometryClosed() {
|
|
122
|
-
return this.nodes[0] === this.nodes[this.nodes.length - 1];
|
|
123
|
-
}
|
|
124
|
-
get needTicket() {
|
|
125
|
-
return false;
|
|
126
|
-
}
|
|
127
|
-
get incline() {
|
|
128
|
-
if (["up", "down"].includes(this.tags.incline))
|
|
129
|
-
return this.tags.incline;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
class OsmRelation extends OsmElement {
|
|
133
|
-
constructor(id, members = [], tags) {
|
|
134
|
-
super(id, tags);
|
|
135
|
-
__publicField(this, "relations", []);
|
|
136
|
-
this.members = members;
|
|
137
|
-
}
|
|
138
|
-
isMultipolygon() {
|
|
139
|
-
return this.tags.type === "multipolygon";
|
|
140
|
-
}
|
|
141
|
-
getGeoJsonPolygon() {
|
|
142
|
-
if (!this.isMultipolygon())
|
|
143
|
-
return null;
|
|
144
|
-
const outer = this.members.find((member) => member.ref instanceof OsmWay && member.role === "outer");
|
|
145
|
-
if (!outer)
|
|
146
|
-
return null;
|
|
147
|
-
const inners = this.members.filter((member) => member.ref instanceof OsmWay && member.role === "inner");
|
|
148
|
-
return {
|
|
149
|
-
type: "Polygon",
|
|
150
|
-
coordinates: [outer, ...inners].map((member) => {
|
|
151
|
-
const way = member.ref;
|
|
152
|
-
return way.nodes.map((node) => [node.coords.lng, node.coords.lat]);
|
|
153
|
-
})
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
class OsmParser {
|
|
158
|
-
static parseOsmXmlString(osmXmlString) {
|
|
159
|
-
const model = new OsmModel();
|
|
160
|
-
const parser = new saxes.SaxesParser();
|
|
161
|
-
let buffer;
|
|
162
|
-
const isDeleted = (element) => element.attributes.action && element.attributes.action === "delete";
|
|
163
|
-
parser.on("opentag", (node) => {
|
|
164
|
-
switch (node.name) {
|
|
165
|
-
case "node": {
|
|
166
|
-
if (isDeleted(node)) {
|
|
167
|
-
buffer = null;
|
|
168
|
-
break;
|
|
169
|
-
}
|
|
170
|
-
const osmNode = this._parseNode(node.attributes);
|
|
171
|
-
buffer = osmNode;
|
|
172
|
-
model.nodes.push(osmNode);
|
|
173
|
-
break;
|
|
174
|
-
}
|
|
175
|
-
case "way": {
|
|
176
|
-
if (isDeleted(node)) {
|
|
177
|
-
buffer = null;
|
|
178
|
-
break;
|
|
179
|
-
}
|
|
180
|
-
const osmWay = this._parseWay(node.attributes);
|
|
181
|
-
buffer = osmWay;
|
|
182
|
-
model.ways.push(osmWay);
|
|
183
|
-
break;
|
|
184
|
-
}
|
|
185
|
-
case "relation": {
|
|
186
|
-
if (isDeleted(node)) {
|
|
187
|
-
buffer = null;
|
|
188
|
-
break;
|
|
189
|
-
}
|
|
190
|
-
const osmRelation = this._parseRelation(node.attributes);
|
|
191
|
-
buffer = osmRelation;
|
|
192
|
-
model.relations.push(osmRelation);
|
|
193
|
-
break;
|
|
194
|
-
}
|
|
195
|
-
case "tag": {
|
|
196
|
-
if (!buffer) {
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
|
-
const {
|
|
200
|
-
k,
|
|
201
|
-
v
|
|
202
|
-
} = node.attributes;
|
|
203
|
-
buffer.tags[k] = v;
|
|
204
|
-
break;
|
|
205
|
-
}
|
|
206
|
-
case "nd": {
|
|
207
|
-
if (!buffer || !(buffer instanceof OsmWay)) {
|
|
208
|
-
return;
|
|
209
|
-
}
|
|
210
|
-
const nodeId = Number(node.attributes.ref);
|
|
211
|
-
const refNode = model.getNodeById(nodeId);
|
|
212
|
-
if (!refNode) {
|
|
213
|
-
throw Error("Node: " + nodeId + " in way " + buffer.id + " not found");
|
|
214
|
-
}
|
|
215
|
-
buffer.nodes.push(refNode);
|
|
216
|
-
refNode.ways.push(buffer);
|
|
217
|
-
break;
|
|
218
|
-
}
|
|
219
|
-
case "member": {
|
|
220
|
-
if (!buffer || !(buffer instanceof OsmRelation)) {
|
|
221
|
-
return;
|
|
222
|
-
}
|
|
223
|
-
const memberId = Number(node.attributes.ref);
|
|
224
|
-
const memberType = node.attributes.type;
|
|
225
|
-
let refElement = null;
|
|
226
|
-
memberType === "node" && (refElement = model.getNodeById(memberId));
|
|
227
|
-
memberType === "way" && (refElement = model.getWayById(memberId));
|
|
228
|
-
memberType === "relation" && (refElement = model.getRelationById(memberId));
|
|
229
|
-
if (!refElement) {
|
|
230
|
-
throw Error("Member: " + memberId + " in relation " + buffer.id + " not found");
|
|
231
|
-
}
|
|
232
|
-
buffer.members.push({ ref: refElement, role: node.attributes.role });
|
|
233
|
-
refElement.relations.push(buffer);
|
|
234
|
-
break;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
});
|
|
238
|
-
parser.write(osmXmlString);
|
|
239
|
-
model.nodes.forEach((node) => node.computeCoordsLevelFromTags());
|
|
240
|
-
model.ways.forEach((way) => way.computeLevelFromTags());
|
|
241
|
-
return model;
|
|
242
|
-
}
|
|
243
|
-
static _parseNode(attr) {
|
|
244
|
-
return new OsmNode(
|
|
245
|
-
Number(attr.id),
|
|
246
|
-
new geo.Coordinates(Number(attr.lat), Number(attr.lon))
|
|
247
|
-
);
|
|
248
|
-
}
|
|
249
|
-
static _parseWay(attr) {
|
|
250
|
-
return new OsmWay(Number(attr.id));
|
|
251
|
-
}
|
|
252
|
-
static _parseRelation(attr) {
|
|
253
|
-
return new OsmRelation(Number(attr.id));
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
exports.OsmElement = OsmElement;
|
|
257
|
-
exports.OsmModel = OsmModel;
|
|
258
|
-
exports.OsmNode = OsmNode;
|
|
259
|
-
exports.OsmParser = OsmParser;
|
|
260
|
-
exports.OsmRelation = OsmRelation;
|
|
261
|
-
exports.OsmWay = OsmWay;
|
|
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}}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;
|
|
262
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';\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\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":["Level","SaxesParser","Coordinates"],"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 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';\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\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","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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { default as OsmNode } from './OsmNode.js';
|
|
2
|
+
import { default as OsmRelation } from './OsmRelation.js';
|
|
3
|
+
import { default as OsmWay } from './OsmWay.js';
|
|
4
|
+
declare class OsmModel {
|
|
5
|
+
nodes: OsmNode[];
|
|
6
|
+
ways: OsmWay[];
|
|
7
|
+
relations: OsmRelation[];
|
|
8
|
+
constructor(nodes?: OsmNode[], ways?: OsmWay[], relations?: OsmRelation[]);
|
|
9
|
+
getNodeById(id: number): OsmNode | null;
|
|
10
|
+
getNodeByName(name: string): OsmNode | null;
|
|
11
|
+
getWayById(id: number): OsmWay | null;
|
|
12
|
+
getWayByName(name: string): OsmWay | null;
|
|
13
|
+
getRelationById(id: number): OsmRelation | null;
|
|
14
|
+
getRelationByName(name: string): OsmRelation | null;
|
|
15
|
+
}
|
|
16
|
+
export default OsmModel;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Coordinates } from '@wemap/geo';
|
|
2
|
+
import { default as OsmElement, OsmTags } from './OsmElement.js';
|
|
3
|
+
import { default as OsmRelation } from './OsmRelation.js';
|
|
4
|
+
import { default as OsmWay } from './OsmWay.js';
|
|
5
|
+
declare class OsmNode extends OsmElement {
|
|
6
|
+
coords: Coordinates;
|
|
7
|
+
ways: OsmWay[];
|
|
8
|
+
relations: OsmRelation[];
|
|
9
|
+
constructor(id: number, coords: Coordinates, tags?: OsmTags);
|
|
10
|
+
computeCoordsLevelFromTags(): void;
|
|
11
|
+
get isElevator(): boolean;
|
|
12
|
+
get isConveying(): boolean;
|
|
13
|
+
get isGate(): boolean;
|
|
14
|
+
get isSubwayEntrance(): boolean;
|
|
15
|
+
get subwayEntranceRef(): string | undefined;
|
|
16
|
+
}
|
|
17
|
+
export default OsmNode;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { default as OsmModel } from './OsmModel.js';
|
|
2
|
+
import { default as OsmNode } from './OsmNode.js';
|
|
3
|
+
import { default as OsmWay } from './OsmWay.js';
|
|
4
|
+
import { default as OsmRelation } from './OsmRelation.js';
|
|
5
|
+
type OsmXmlElement = {
|
|
6
|
+
action?: 'delete';
|
|
7
|
+
};
|
|
8
|
+
type OsmXmlNode = {
|
|
9
|
+
id: string;
|
|
10
|
+
lat: string;
|
|
11
|
+
lon: string;
|
|
12
|
+
} & OsmXmlElement;
|
|
13
|
+
declare class OsmParser {
|
|
14
|
+
static parseOsmXmlString(osmXmlString: string): OsmModel;
|
|
15
|
+
static _parseNode(attr: OsmXmlNode): OsmNode;
|
|
16
|
+
static _parseWay(attr: {
|
|
17
|
+
id: string;
|
|
18
|
+
}): OsmWay;
|
|
19
|
+
static _parseRelation(attr: {
|
|
20
|
+
id: string;
|
|
21
|
+
}): OsmRelation;
|
|
22
|
+
}
|
|
23
|
+
export default OsmParser;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { default as OsmElement, OsmTags } from './OsmElement.js';
|
|
2
|
+
import { default as OsmNode } from './OsmNode.js';
|
|
3
|
+
import { default as OsmWay } from './OsmWay.js';
|
|
4
|
+
import { Polygon } from 'geojson';
|
|
5
|
+
export type OsmRelationMember = {
|
|
6
|
+
ref: OsmRelation | OsmWay | OsmNode;
|
|
7
|
+
role: string;
|
|
8
|
+
};
|
|
9
|
+
declare class OsmRelation extends OsmElement {
|
|
10
|
+
members: OsmRelationMember[];
|
|
11
|
+
relations: OsmRelation[];
|
|
12
|
+
constructor(id: number, members?: OsmRelationMember[], tags?: OsmTags);
|
|
13
|
+
isMultipolygon(): boolean;
|
|
14
|
+
getGeoJsonPolygon(): Polygon | null;
|
|
15
|
+
}
|
|
16
|
+
export default OsmRelation;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Level_t } from '@wemap/geo';
|
|
2
|
+
import { default as OsmElement, OsmTags } from './OsmElement.js';
|
|
3
|
+
import { default as OsmNode } from './OsmNode.js';
|
|
4
|
+
import { default as OsmRelation } from './OsmRelation.js';
|
|
5
|
+
declare class OsmWay extends OsmElement {
|
|
6
|
+
nodes: OsmNode[];
|
|
7
|
+
relations: OsmRelation[];
|
|
8
|
+
level: Level_t;
|
|
9
|
+
constructor(id: number, tags?: OsmTags, level?: Level_t);
|
|
10
|
+
computeLevelFromTags(): void;
|
|
11
|
+
get areStairs(): boolean;
|
|
12
|
+
get isConveying(): boolean;
|
|
13
|
+
get areEscalators(): boolean;
|
|
14
|
+
get isMovingWalkway(): boolean;
|
|
15
|
+
get isElevator(): boolean;
|
|
16
|
+
get isOneway(): boolean;
|
|
17
|
+
get isOnewayBackward(): boolean;
|
|
18
|
+
get isArea(): boolean;
|
|
19
|
+
get isGeometryClosed(): boolean;
|
|
20
|
+
get needTicket(): boolean;
|
|
21
|
+
get incline(): 'up' | 'down' | undefined;
|
|
22
|
+
}
|
|
23
|
+
export default OsmWay;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
declare const _default: {
|
|
2
|
+
build: {
|
|
3
|
+
minify: string;
|
|
4
|
+
lib: {
|
|
5
|
+
entry: string;
|
|
6
|
+
name: string;
|
|
7
|
+
formats: string[];
|
|
8
|
+
fileName: (format: string) => "index.mjs" | "index.js";
|
|
9
|
+
};
|
|
10
|
+
sourcemap: boolean;
|
|
11
|
+
};
|
|
12
|
+
plugins: import('vite').Plugin[];
|
|
13
|
+
optimizeDeps: {
|
|
14
|
+
esbuildOptions: {
|
|
15
|
+
jsx: string;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
export default _default;
|
package/package.json
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"directory": "packages/osm"
|
|
13
13
|
},
|
|
14
14
|
"name": "@wemap/osm",
|
|
15
|
-
"version": "12.10.8-alpha.
|
|
15
|
+
"version": "12.10.8-alpha.1",
|
|
16
16
|
"bugs": {
|
|
17
17
|
"url": "https://github.com/wemap/wemap-modules-js/issues"
|
|
18
18
|
},
|
|
@@ -29,13 +29,16 @@
|
|
|
29
29
|
],
|
|
30
30
|
"license": "ISC",
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@wemap/geo": "^12.10.8-alpha.
|
|
33
|
-
"@wemap/logger": "^12.10.
|
|
32
|
+
"@wemap/geo": "^12.10.8-alpha.1",
|
|
33
|
+
"@wemap/logger": "^12.10.8-alpha.1",
|
|
34
34
|
"saxes": "^5.0.1"
|
|
35
35
|
},
|
|
36
|
+
"files": [
|
|
37
|
+
"dist"
|
|
38
|
+
],
|
|
36
39
|
"exports": {
|
|
37
40
|
".": {
|
|
38
|
-
"types": "./index.ts",
|
|
41
|
+
"types": "./dist/index.d.ts",
|
|
39
42
|
"import": "./dist/index.mjs",
|
|
40
43
|
"require": "./dist/index.js"
|
|
41
44
|
}
|
|
@@ -43,5 +46,5 @@
|
|
|
43
46
|
"devDependencies": {
|
|
44
47
|
"@types/geojson": "^7946.0.14"
|
|
45
48
|
},
|
|
46
|
-
"gitHead": "
|
|
49
|
+
"gitHead": "86498ac564a83bdbd527ba7db9557175d5f27e3f"
|
|
47
50
|
}
|
package/assets/simple.osm
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
<?xml version='1.0' encoding='UTF-8'?>
|
|
2
|
-
<osm version='0.6'>
|
|
3
|
-
<node id='-1' action='modify' visible='true' lat='43.60942861314' lon='3.88420107589'>
|
|
4
|
-
<tag k='name' v='p1' />
|
|
5
|
-
</node>
|
|
6
|
-
<node id='-2' action='modify' visible='true' lat='43.60938929783' lon='3.8841913836'>
|
|
7
|
-
<tag k='name' v='p2' />
|
|
8
|
-
</node>
|
|
9
|
-
<node id='-3' action='modify' visible='true' lat='43.60940277907' lon='3.88421907562'>
|
|
10
|
-
<tag k='name' v='p3' />
|
|
11
|
-
</node>
|
|
12
|
-
<node id='-4' action='modify' visible='true' lat='43.60937924953' lon='3.88418893318'>
|
|
13
|
-
<tag k='name' v='p4' />
|
|
14
|
-
</node>
|
|
15
|
-
<node id='-5' action='delete' visible='true' lat='43.6094255609' lon='3.88422469196'>
|
|
16
|
-
<tag k='name' v='p5' />
|
|
17
|
-
</node>
|
|
18
|
-
<way id='-101' action='modify' visible='true'>
|
|
19
|
-
<nd ref='-1' />
|
|
20
|
-
<nd ref='-2' />
|
|
21
|
-
<nd ref='-3' />
|
|
22
|
-
</way>
|
|
23
|
-
<way id='-102' action='modify' visible='true'>
|
|
24
|
-
<nd ref='-3' />
|
|
25
|
-
<nd ref='-4' />
|
|
26
|
-
</way>
|
|
27
|
-
<way id='-103' action='delete' visible='true'>
|
|
28
|
-
<nd ref='-4' />
|
|
29
|
-
<nd ref='-5' />
|
|
30
|
-
</way>
|
|
31
|
-
</osm>
|
package/src/OsmElement.spec.ts
DELETED
package/src/OsmElement.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
export type OsmTags = { [key: string]: string };
|
|
3
|
-
|
|
4
|
-
class OsmElement {
|
|
5
|
-
|
|
6
|
-
id: number;
|
|
7
|
-
tags: OsmTags;
|
|
8
|
-
|
|
9
|
-
constructor(id: number, tags?: OsmTags) {
|
|
10
|
-
this.id = id;
|
|
11
|
-
this.tags = tags || {};
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
get name(): string | undefined {
|
|
15
|
-
return this.tags.name;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export default OsmElement;
|
package/src/OsmModel.spec.ts
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import chai from 'chai';
|
|
2
|
-
|
|
3
|
-
import { Coordinates } from '@wemap/geo';
|
|
4
|
-
import Logger from '@wemap/logger';
|
|
5
|
-
|
|
6
|
-
import OsmModel from './OsmModel.js';
|
|
7
|
-
import OsmNode from './OsmNode.js';
|
|
8
|
-
import OsmWay from './OsmWay.js';
|
|
9
|
-
|
|
10
|
-
Logger.enable(false);
|
|
11
|
-
|
|
12
|
-
const { expect } = chai;
|
|
13
|
-
|
|
14
|
-
describe('OsmModel', () => {
|
|
15
|
-
|
|
16
|
-
const nodes = [
|
|
17
|
-
new OsmNode(1, new Coordinates(45, 5), {name: 'p1'}),
|
|
18
|
-
new OsmNode(2, new Coordinates(46, 5.5), {name: 'p2'}),
|
|
19
|
-
new OsmNode(3, new Coordinates(46.1, 5.3), {name: 'p3'}),
|
|
20
|
-
new OsmNode(4, new Coordinates(46, 5.6), {name: 'p4'})
|
|
21
|
-
];
|
|
22
|
-
|
|
23
|
-
const ways = [
|
|
24
|
-
new OsmWay(101, {name: 'w1'}),
|
|
25
|
-
new OsmWay(102, {name: 'w2'})
|
|
26
|
-
];
|
|
27
|
-
|
|
28
|
-
ways[0].nodes = [nodes[0], nodes[1], nodes[2]];
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
it('creation', () => {
|
|
32
|
-
expect(() => new OsmModel()).not.throw(Error);
|
|
33
|
-
expect(() => new OsmModel([], [])).not.throw(Error);
|
|
34
|
-
expect(() => new OsmModel(nodes, ways)).not.throw(Error);
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
it('find nodes', () => {
|
|
39
|
-
const model = new OsmModel(nodes, ways);
|
|
40
|
-
expect(model.getNodeById(1)).equals(nodes[0]);
|
|
41
|
-
expect(model.getNodeById(5)).is.null;
|
|
42
|
-
expect(model.getNodeById(101)).is.null;
|
|
43
|
-
|
|
44
|
-
expect(model.getNodeByName('p2')).equals(nodes[1]);
|
|
45
|
-
expect(model.getNodeByName('p5')).is.null;
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
it('find ways', () => {
|
|
50
|
-
const model = new OsmModel(nodes, ways);
|
|
51
|
-
expect(model.getWayById(1)).is.null;
|
|
52
|
-
expect(model.getWayById(5)).is.null;
|
|
53
|
-
expect(model.getWayById(101)).equals(ways[0]);
|
|
54
|
-
|
|
55
|
-
expect(model.getWayByName('w2')).equals(ways[1]);
|
|
56
|
-
expect(model.getWayByName('w5')).is.null;
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
});
|
package/src/OsmModel.ts
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import OsmNode from './OsmNode.js';
|
|
2
|
-
import OsmRelation from './OsmRelation.js';
|
|
3
|
-
import OsmWay from './OsmWay.js';
|
|
4
|
-
|
|
5
|
-
class OsmModel {
|
|
6
|
-
|
|
7
|
-
nodes: OsmNode[];
|
|
8
|
-
ways: OsmWay[];
|
|
9
|
-
relations: OsmRelation[];
|
|
10
|
-
|
|
11
|
-
constructor(nodes?: OsmNode[], ways?: OsmWay[], relations?: OsmRelation[]) {
|
|
12
|
-
this.nodes = nodes || [];
|
|
13
|
-
this.ways = ways || [];
|
|
14
|
-
this.relations = relations || [];
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
getNodeById(id: number) {
|
|
18
|
-
return this.nodes.find(node => node.id === id) || null;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
getNodeByName(name: string) {
|
|
22
|
-
return this.nodes.find(node => node.tags.name === name) || null;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
getWayById(id: number) {
|
|
26
|
-
return this.ways.find(way => way.id === id) || null;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
getWayByName(name: string) {
|
|
30
|
-
return this.ways.find(way => way.tags.name === name) || null;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
getRelationById(id: number) {
|
|
34
|
-
return this.relations.find(way => way.id === id) || null;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
getRelationByName(name: string) {
|
|
38
|
-
return this.relations.find(way => way.tags.name === name) || null;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export default OsmModel;
|
package/src/OsmNode.spec.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import chai from 'chai';
|
|
2
|
-
|
|
3
|
-
import { Coordinates } from '@wemap/geo';
|
|
4
|
-
|
|
5
|
-
import OsmNode from './OsmNode.js';
|
|
6
|
-
|
|
7
|
-
const { expect } = chai;
|
|
8
|
-
|
|
9
|
-
describe('OsmNode', () => {
|
|
10
|
-
|
|
11
|
-
it('creation', () => {
|
|
12
|
-
expect(() => new OsmNode(0, new Coordinates(0, 0))).not.throw(Error);
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
it('getters', () => {
|
|
16
|
-
let node;
|
|
17
|
-
|
|
18
|
-
node = new OsmNode(0, new Coordinates(0, 0));
|
|
19
|
-
expect(node.isElevator).is.false;
|
|
20
|
-
expect(node.isConveying).is.false;
|
|
21
|
-
|
|
22
|
-
node = new OsmNode(0, new Coordinates(0, 0), { highway: 'elevator' });
|
|
23
|
-
expect(node.isElevator).is.true;
|
|
24
|
-
expect(node.isConveying).is.true;
|
|
25
|
-
|
|
26
|
-
node = new OsmNode(0, new Coordinates(0, 0), { highway: 'stop' });
|
|
27
|
-
expect(node.isElevator).is.false;
|
|
28
|
-
expect(node.isConveying).is.false;
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
});
|
package/src/OsmNode.ts
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { Coordinates, Level } from '@wemap/geo';
|
|
2
|
-
|
|
3
|
-
import OsmElement, { OsmTags } from './OsmElement.js';
|
|
4
|
-
import OsmRelation from './OsmRelation.js';
|
|
5
|
-
import OsmWay from './OsmWay.js';
|
|
6
|
-
|
|
7
|
-
class OsmNode extends OsmElement {
|
|
8
|
-
|
|
9
|
-
coords: Coordinates;
|
|
10
|
-
ways: OsmWay[] = [];
|
|
11
|
-
relations: OsmRelation[] = [];
|
|
12
|
-
|
|
13
|
-
constructor(id: number, coords: Coordinates, tags?: OsmTags) {
|
|
14
|
-
super(id, tags);
|
|
15
|
-
this.coords = coords;
|
|
16
|
-
this.computeCoordsLevelFromTags();
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
computeCoordsLevelFromTags() {
|
|
20
|
-
if ('level' in this.tags) {
|
|
21
|
-
this.coords.level = Level.fromString(this.tags.level);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
get isElevator() {
|
|
26
|
-
return this.tags.highway === 'elevator';
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
get isConveying() {
|
|
30
|
-
return this.isElevator;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
get isGate() {
|
|
34
|
-
return this.tags.barrier === 'gate' || this.tags.aeroway === 'gate';
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
get isSubwayEntrance() {
|
|
38
|
-
return this.tags.railway === 'subway_entrance';
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
get subwayEntranceRef() {
|
|
42
|
-
if (!this.isSubwayEntrance) return;
|
|
43
|
-
return this.tags.ref;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export default OsmNode;
|
package/src/OsmParser.spec.ts
DELETED
|
@@ -1,51 +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 OsmParser from './OsmParser.js';
|
|
7
|
-
|
|
8
|
-
const { expect } = chai;
|
|
9
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
10
|
-
|
|
11
|
-
describe('OsmParser', () => {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
it('parseOsmXmlString', () => {
|
|
15
|
-
|
|
16
|
-
const filePath = path.resolve(__dirname, '../assets/simple.osm');
|
|
17
|
-
const osmXmlString = fs.readFileSync(filePath, 'utf8');
|
|
18
|
-
|
|
19
|
-
const model = OsmParser.parseOsmXmlString(osmXmlString);
|
|
20
|
-
|
|
21
|
-
expect(model.nodes.length).equals(4);
|
|
22
|
-
expect(model.ways.length).equals(2);
|
|
23
|
-
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
it('parseOsmXmlString - Unknown node ref', () => {
|
|
28
|
-
expect(() => OsmParser.parseOsmXmlString(`
|
|
29
|
-
<osm>
|
|
30
|
-
<way id='1'>
|
|
31
|
-
<nd ref='2' />
|
|
32
|
-
</way>
|
|
33
|
-
</osm>
|
|
34
|
-
`)).throw(Error);
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it('parseOsmXmlString - parse level', () => {
|
|
38
|
-
|
|
39
|
-
const model = OsmParser.parseOsmXmlString(`
|
|
40
|
-
<osm>
|
|
41
|
-
<node id='1' lat='0' lon ='0' />
|
|
42
|
-
<way id='2'>
|
|
43
|
-
<nd ref='1' />
|
|
44
|
-
<tag k='level' v='0' />
|
|
45
|
-
</way>
|
|
46
|
-
</osm>
|
|
47
|
-
`);
|
|
48
|
-
expect(model.ways[0].level).equals(0);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
});
|
package/src/OsmParser.ts
DELETED
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
/* eslint-disable max-statements */
|
|
2
|
-
import { SaxesParser } from 'saxes';
|
|
3
|
-
|
|
4
|
-
import { Coordinates } from '@wemap/geo';
|
|
5
|
-
|
|
6
|
-
import OsmModel from './OsmModel.js';
|
|
7
|
-
import OsmNode from './OsmNode.js';
|
|
8
|
-
import OsmWay from './OsmWay.js';
|
|
9
|
-
import OsmRelation from './OsmRelation.js';
|
|
10
|
-
|
|
11
|
-
type OsmXmlElement = { action?: 'delete' };
|
|
12
|
-
type OsmXmlNode = { id: string, lat: string, lon: string } & OsmXmlElement;
|
|
13
|
-
type OsmXmlWay = { id: string } & OsmXmlElement;
|
|
14
|
-
type OsmXmlRelation = { id: string } & OsmXmlElement;
|
|
15
|
-
|
|
16
|
-
class OsmParser {
|
|
17
|
-
|
|
18
|
-
static parseOsmXmlString(osmXmlString: string) {
|
|
19
|
-
|
|
20
|
-
const model = new OsmModel();
|
|
21
|
-
const parser = new SaxesParser();
|
|
22
|
-
|
|
23
|
-
let buffer: OsmNode | OsmWay | OsmRelation | null;
|
|
24
|
-
|
|
25
|
-
const isDeleted = (element: { attributes: OsmXmlElement }) =>
|
|
26
|
-
element.attributes.action && element.attributes.action === 'delete';
|
|
27
|
-
|
|
28
|
-
parser.on('opentag', (node) => {
|
|
29
|
-
|
|
30
|
-
switch (node.name) {
|
|
31
|
-
case 'node': {
|
|
32
|
-
if (isDeleted(node)) {
|
|
33
|
-
buffer = null;
|
|
34
|
-
break;
|
|
35
|
-
}
|
|
36
|
-
const osmNode = this._parseNode(node.attributes as OsmXmlNode);
|
|
37
|
-
buffer = osmNode;
|
|
38
|
-
model.nodes.push(osmNode);
|
|
39
|
-
break;
|
|
40
|
-
}
|
|
41
|
-
case 'way': {
|
|
42
|
-
if (isDeleted(node)) {
|
|
43
|
-
buffer = null;
|
|
44
|
-
break;
|
|
45
|
-
}
|
|
46
|
-
const osmWay = this._parseWay(node.attributes as OsmXmlWay);
|
|
47
|
-
buffer = osmWay;
|
|
48
|
-
model.ways.push(osmWay);
|
|
49
|
-
break;
|
|
50
|
-
}
|
|
51
|
-
case 'relation': {
|
|
52
|
-
if (isDeleted(node)) {
|
|
53
|
-
buffer = null;
|
|
54
|
-
break;
|
|
55
|
-
}
|
|
56
|
-
const osmRelation = this._parseRelation(node.attributes as OsmXmlRelation);
|
|
57
|
-
buffer = osmRelation;
|
|
58
|
-
model.relations.push(osmRelation);
|
|
59
|
-
break;
|
|
60
|
-
}
|
|
61
|
-
case 'tag': {
|
|
62
|
-
if (!buffer) {
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
const {
|
|
66
|
-
k, v
|
|
67
|
-
} = node.attributes;
|
|
68
|
-
buffer.tags[k] = v;
|
|
69
|
-
break;
|
|
70
|
-
}
|
|
71
|
-
case 'nd': {
|
|
72
|
-
if (!buffer || !(buffer instanceof OsmWay)) {
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
const nodeId = Number(node.attributes.ref);
|
|
76
|
-
const refNode = model.getNodeById(nodeId);
|
|
77
|
-
if (!refNode) {
|
|
78
|
-
throw Error('Node: ' + nodeId + ' in way ' + buffer.id + ' not found');
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
buffer.nodes.push(refNode);
|
|
82
|
-
refNode.ways.push(buffer);
|
|
83
|
-
break;
|
|
84
|
-
}
|
|
85
|
-
case 'member': {
|
|
86
|
-
if (!buffer || !(buffer instanceof OsmRelation)) {
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
const memberId = Number(node.attributes.ref);
|
|
90
|
-
const memberType = node.attributes.type;
|
|
91
|
-
let refElement: OsmNode | OsmWay | OsmRelation | null = null;
|
|
92
|
-
memberType === 'node' && (refElement = model.getNodeById(memberId));
|
|
93
|
-
memberType === 'way' && (refElement = model.getWayById(memberId));
|
|
94
|
-
memberType === 'relation' && (refElement = model.getRelationById(memberId));
|
|
95
|
-
|
|
96
|
-
if (!refElement) {
|
|
97
|
-
throw Error('Member: ' + memberId + ' in relation ' + buffer.id + ' not found');
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
buffer.members.push({ ref: refElement, role: node.attributes.role });
|
|
101
|
-
refElement.relations.push(buffer);
|
|
102
|
-
break;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
parser.write(osmXmlString);
|
|
108
|
-
|
|
109
|
-
model.nodes.forEach(node => node.computeCoordsLevelFromTags());
|
|
110
|
-
model.ways.forEach(way => way.computeLevelFromTags());
|
|
111
|
-
|
|
112
|
-
return model;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
static _parseNode(attr: OsmXmlNode) {
|
|
117
|
-
return new OsmNode(
|
|
118
|
-
Number(attr.id),
|
|
119
|
-
new Coordinates(Number(attr.lat), Number(attr.lon)));
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
static _parseWay(attr: { id: string }) {
|
|
123
|
-
return new OsmWay(Number(attr.id));
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
static _parseRelation(attr: { id: string }) {
|
|
127
|
-
return new OsmRelation(Number(attr.id));
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
export default OsmParser;
|
package/src/OsmRelation.ts
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import OsmElement, { OsmTags } from './OsmElement.js';
|
|
2
|
-
import OsmNode from './OsmNode.js';
|
|
3
|
-
import OsmWay from './OsmWay.js';
|
|
4
|
-
import type { Position, Polygon } from 'geojson';
|
|
5
|
-
|
|
6
|
-
export type OsmRelationMember = {
|
|
7
|
-
ref: OsmRelation | OsmWay | OsmNode,
|
|
8
|
-
role: string
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
class OsmRelation extends OsmElement {
|
|
12
|
-
|
|
13
|
-
relations: OsmRelation[] = [];
|
|
14
|
-
|
|
15
|
-
constructor(
|
|
16
|
-
id: number,
|
|
17
|
-
public members: OsmRelationMember[] = [],
|
|
18
|
-
tags?: OsmTags
|
|
19
|
-
) {
|
|
20
|
-
super(id, tags);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
isMultipolygon() {
|
|
24
|
-
return this.tags.type === 'multipolygon';
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
getGeoJsonPolygon(): Polygon | null {
|
|
28
|
-
if (!this.isMultipolygon()) return null;
|
|
29
|
-
const outer = this.members.find(member => member.ref instanceof OsmWay && member.role === 'outer');
|
|
30
|
-
if (!outer) return null;
|
|
31
|
-
const inners = this.members.filter(member => member.ref instanceof OsmWay && member.role === 'inner');
|
|
32
|
-
return {
|
|
33
|
-
type: "Polygon",
|
|
34
|
-
coordinates: [outer, ...inners].map(member => {
|
|
35
|
-
const way = member.ref as OsmWay;
|
|
36
|
-
return way.nodes.map(node => [node.coords.lng, node.coords.lat] as Position);
|
|
37
|
-
})
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export default OsmRelation;
|
package/src/OsmWay.spec.ts
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/* eslint-disable max-statements */
|
|
2
|
-
import chai from 'chai';
|
|
3
|
-
|
|
4
|
-
import OsmWay from './OsmWay.js';
|
|
5
|
-
|
|
6
|
-
const { expect } = chai;
|
|
7
|
-
|
|
8
|
-
describe('OsmWay', () => {
|
|
9
|
-
|
|
10
|
-
it('creation', () => {
|
|
11
|
-
expect(() => new OsmWay(0)).not.throw(Error);
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
it('getters', () => {
|
|
15
|
-
let way;
|
|
16
|
-
|
|
17
|
-
way = new OsmWay(0);
|
|
18
|
-
expect(way.areStairs).is.false;
|
|
19
|
-
expect(way.isConveying).is.false;
|
|
20
|
-
expect(way.areEscalators).is.false;
|
|
21
|
-
expect(way.isMovingWalkway).is.false;
|
|
22
|
-
|
|
23
|
-
way = new OsmWay(0, { highway: 'stop' });
|
|
24
|
-
expect(way.areStairs).is.false;
|
|
25
|
-
expect(way.isConveying).is.false;
|
|
26
|
-
expect(way.areEscalators).is.false;
|
|
27
|
-
expect(way.isMovingWalkway).is.false;
|
|
28
|
-
|
|
29
|
-
way = new OsmWay(0, { highway: 'steps' });
|
|
30
|
-
expect(way.areStairs).is.true;
|
|
31
|
-
expect(way.isConveying).is.false;
|
|
32
|
-
expect(way.areEscalators).is.false;
|
|
33
|
-
expect(way.isMovingWalkway).is.false;
|
|
34
|
-
|
|
35
|
-
way = new OsmWay(0, {
|
|
36
|
-
highway: 'steps',
|
|
37
|
-
conveying: 'yes'
|
|
38
|
-
});
|
|
39
|
-
expect(way.areStairs).is.false;
|
|
40
|
-
expect(way.isConveying).is.true;
|
|
41
|
-
expect(way.areEscalators).is.true;
|
|
42
|
-
expect(way.isMovingWalkway).is.false;
|
|
43
|
-
|
|
44
|
-
way = new OsmWay(0, { highway: 'footway' });
|
|
45
|
-
expect(way.areStairs).is.false;
|
|
46
|
-
expect(way.isConveying).is.false;
|
|
47
|
-
expect(way.areEscalators).is.false;
|
|
48
|
-
expect(way.isMovingWalkway).is.false;
|
|
49
|
-
|
|
50
|
-
way = new OsmWay(0, {
|
|
51
|
-
highway: 'footway',
|
|
52
|
-
conveying: 'yes'
|
|
53
|
-
});
|
|
54
|
-
expect(way.areStairs).is.false;
|
|
55
|
-
expect(way.isConveying).is.true;
|
|
56
|
-
expect(way.areEscalators).is.false;
|
|
57
|
-
expect(way.isMovingWalkway).is.true;
|
|
58
|
-
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
});
|
package/src/OsmWay.ts
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { Level, Level_t } from '@wemap/geo';
|
|
2
|
-
import OsmElement, { OsmTags } from './OsmElement.js';
|
|
3
|
-
import OsmNode from './OsmNode.js';
|
|
4
|
-
import OsmRelation from './OsmRelation.js';
|
|
5
|
-
|
|
6
|
-
class OsmWay extends OsmElement {
|
|
7
|
-
|
|
8
|
-
nodes: OsmNode[] = [];
|
|
9
|
-
relations: OsmRelation[] = [];
|
|
10
|
-
level: Level_t = null;
|
|
11
|
-
|
|
12
|
-
constructor(id: number, tags?: OsmTags, level: Level_t = null) {
|
|
13
|
-
super(id, tags);
|
|
14
|
-
this.level = level;
|
|
15
|
-
this.computeLevelFromTags();
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
computeLevelFromTags() {
|
|
19
|
-
if ('level' in this.tags) {
|
|
20
|
-
this.level = Level.fromString(this.tags.level);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
get areStairs() {
|
|
25
|
-
return this.tags.highway === 'steps' && !this.isConveying;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
get isConveying() {
|
|
29
|
-
return Boolean(this.tags.conveying);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
get areEscalators() {
|
|
33
|
-
return this.tags.highway === 'steps' && this.isConveying;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
get isMovingWalkway() {
|
|
37
|
-
return Boolean(this.tags.highway) && this.tags.highway !== 'steps' && this.isConveying;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
get isElevator() {
|
|
41
|
-
return this.tags.highway === 'elevator';
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
get isOneway() {
|
|
45
|
-
const { highway, oneway, conveying } = this.tags;
|
|
46
|
-
return Boolean((oneway === 'yes' || oneway === 'true' || oneway === '1')
|
|
47
|
-
|| (conveying && highway && ['forward', 'backward'].includes(conveying)));
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
get isOnewayBackward() {
|
|
51
|
-
return this.isOneway && this.tags.conveying === 'backward';
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
get isArea() {
|
|
55
|
-
return this.tags.area === 'yes';
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
get isGeometryClosed() {
|
|
59
|
-
return this.nodes[0] === this.nodes[this.nodes.length - 1];
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
get needTicket() {
|
|
63
|
-
// TODO
|
|
64
|
-
return false;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
get incline(): 'up' | 'down' | undefined {
|
|
68
|
-
if (['up', 'down'].includes(this.tags.incline))
|
|
69
|
-
return this.tags.incline as 'up' | 'down';
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export default OsmWay;
|
package/tsconfig.json
DELETED
package/vite.config.ts
DELETED
|
File without changes
|