11import { Events } from '../../commontypes' ;
22import SourceModel from './SourceModel' ;
33import { createAppreciableLayerId , getLayerInfosFromCatalogs } from './util' ;
4+ import cloneDeep from 'lodash.clonedeep' ;
45
56export class AppreciableLayerBase extends Events {
67 constructor ( options = { } ) {
78 super ( ) ;
89 this . map = options . map ;
9- this . layers = options . layers || [ ] ;
1010 this . appendLayers = options . appendLayers || false ;
1111 this . unexpectedSourceNames = [
1212 'tdt-search-' ,
@@ -21,12 +21,23 @@ export class AppreciableLayerBase extends Events {
2121 this . layersVisibleMap = new Map ( ) ;
2222 this . eventTypes = [ 'layerupdatechanged' ] ;
2323 this . _styleDataUpdatedHandler = this . _styleDataUpdatedHandler . bind ( this ) ;
24+ this . baseLayerInfoOnMap = null ;
25+ this . setLayers ( options . layers ) ;
26+ this . _initBaseLayerInfo ( options . layers ) ;
2427 }
2528
26- setLayers ( layers ) {
29+ setLayers ( layers = [ ] ) {
2730 this . layers = layers ;
2831 }
2932
33+ setDefaultBaseLayerInfo ( baseLayerInfo ) {
34+ this . baseLayerInfoOnMap = baseLayerInfo ;
35+ }
36+
37+ setBaseLayer ( ) {
38+ throw new Error ( 'setBaseLayer is not implemented' ) ;
39+ }
40+
3041 createLayerCatalogs ( ) {
3142 throw new Error ( 'createLayerCatalogs is not implemented' ) ;
3243 }
@@ -39,6 +50,14 @@ export class AppreciableLayerBase extends Events {
3950 throw new Error ( 'initLayers is not implemented' ) ;
4051 }
4152
53+ changeBaseLayer ( layer ) {
54+ if ( this . map ) {
55+ this . _removeBaseLayer ( ) ;
56+ this . _addBaseLayer ( layer ) ;
57+ return cloneDeep ( this . baseLayerInfoOnMap ) ;
58+ }
59+ }
60+
4261 createAppreciableLayers ( ) {
4362 const detailLayers = this . initLayers ( ) ;
4463 return this . _initAppreciableLayers ( detailLayers ) ;
@@ -335,4 +354,111 @@ export class AppreciableLayerBase extends Events {
335354 }
336355 return topLayers . concat ( autoLayers , bottomLayers ) ;
337356 }
357+
358+ _addBaseLayer ( layerItem ) {
359+ const { layers, sources } = layerItem ;
360+ const renderSources = { } ;
361+ Object . keys ( sources ) . forEach ( sourceId => {
362+ let nextSourceId = sourceId ;
363+ if ( this . map . getSource ( sourceId ) ) {
364+ renderSources [ sourceId ] = `${ sourceId } _${ + new Date ( ) } ` ;
365+ nextSourceId = renderSources [ sourceId ] ;
366+ }
367+ this . map . addSource ( nextSourceId , sources [ sourceId ] ) ;
368+ } ) ;
369+ const layersToAdd = [ ] ;
370+ layers . forEach ( layer => {
371+ let { beforeId } = layer ;
372+ if ( ! beforeId ) {
373+ const styles = this . map . getStyle ( ) ;
374+ beforeId = styles . layers [ 0 ] && styles . layers [ 0 ] . id ;
375+ }
376+ const layerToAdd = Object . assign ( { } , layer ) ;
377+ delete layerToAdd . beforeId ;
378+ const sourceId = layerToAdd . source ;
379+ if ( renderSources [ sourceId ] ) {
380+ layerToAdd . source = renderSources [ sourceId ] ;
381+ }
382+ if ( this . map . getLayer ( layerToAdd . id ) ) {
383+ const nextLayerId = `${ layerToAdd . id } _${ layerToAdd . source || + new Date ( ) } ` ;
384+ layerToAdd . id = nextLayerId ;
385+ }
386+ layersToAdd . push ( {
387+ layer : layerToAdd ,
388+ beforeId
389+ } ) ;
390+ } ) ;
391+ this . baseLayerInfoOnMap = {
392+ ...layerItem ,
393+ layers : layersToAdd . map ( item => Object . assign ( { } , item . layer ) ) ,
394+ sources : Object . keys ( layerItem . sources ) . reduce ( ( sources , sourceId ) => {
395+ let source = sourceId ;
396+ if ( renderSources [ source ] ) {
397+ source = renderSources [ source ] ;
398+ }
399+ sources [ source ] = renderSources [ sourceId ] ;
400+ return sources ;
401+ } , { } )
402+ } ;
403+ this . setBaseLayer ( { ...this . baseLayerInfoOnMap } ) ;
404+ layersToAdd . forEach ( ( { layer, beforeId } ) => {
405+ this . map . addLayer ( layer , beforeId ) ;
406+ } )
407+ }
408+
409+ _removeBaseLayer ( ) {
410+ if ( this . baseLayerInfoOnMap ) {
411+ const { layers, sources } = this . baseLayerInfoOnMap ;
412+ const layersIds = layers . map ( item => item . id ) ;
413+ const sourceIds = Object . keys ( sources ) ;
414+ layersIds . forEach ( layerId => {
415+ if ( this . map . getLayer ( layerId ) ) {
416+ this . map . removeLayer ( layerId ) ;
417+ }
418+ } ) ;
419+ sourceIds . forEach ( sourceId => {
420+ if ( this . map . getSource ( sourceId ) ) {
421+ this . map . removeSource ( sourceId ) ;
422+ }
423+ } ) ;
424+ }
425+ }
426+
427+ _initBaseLayerInfo ( layers ) {
428+ if ( layers && layers . length && ! this . baseLayerInfoOnMap ) {
429+ const firstLayer = this . layers [ 0 ] ;
430+ const baseLayer = firstLayer ;
431+ const layerList = this . map . getStyle ( ) . layers ;
432+ const baseLayersOnMap = baseLayer . renderLayers . map ( ( layerId ) => {
433+ const nextLayer = layerList . find ( item => item . id === layerId ) ;
434+ if ( nextLayer ) {
435+ const layerIndex = layerList . findIndex ( item => item . id === layerId ) ;
436+ const nextLayerIndex = layerIndex + 1 ;
437+ if ( layerList [ nextLayerIndex ] ) {
438+ nextLayer . beforeId = layerList [ nextLayerIndex ] . id ;
439+ }
440+ if ( ! nextLayer . metadata || ! nextLayer . metadata . SM_Layer_Title ) {
441+ nextLayer . metadata = {
442+ ...nextLayer . metadata ,
443+ SM_Layer_Title : baseLayer . title
444+ } ;
445+ }
446+ }
447+ return nextLayer ;
448+ } ) . filter ( Boolean ) ;
449+ const sourcesMap = this . map . getStyle ( ) . sources ;
450+ this . setDefaultBaseLayerInfo ( {
451+ id : `__default__${ baseLayer . id } ` ,
452+ title : baseLayer . title ,
453+ layers : baseLayersOnMap ,
454+ sources : baseLayersOnMap . reduce ( ( sources , layer ) => {
455+ const sourceId = layer . source ;
456+ if ( sourceId && ! sources [ sourceId ] ) {
457+ sources [ sourceId ] = sourcesMap [ sourceId ] ;
458+ }
459+ return sources ;
460+ } , { } )
461+ } ) ;
462+ }
463+ }
338464}
0 commit comments