@@ -306,11 +306,11 @@ export class WebMap extends mapboxgl.Evented {
306306 const { catalogs = [ ] } = this . _mapResourceInfo ;
307307 const originLayers = this . _getLayerInfosFromCatalogs ( catalogs ) ;
308308 const layers = originLayers . map ( ( layer ) => {
309- const { title, visualization } = layer ;
309+ const { id , title, visualization, visible , layersContent } = layer ;
310310 const layerFromMapInfo = this . _mapInfo . layers . find ( ( item ) => {
311311 return item . id === layer . id ;
312312 } ) ;
313- this . _createLegendInfo ( Object . assign ( { } , layerFromMapInfo ) , visualization ) ;
313+ this . _createLegendInfo ( Object . assign ( { } , layerFromMapInfo , { title : layer . title } ) , visualization ) ;
314314 let dataType = '' ;
315315 let dataId = '' ;
316316 for ( const data of this . _mapResourceInfo . datas ) {
@@ -321,16 +321,22 @@ export class WebMap extends mapboxgl.Evented {
321321 break ;
322322 }
323323 }
324- const overlayLayers = {
324+ const overlayLayers = this . _formatLayer ( {
325325 dataSource : {
326326 serverId : dataId ,
327327 type : dataType
328328 } ,
329- layerID : layer . id ,
330- layerType : layerFromMapInfo . type === 'raster' ? 'raster' : 'vector' ,
329+ id,
331330 type : layerFromMapInfo . type ,
332- name : title
333- } ;
331+ title,
332+ visible,
333+ renderSource : {
334+ id : layerFromMapInfo . source ,
335+ type : layerFromMapInfo . type === 'raster' ? 'raster' : 'vector' ,
336+ sourceLayer : layerFromMapInfo [ "source-layer" ]
337+ } ,
338+ renderLayers : this . _getRenderLayers ( layersContent , id )
339+ } ) ;
334340 const styleSettings = this . _parseRendererStyleData ( visualization . renderer ) ;
335341 const defaultStyleSetting = styleSettings [ 0 ] ;
336342 if ( defaultStyleSetting ) {
@@ -348,7 +354,97 @@ export class WebMap extends mapboxgl.Evented {
348354 }
349355 return overlayLayers ;
350356 } ) ;
351- return layers ;
357+ const baseLayer = this . _getBaseLayer ( layers ) ;
358+ return baseLayer ? [ baseLayer ] . concat ( layers ) : layers ;
359+ }
360+
361+ getLayerCatalog ( ) {
362+ const originLayerCatalog = this . _mapInfo . metadata . layerCatalog ;
363+ const formatLayerCatalog = this . _createFormatCatalogs ( originLayerCatalog ) ;
364+ const baseLayer = this . _getBaseLayer ( formatLayerCatalog ) ;
365+ return baseLayer ? [ baseLayer ] . concat ( formatLayerCatalog ) : formatLayerCatalog ;
366+ }
367+
368+ _createFormatCatalogs ( catalogs ) {
369+ const formatCatalogs = catalogs . map ( ( catalog ) => {
370+ let formatItem ;
371+ const { id, title, type, visible, children, parts } = catalog ;
372+ if ( catalog . type === "group" ) {
373+ formatItem = {
374+ children : this . _createFormatCatalogs ( children ) ,
375+ id,
376+ title,
377+ type,
378+ visible
379+ }
380+ } else {
381+ const appreciableLayers = this . _generateLayers ( ) ;
382+ const matchLayer = appreciableLayers . find ( layer => layer . id === id ) ;
383+ formatItem = this . _formatLayer ( {
384+ dataSource : matchLayer . dataSource ,
385+ id,
386+ type : matchLayer . type ,
387+ title,
388+ visible,
389+ renderSource : matchLayer . renderSource ,
390+ renderLayers : this . _getRenderLayers ( parts , id ) ,
391+ themeSetting : matchLayer . themeSetting
392+ } )
393+ }
394+ return formatItem ;
395+ } ) ;
396+ return formatCatalogs ;
397+ }
398+
399+ _getRenderLayers ( layerIds , layerId ) {
400+ if ( layerIds ) {
401+ if ( layerIds . includes ( layerId ) ) {
402+ return layerIds ;
403+ } else {
404+ return [ layerId , ...layerIds ]
405+ }
406+ } else {
407+ return [ layerId ]
408+ }
409+ }
410+
411+ _getBaseLayer ( layers ) {
412+ const baseLayer = this . _mapInfo . layers [ 0 ] ;
413+ const { id, type } = baseLayer ;
414+ const baseLayerInfo = this . map . getLayer ( id ) ;
415+ const ids = layers . map ( layer => layer . id ) ;
416+ if ( ! ids . includes ( id ) ) {
417+ const formatBaseLayer = this . _formatLayer ( {
418+ dataSource : { } ,
419+ id,
420+ title : id ,
421+ type,
422+ visible : true ,
423+ renderSource : {
424+ id : baseLayerInfo . source ,
425+ type : baseLayerInfo . type === 'raster' ? 'raster' : 'vector' ,
426+ sourceLayer : baseLayerInfo [ "source-layer" ]
427+ } ,
428+ renderLayers : [ id ] ,
429+ themeSetting : { }
430+ } ) ;
431+ return formatBaseLayer ;
432+ }
433+ return null ;
434+ }
435+
436+ _formatLayer ( option ) {
437+ const { dataSource = { } , id, title, type, visible = true , renderSource = { } , renderLayers = [ ] , themeSetting = { } } = option ;
438+ return {
439+ dataSource,
440+ id,
441+ title,
442+ type,
443+ visible,
444+ renderSource,
445+ renderLayers,
446+ themeSetting
447+ }
352448 }
353449
354450 _parseRendererStyleData ( renderer ) {
0 commit comments