Skip to content

Commit bdb75a1

Browse files
committed
Add support for OSM JSON format
1 parent 0ed5313 commit bdb75a1

File tree

6 files changed

+209
-133
lines changed

6 files changed

+209
-133
lines changed

leaflet-osm.js

Lines changed: 70 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) {
145+
146+
const parser = (data.version) ? 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,64 @@ L.Util.extend(L.OSM, {
328331

329332
return result;
330333
}
331-
});
334+
}
335+
336+
L.OSM.JSONParser = {
337+
getChangesets(json) {
338+
const changesets = json.changeset ? [json.changeset] : [];
339+
340+
return changesets.map(cs => ({
341+
id: String(cs.id),
342+
type: "changeset",
343+
latLngBounds: L.latLngBounds(
344+
[cs.min_lat, cs.min_lon],
345+
[cs.max_lat, cs.max_lon]
346+
),
347+
tags: this.getTags(cs)
348+
}));
349+
},
350+
351+
getNodes(json) {
352+
const nodes = json.elements?.filter(el => el.type === "node") ?? [];
353+
let result = {};
354+
355+
for (const node of nodes) {
356+
result[node.id] = {
357+
id: String(node.id),
358+
type: "node",
359+
latLng: L.latLng(node.lat, node.lon, true),
360+
tags: this.getTags(node)
361+
};
362+
}
363+
364+
return result;
365+
},
366+
367+
getWays(json, nodes) {
368+
const ways = json.elements?.filter(el => el.type === "way") ?? [];
369+
370+
return ways.map(way => ({
371+
id: String(way.id),
372+
type: "way",
373+
nodes: way.nodes.map(nodeId => nodes[nodeId]),
374+
tags: this.getTags(way)
375+
}));
376+
},
377+
378+
getRelations(json, nodes, ways) {
379+
const relations = json.elements?.filter(el => el.type === "relation") ?? [];
380+
381+
return relations.map(rel => ({
382+
id: String(rel.id),
383+
type: "relation",
384+
members: (rel.members ?? []) // relation-way and relation-relation membership not implemented
385+
.map(member => member.type === "node" ? nodes[member.ref] : null)
386+
.filter(Boolean), // filter out null and undefined
387+
tags: this.getTags(rel)
388+
}));
389+
},
390+
391+
getTags(json) {
392+
return json.tags ?? {};
393+
}
394+
};

test/fixtures/area.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"version":"0.6","generator":"OpenStreetMap server","copyright":"OpenStreetMap and contributors","attribution":"http://www.openstreetmap.org/copyright","license":"http://opendatacommons.org/licenses/odbl/1-0/","elements":[{"type":"node","id":1911003400,"lat":44.6641548,"lon":-73.0149544,"timestamp":"2012-09-12T04:59:23Z","version":1,"changeset":13078014,"user":"jfire","uid":67236},{"type":"node","id":1911003422,"lat":44.6639106,"lon":-73.0183662,"timestamp":"2012-09-12T04:59:23Z","version":1,"changeset":13078014,"user":"jfire","uid":67236},{"type":"node","id":1911003428,"lat":44.6639144,"lon":-73.0164457,"timestamp":"2012-09-12T04:59:24Z","version":1,"changeset":13078014,"user":"jfire","uid":67236},{"type":"node","id":1911003434,"lat":44.6632593,"lon":-73.0149372,"timestamp":"2012-09-12T04:59:24Z","version":1,"changeset":13078014,"user":"jfire","uid":67236},{"type":"node","id":1911003459,"lat":44.6642311,"lon":-73.0152709,"timestamp":"2012-09-12T04:59:24Z","version":1,"changeset":13078014,"user":"jfire","uid":67236},{"type":"node","id":1911003477,"lat":44.6639881,"lon":-73.0163749,"timestamp":"2012-09-12T04:59:24Z","version":1,"changeset":13078014,"user":"jfire","uid":67236},{"type":"node","id":1911003481,"lat":44.6640251,"lon":-73.0181462,"timestamp":"2012-09-12T04:59:25Z","version":1,"changeset":13078014,"user":"jfire","uid":67236},{"type":"node","id":1911003483,"lat":44.6640861,"lon":-73.0163599,"timestamp":"2012-09-12T04:59:25Z","version":1,"changeset":13078014,"user":"jfire","uid":67236},{"type":"node","id":1911003505,"lat":44.663365,"lon":-73.0184144,"timestamp":"2012-09-12T04:59:25Z","version":1,"changeset":13078014,"user":"jfire","uid":67236},{"type":"node","id":1911003534,"lat":44.6631742,"lon":-73.0151529,"timestamp":"2012-09-12T04:59:26Z","version":1,"changeset":13078014,"user":"jfire","uid":67236},{"type":"node","id":1911003542,"lat":44.6631857,"lon":-73.0149866,"timestamp":"2012-09-12T04:59:26Z","version":1,"changeset":13078014,"user":"jfire","uid":67236},{"type":"node","id":1911003614,"lat":44.6640251,"lon":-73.018275,"timestamp":"2012-09-12T04:59:27Z","version":1,"changeset":13078014,"user":"jfire","uid":67236},{"type":"node","id":1911003629,"lat":44.6639945,"lon":-73.0183447,"timestamp":"2012-09-12T04:59:27Z","version":1,"changeset":13078014,"user":"jfire","uid":67236},{"type":"node","id":1911003725,"lat":44.6633765,"lon":-73.0149061,"timestamp":"2012-09-12T04:59:29Z","version":1,"changeset":13078014,"user":"jfire","uid":67236},{"type":"way","id":180655479,"timestamp":"2012-09-12T04:59:32Z","version":1,"changeset":13078014,"user":"jfire","uid":67236,"nodes":[1911003422,1911003505,1911003534,1911003542,1911003434,1911003725,1911003400,1911003459,1911003483,1911003477,1911003428,1911003481,1911003614,1911003629,1911003422],"tags":{"leisure":"pitch"}}]}

