osm2geojson-lite 0.9.1 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,7 +10,7 @@
10
10
  "license": "ISC",
11
11
  "dependencies": {
12
12
  "osmtogeojson": "^3.0.0-beta.3",
13
- "xmldom": "^0.1.27"
13
+ "xmldom": "^0.6.0"
14
14
  }
15
15
  },
16
16
  "node_modules/@mapbox/geojson-area": {
@@ -292,6 +292,15 @@
292
292
  "@types/geojson": "^1.0.2"
293
293
  }
294
294
  },
295
+ "node_modules/osmtogeojson/node_modules/xmldom": {
296
+ "version": "0.1.31",
297
+ "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz",
298
+ "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==",
299
+ "deprecated": "Deprecated due to CVE-2021-21366 resolved in 0.5.0",
300
+ "engines": {
301
+ "node": ">=0.1"
302
+ }
303
+ },
295
304
  "node_modules/pbf": {
296
305
  "version": "3.2.1",
297
306
  "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz",
@@ -442,12 +451,11 @@
442
451
  }
443
452
  },
444
453
  "node_modules/xmldom": {
445
- "version": "0.1.31",
446
- "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz",
447
- "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==",
448
- "deprecated": "Deprecated due to CVE-2021-21366 resolved in 0.5.0",
454
+ "version": "0.6.0",
455
+ "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.6.0.tgz",
456
+ "integrity": "sha512-iAcin401y58LckRZ0TkI4k0VSM1Qg0KGSc3i8rU+xrxe19A/BN1zHyVSJY7uoutVlaTSzYyk/v5AmkewAP7jtg==",
449
457
  "engines": {
450
- "node": ">=0.1"
458
+ "node": ">=10.0.0"
451
459
  }
452
460
  }
453
461
  },
@@ -683,6 +691,13 @@
683
691
  "osm-polygon-features": "^0.9.1",
684
692
  "tiny-osmpbf": "^0.1.0",
685
693
  "xmldom": "~0.1.16"
694
+ },
695
+ "dependencies": {
696
+ "xmldom": {
697
+ "version": "0.1.31",
698
+ "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz",
699
+ "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ=="
700
+ }
686
701
  }
687
702
  },
688
703
  "pbf": {
@@ -808,9 +823,9 @@
808
823
  "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
809
824
  },
810
825
  "xmldom": {
811
- "version": "0.1.31",
812
- "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz",
813
- "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ=="
826
+ "version": "0.6.0",
827
+ "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.6.0.tgz",
828
+ "integrity": "sha512-iAcin401y58LckRZ0TkI4k0VSM1Qg0KGSc3i8rU+xrxe19A/BN1zHyVSJY7uoutVlaTSzYyk/v5AmkewAP7jtg=="
814
829
  }
815
830
  }
816
831
  }
@@ -10,6 +10,6 @@
10
10
  "license": "ISC",
11
11
  "dependencies": {
12
12
  "osmtogeojson": "^3.0.0-beta.3",
13
- "xmldom": "^0.1.27"
13
+ "xmldom": "^0.6.0"
14
14
  }
15
15
  }
package/lib/index.js CHANGED
@@ -1,205 +1,205 @@
1
1
  const {Node, Way, Relation} = require('./osmobjs.js'),
2
- {purgeProps, RefElements} = require('./utils.js'),
3
- XmlParser = require('./xmlparser.js');
2
+ {purgeProps, RefElements} = require('./utils.js'),
3
+ XmlParser = require('./xmlparser.js');
4
4
 
