@@ -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