test/fixtures/changeset.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"version":"0.6","generator":"openstreetmap-cgimap 2.0.1 (3448772 spike-06.openstreetmap.org)","copyright":"OpenStreetMap and contributors","attribution":"http://www.openstreetmap.org/copyright","license":"http://opendatacommons.org/licenses/odbl/1-0/","changeset":{"id":1,"created_at":"2005-04-09T19:54:13Z","open":false,"comments_count":48,"changes_count":2,"closed_at":"2005-04-09T20:54:39Z","min_lat":51.5288506,"min_lon":-0.1465242,"max_lat":51.5288620,"max_lon":-0.1464925,"uid":1,"user":"Steve"}}

test/fixtures/node.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"version":"0.6","generator":"OpenStreetMap server","copyright":"OpenStreetMap and contributors","attribution":"http://www.openstreetmap.org/copyright","license":"http://opendatacommons.org/licenses/odbl/1-0/","elements":[{"type":"node","id":356552551,"lat":44.6636172,"lon":-73.0132525,"timestamp":"2009-03-07T03:26:33Z","version":1,"changeset":747176,"user":"iandees","uid":4732,"tags":{"amenity":"school","ele":"114","gnis:county_id":"011","gnis:created":"10/29/1980","gnis:edited":"05/27/2008","gnis:feature_id":"1456383","gnis:state_id":"50","name":"Bellows Free Academy"}}]}