5
5
  module.exports = (osm, opts) => {
6
- let completeFeature = false, renderTagged = false, excludeWay = true;
7
-
8
- const parseOpts = opts => {
9
- if (opts) {
10
- completeFeature = opts.completeFeature || opts.allFeatures? true : false;
11
- renderTagged = opts.renderTagged? true : false;
12
- let wayOpt = opts.suppressWay || opts.excludeWay;
13
- if (wayOpt !== undefined && !wayOpt) {
14
- excludeWay = false;
15
- }
16
- }
17
- }
18
-
19
- parseOpts(opts);
20
-
21
- const detectFormat = osm => {
22
- if (osm.elements) {
23
- return 'json';
24
- }
25
- if (osm.indexOf('<osm') >= 0) {
26
- return 'xml';
27
- }
28
- if (osm.trim().startsWith('{')) {
29
- return 'json-raw';
30
- }
31
- return 'invalid';
32
- }
33
-
34
- let format = detectFormat(osm);
35
-
36
- let refElements = new RefElements(), featureArray = [];
37
-
38
- const analyzeFeaturesFromJson = osm => {
39
- for (let elem of osm.elements) {
40
- switch(elem.type) {
41
- case 'node':
42
- let node = new Node(elem.id, refElements);
43
- if (elem.tags) {
44
- node.addTags(elem.tags);
45
- }
46
- node.addProps(purgeProps(elem, ['id', 'type', 'tags', 'lat', 'lon']));
47
- node.setLatLng(elem);
48
- break;
49
-
50
- case 'way':
51
- let way = new Way(elem.id, refElements);
52
- if (elem.tags) {
53
- way.addTags(elem.tags);
54
- }
55
- way.addProps(purgeProps(elem, ['id', 'type', 'tags', 'nodes', 'geometry']));
56
- if (elem.nodes) {
57
- for (let n of elem.nodes) {
58
- way.addNodeRef(n);
59
- }
60
- } else if (elem.geometry) {
61
- way.setLatLngArray(elem.geometry);
62
- }
63
- break;
64
-
65
- case 'relation':
66
- let relation = new Relation(elem.id, refElements);
67
- if (elem.bounds) {
68
- relation.setBounds([parseFloat(elem.bounds.minlon), parseFloat(elem.bounds.minlat), parseFloat(elem.bounds.maxlon), parseFloat(elem.bounds.maxlat)]);
69
- }
70
- if (elem.tags) {
71
- relation.addTags(elem.tags);
72
- }
73
- relation.addProps(purgeProps(elem, ['id', 'type', 'tags', 'bounds', 'members']));
74
- if (elem.members) {
75
- for (let member of elem.members) {
76
- relation.addMember(member);
77
- }
78
- }
79
- break;
80
-
81
- default:
82
- break;
83
- }
84
- }
85
- }
86
-
87
- const analyzeFeaturesFromXml = osm => {
88
- const xmlParser = new XmlParser({progressive: true});
89
-
90
- xmlParser.on('</osm.node>', node => {
91
- let nd = new Node(node.id, refElements);
92
- for (let [k, v] of Object.entries(node))
93
- if (!k.startsWith('$') && ['id', 'lon', 'lat'].indexOf(k) < 0) {
94
- nd.addProp(k, v);
95
- }
96
- nd.setLatLng(node);
97
- if (node.$innerNodes) {
98
- for (let ind of node.$innerNodes) {
99
- if(ind.$tag === 'tag') {
100
- nd.addTag(ind.k, ind.v);
101
- }
102
- }
103
- }
104
- });
105
-
106
- xmlParser.on('</osm.way>', node => {
107
- let way = new Way(node.id, refElements);
108
- for (let [k, v] of Object.entries(node)) {
109
- if (!k.startsWith('$') && ['id'].indexOf(k) < 0) {
110
- way.addProp(k, v);
111
- }
112
- }
113
- if (node.$innerNodes) {
114
- for (let ind of node.$innerNodes) {
115
- if (ind.$tag === 'nd') {
116
- if (ind.lon && ind.lat) {
117
- way.addLatLng(ind);
118
- } else if (ind.ref) {
119
- way.addNodeRef(ind.ref);
120
- }
121
- } else if (ind.$tag === 'tag')
122
- way.addTag(ind.k, ind.v);
123
- }
124
- }
125
- });
126
-
127
- xmlParser.on('<osm.relation>', node => {
128
- new Relation(node.id, refElements);
129
- });
130
-
131
- xmlParser.on('</osm.relation.member>', (node, parent) => {
132
- let relation = refElements.get(`relation/${parent.id}`);
133
- let member = {
134
- type: node.type,
135
- role: node.role? node.role : '',
136
- ref: node.ref
137
- };
138
- if (node.lat && node.lon) {
139
- member.lat = node.lat, member.lon = node.lon, member.tags = {};
140
- for (let [k, v] of Object.entries(node)) {
141
- if (!k.startsWith('$') && ['type', 'lat', 'lon'].indexOf(k) < 0) {
142
- member[k] = v;
143
- }
144
- }
145
- }
146
- if (node.$innerNodes) {
147
- let geometry = [];
148
- let nodes = [];
149
- for (let ind of node.$innerNodes) {
150
- if (ind.lat && ind.lon) {
151
- geometry.push(ind);
152
- } else {
153
- nodes.push(ind.ref);
154
- }
155
- }
156
- if (geometry.length > 0) {
157
- member.geometry = geometry;
158
- } else if (nodes.length > 0) {
159
- member.nodes = nodes;
160
- }
161
- }
162
- relation.addMember(member);
163
- });
164
-
165
- xmlParser.on('</osm.relation.bounds>', (node, parent) => {
166
- refElements.get(`relation/${parent.id}`).setBounds([parseFloat(node.minlon), parseFloat(node.minlat), parseFloat(node.maxlon), parseFloat(node.maxlat)]);
167
- });
168
-
169
- xmlParser.on('</osm.relation.tag>', (node, parent) => {
170
- refElements.get(`relation/${parent.id}`).addTag(node.k, node.v);
171
- });
172
-
173
- xmlParser.parse(osm);
174
- }
175
-
176
- if (format === 'json-raw') {
177
- osm = JSON.parse(osm);
178
- if (osm.elements) {
179
- format = 'json';
180
- } else {
181
- format = 'invalid';
182
- }
183
- }
184
-
185
- if (format === 'json') {
186
- analyzeFeaturesFromJson(osm);
187
- } else if (format === 'xml') {
188
- analyzeFeaturesFromXml(osm);
189
- }
190
-
191
- refElements.bindAll();
192
-
193
- for (let v of refElements.values()) {
194
- if (v.refCount <= 0 || (v.hasTag && renderTagged && !(v instanceof Way && excludeWay))) {
195
- let features = v.toFeatureArray();
196
- // return the first geometry of the first relation element
197
- if (v instanceof Relation && !completeFeature && features.length > 0) {
198
- return features[0].geometry;
199
- }
200
- featureArray = featureArray.concat(features);
201
- }
202
- }
203
-
204
- return {type: 'FeatureCollection', features: featureArray};
6
+ let completeFeature = false, renderTagged = false, excludeWay = true;
7
+
8
+ const parseOpts = opts => {
9
+ if (opts) {
10
+ completeFeature = opts.completeFeature || opts.allFeatures? true : false;
11
+ renderTagged = opts.renderTagged? true : false;
12
+ let wayOpt = opts.suppressWay || opts.excludeWay;
13
+ if (wayOpt !== undefined && !wayOpt) {
14
+ excludeWay = false;
15
+ }
16
+ }
17
+ }
18
+
19
+ parseOpts(opts);
20
+
21
+ const detectFormat = osm => {
22
+ if (osm.elements) {
23
+ return 'json';
24
+ }
25
+ if (osm.indexOf('<osm') >= 0) {
26
+ return 'xml';
27
+ }
28
+ if (osm.trim().startsWith('{')) {
29
+ return 'json-raw';
30
+ }
31
+ return 'invalid';
32
+ }
33
+
34
+ let format = detectFormat(osm);
35
+
36
+ let refElements = new RefElements(), featureArray = [];
37
+
38
+ const analyzeFeaturesFromJson = osm => {
39
+ for (let elem of osm.elements) {
40
+ switch(elem.type) {
41
+ case 'node':
42
+ let node = new Node(elem.id, refElements);
43
+ if (elem.tags) {
44
+ node.addTags(elem.tags);
45
+ }
46
+ node.addProps(purgeProps(elem, ['id', 'type', 'tags', 'lat', 'lon']));
47
+ node.setLatLng(elem);
48
+ break;
49
+
50
+ case 'way':
51
+ let way = new Way(elem.id, refElements);
52
+ if (elem.tags) {
53
+ way.addTags(elem.tags);
54
+ }
55
+ way.addProps(purgeProps(elem, ['id', 'type', 'tags', 'nodes', 'geometry']));
56
+ if (elem.nodes) {
57
+ for (let n of elem.nodes) {
58
+ way.addNodeRef(n);
59
+ }
60
+ } else if (elem.geometry) {
61
+ way.setLatLngArray(elem.geometry);
62
+ }
63
+ break;
64
+
65
+ case 'relation':
66
+ let relation = new Relation(elem.id, refElements);
67
+ if (elem.bounds) {
68
+ relation.setBounds([parseFloat(elem.bounds.minlon), parseFloat(elem.bounds.minlat), parseFloat(elem.bounds.maxlon), parseFloat(elem.bounds.maxlat)]);
69
+ }
70
+ if (elem.tags) {
71
+ relation.addTags(elem.tags);
72
+ }
73
+ relation.addProps(purgeProps(elem, ['id', 'type', 'tags', 'bounds', 'members']));
74
+ if (elem.members) {
75
+ for (let member of elem.members) {
76
+ relation.addMember(member);
77
+ }
78
+ }
79
+ break;
80
+
81
+ default:
82
+ break;
83
+ }
84
+ }
85
+ }
86
+
87
+ const analyzeFeaturesFromXml = osm => {
88
+ const xmlParser = new XmlParser({progressive: true});
89
+
90
+ xmlParser.on('</osm.node>', node => {
91
+ let nd = new Node(node.id, refElements);
92
+ for (let [k, v] of Object.entries(node))
93
+ if (!k.startsWith('$') && ['id', 'lon', 'lat'].indexOf(k) < 0) {
94
+ nd.addProp(k, v);
95
+ }
96
+ nd.setLatLng(node);
97
+ if (node.$innerNodes) {
98
+ for (let ind of node.$innerNodes) {
99
+ if(ind.$tag === 'tag') {
100
+ nd.addTag(ind.k, ind.v);
101
+ }
102
+ }
103
+ }
104
+ });
105
+
106
+ xmlParser.on('</osm.way>', node => {
107
+ let way = new Way(node.id, refElements);
108
+ for (let [k, v] of Object.entries(node)) {
109
+ if (!k.startsWith('$') && ['id'].indexOf(k) < 0) {
110
+ way.addProp(k, v);
111
+ }
112
+ }
113
+ if (node.$innerNodes) {
114
+ for (let ind of node.$innerNodes) {
115
+ if (ind.$tag === 'nd') {
116
+ if (ind.lon && ind.lat) {
117
+ way.addLatLng(ind);
118
+ } else if (ind.ref) {
119
+ way.addNodeRef(ind.ref);
120
+ }
121
+ } else if (ind.$tag === 'tag')
122
+ way.addTag(ind.k, ind.v);
123
+ }
124
+ }
125
+ });
126
+
127
+ xmlParser.on('<osm.relation>', node => {
128
+ new Relation(node.id, refElements);
129
+ });
130
+
131
+ xmlParser.on('</osm.relation.member>', (node, parent) => {
132
+ let relation = refElements.get(`relation/${parent.id}`);
133
+ let member = {
134
+ type: node.type,
135
+ role: node.role? node.role : '',
136
+ ref: node.ref
137
+ };
138
+ if (node.lat && node.lon) {
139
+ member.lat = node.lat, member.lon = node.lon, member.tags = {};
140
+ for (let [k, v] of Object.entries(node)) {
141
+ if (!k.startsWith('$') && ['type', 'lat', 'lon'].indexOf(k) < 0) {
142
+ member[k] = v;
143
+ }
144
+ }
145
+ }
146
+ if (node.$innerNodes) {
147
+ let geometry = [];
148
+ let nodes = [];
149
+ for (let ind of node.$innerNodes) {
150
+ if (ind.lat && ind.lon) {
151
+ geometry.push(ind);
152
+ } else {
153
+ nodes.push(ind.ref);
154
+ }
155
+ }
156
+ if (geometry.length > 0) {
157
+ member.geometry = geometry;
158
+ } else if (nodes.length > 0) {
159
+ member.nodes = nodes;
160
+ }
161
+ }
162
+ relation.addMember(member);
163
+ });
164
+
165
+ xmlParser.on('</osm.relation.bounds>', (node, parent) => {
166
+ refElements.get(`relation/${parent.id}`).setBounds([parseFloat(node.minlon), parseFloat(node.minlat), parseFloat(node.maxlon), parseFloat(node.maxlat)]);
167
+ });
168
+
169
+ xmlParser.on('</osm.relation.tag>', (node, parent) => {
170
+ refElements.get(`relation/${parent.id}`).addTag(node.k, node.v);
171
+ });
172
+
173
+ xmlParser.parse(osm);
174
+ }
175
+
176
+ if (format === 'json-raw') {
177
+ osm = JSON.parse(osm);
178
+ if (osm.elements) {
179
+ format = 'json';
180
+ } else {
181
+ format = 'invalid';
182
+ }
183
+ }
184
+
185
+ if (format === 'json') {
186
+ analyzeFeaturesFromJson(osm);
187
+ } else if (format === 'xml') {
188
+ analyzeFeaturesFromXml(osm);
189
+ }
190
+
191
+ refElements.bindAll();
192
+
193
+ for (let v of refElements.values()) {
194
+ if (v.refCount <= 0 || (v.hasTag && renderTagged && !(v instanceof Way && excludeWay))) {
195
+ let features = v.toFeatureArray();
196
+ // return the first geometry of the first relation element
197
+ if (v instanceof Relation && !completeFeature && features.length > 0) {
198
+ return features[0].geometry;
199
+ }
200
+ featureArray = featureArray.concat(features);
201
+ }
202
+ }
203
+
204
+ return {type: 'FeatureCollection', features: featureArray};
205
205
  }