Skip to content

Commit ac1f60f

Browse files
committed
Add support for OSM JSON format
1 parent eb4fd05 commit ac1f60f

File tree

1 file changed

+106
-7
lines changed

1 file changed

+106
-7
lines changed

leaflet-osm.js

Lines changed: 106 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -141,11 +141,14 @@ L.OSM.DataLayer = L.FeatureGroup.extend({
141141
}
142142
},
143143

144-
buildFeatures: function (xml) {
145-
var features = L.OSM.getChangesets(xml),
146-
nodes = L.OSM.getNodes(xml),
147-
ways = L.OSM.getWays(xml, nodes),
148-
relations = L.OSM.getRelations(xml, nodes, ways);
144+
buildFeatures: function (data, format = "application/xml") {
145+
146+
const parser = (format === "application/json") ? L.OSM.JSONParser : L.OSM.XMLParser;
147+
148+
var features = parser.getChangesets(data),
149+
nodes = parser.getNodes(data),
150+
ways = parser.getWays(data, nodes),
151+
relations = parser.getRelations(data, nodes, ways);
149152

150153
var wayNodes = {}
151154
for (var i = 0; i < ways.length; i++) {
@@ -228,7 +231,7 @@ L.OSM.DataLayer = L.FeatureGroup.extend({
228231
},
229232
});
230233

231-
L.Util.extend(L.OSM, {
234+
L.OSM.XMLParser = {
232235
getChangesets: function (xml) {
233236
var result = [];
234237

@@ -328,4 +331,100 @@ L.Util.extend(L.OSM, {
328331

329332
return result;
330333
}
331-
});
334+
}
335+
336+
L.OSM.JSONParser = {
337+
getChangesets: function (json) {
338+
var result = [];
339+
340+
var nodes = json.elements.filter(d => d.type === "changeset");
341+
for (var i = 0; i < nodes.length; i++) {
342+
var node = nodes[i], id = node["id"];
343+
result.push({
344+
id: id,
345+
type: "changeset",
346+
latLngBounds: L.latLngBounds(
347+
[node["min_lat"], node["min_lon"]],
348+
[node["max_lat"], node["max_lon"]]),
349+
tags: this.getTags(node)
350+
});
351+
}
352+
353+
return result;
354+
},
355+
356+
getNodes: function (json) {
357+
var result = {};
358+
359+
var nodes = json.elements.filter(d => d.type === "node");
360+
for (var i = 0; i < nodes.length; i++) {
361+
var node = nodes[i], id = node["id"];
362+
363+
result[id] = {
364+
id: id,
365+
type: "node",
366+
latLng: L.latLng(node["lat"],
367+
node["lon"],
368+
true),
369+
tags: this.getTags(node)
370+
};
371+
}
372+
373+
return result;
374+
},
375+
376+
getWays: function (json, nodes) {
377+
var result = [];
378+
379+
var ways = json.elements.filter(d => d.type === "way");
380+
for (var i = 0; i < ways.length; i++) {
381+
var way = ways[i], nds = way.nodes;
382+
383+
var way_object = {
384+
id: way["id"],
385+
type: "way",
386+
nodes: new Array(nds.length),
387+
tags: this.getTags(way)
388+
};
389+
390+
for (var j = 0; j < nds.length; j++) {
391+
way_object.nodes[j] = nodes[nds[j]];
392+
}
393+
394+
result.push(way_object);
395+
}
396+
397+
return result;
398+
},
399+
400+
getRelations: function (json, nodes, ways) {
401+
var result = [];
402+
403+
var rels = json.elements.filter(d => d.type === "relation");
404+
for (var i = 0; i < rels.length; i++) {
405+
var rel = rels[i], members = rel["members"];
406+
407+
var rel_object = {
408+
id: rel["id"],
409+
type: "relation",
410+
members: new Array(members.length),
411+
tags: this.getTags(rel)
412+
};
413+
414+
for (var j = 0; j < members.length; j++) {
415+
if (members[j]["type"] === "node")
416+
rel_object.members[j] = nodes[members[j]["ref"]];
417+
else // relation-way and relation-relation membership not implemented
418+
rel_object.members[j] = null;
419+
}
420+
rel_object.members = rel_object.members.filter(i => i !== null && i !== undefined)
421+
result.push(rel_object);
422+
}
423+
424+
return result;
425+
},
426+
427+
getTags: function (json) {
428+
return json["tags"];
429+
}
430+
}

0 commit comments

Comments
 (0)