test/fixtures/way.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"version":"0.6","generator":"OpenStreetMap server","copyright":"OpenStreetMap and contributors","attribution":"http://www.openstreetmap.org/copyright","license":"http://opendatacommons.org/licenses/odbl/1-0/","elements":[{"type":"node","id":204587613,"lat":44.665983,"lon":-72.920587,"timestamp":"2009-10-11T18:01:27Z","version":2,"changeset":2817006,"user":"woodpeck_fixbot","uid":147510},{"type":"node","id":204595896,"lat":44.665883,"lon":-72.923053,"timestamp":"2009-10-11T18:03:23Z","version":2,"changeset":2817006,"user":"woodpeck_fixbot","uid":147510},{"type":"node","id":204595901,"lat":44.66597,"lon":-72.922201,"timestamp":"2009-10-11T18:03:23Z","version":2,"changeset":2817006,"user":"woodpeck_fixbot","uid":147510},{"type":"node","id":204595904,"lat":44.665989,"lon":-72.921986,"timestamp":"2009-10-11T18:03:23Z","version":2,"changeset":2817006,"user":"woodpeck_fixbot","uid":147510},{"type":"node","id":204595911,"lat":44.666015,"lon":-72.921474,"timestamp":"2009-11-17T05:45:06Z","version":2,"changeset":3138486,"user":"woodpeck_fixbot","uid":147510},{"type":"node","id":204595915,"lat":44.666015,"lon":-72.921254,"timestamp":"2009-10-11T18:03:23Z","version":2,"changeset":2817006,"user":"woodpeck_fixbot","uid":147510},{"type":"node","id":204595919,"lat":44.666007,"lon":-72.921033,"timestamp":"2009-10-11T18:03:23Z","version":2,"changeset":2817006,"user":"woodpeck_fixbot","uid":147510},{"type":"node","id":204595923,"lat":44.665938,"lon":-72.920089,"timestamp":"2009-10-11T18:03:23Z","version":2,"changeset":2817006,"user":"woodpeck_fixbot","uid":147510},{"type":"node","id":204595927,"lat":44.665901,"lon":-72.919727,"timestamp":"2009-10-11T18:03:23Z","version":2,"changeset":2817006,"user":"woodpeck_fixbot","uid":147510},{"type":"node","id":204595932,"lat":44.665837,"lon":-72.919284,"timestamp":"2009-11-17T05:45:06Z","version":2,"changeset":3138486,"user":"woodpeck_fixbot","uid":147510},{"type":"node","id":204595935,"lat":44.665821,"lon":-72.91914,"timestamp":"2009-10-11T18:03:23Z","version":2,"changeset":2817006,"user":"woodpeck_fixbot","uid":147510},{"type":"node","id":204595939,"lat":44.66581,"lon":-72.918999,"timestamp":"2009-10-11T18:03:23Z","version":2,"changeset":2817006,"user":"woodpeck_fixbot","uid":147510},{"type":"node","id":204595943,"lat":44.665814,"lon":-72.918855,"timestamp":"2009-10-11T18:03:23Z","version":2,"changeset":2817006,"user":"woodpeck_fixbot","uid":147510},{"type":"node","id":204595947,"lat":44.665823,"lon":-72.918783,"timestamp":"2009-12-11T06:32:30Z","version":2,"changeset":3346870,"user":"woodpeck_fixbot","uid":147510},{"type":"node","id":204595950,"lat":44.665839,"lon":-72.91871,"timestamp":"2009-10-11T18:03:23Z","version":2,"changeset":2817006,"user":"woodpeck_fixbot","uid":147510},{"type":"node","id":204595953,"lat":44.66587,"lon":-72.918641,"timestamp":"2009-10-11T18:03:23Z","version":2,"changeset":2817006,"user":"woodpeck_fixbot","uid":147510},{"type":"node","id":204595955,"lat":44.665923,"lon":-72.918586,"timestamp":"2009-10-11T18:03:23Z","version":2,"changeset":2817006,"user":"woodpeck_fixbot","uid":147510},{"type":"node","id":204595957,"lat":44.665985,"lon":-72.918559,"timestamp":"2009-10-11T18:03:23Z","version":2,"changeset":2817006,"user":"woodpeck_fixbot","uid":147510},{"type":"node","id":204595961,"lat":44.666193,"lon":-72.918523,"timestamp":"2009-11-17T05:45:06Z","version":2,"changeset":3138486,"user":"woodpeck_fixbot","uid":147510},{"type":"node","id":204595963,"lat":44.666342,"lon":-72.918513,"timestamp":"2009-10-11T18:03:23Z","version":2,"changeset":2817006,"user":"woodpeck_fixbot","uid":147510},{"type":"way","id":19698713,"timestamp":"2008-01-03T05:24:43Z","version":1,"changeset":522559,"user":"DaveHansenTiger","uid":7168,"nodes":[204595896,204595901,204595904,204595911,204595915,204595919,204587613,204595923,204595927,204595932,204595935,204595939,204595943,204595947,204595950,204595953,204595955,204595957,204595961,204595963],"tags":{"name":"Oustinoff Rd","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070830","tiger:tlid":"136533324:136533325","tiger:upload_uuid":"bulk_upload.pl-62def9fe-abee-42f3-ac1f-9d9f4b4ee78b","tiger:reviewed":"no","tiger:cfcc":"A41","tiger:county":"Franklin, VT","tiger:zip_left":"05444","tiger:zip_right":"05444","highway":"residential","tiger:name_base":"Oustinoff","tiger:name_type":"Rd"}}]}

0 commit comments

Comments
 (0)