1
1
import { Events } from '../../commontypes' ;
2
2
import SourceModel from './SourceModel' ;
3
3
import { createAppreciableLayerId , getLayerInfosFromCatalogs } from './util' ;
4
+ import cloneDeep from 'lodash.clonedeep' ;
4
5
5
6
export class AppreciableLayerBase extends Events {
6
7
constructor ( options = { } ) {
7
8
super ( ) ;
8
9
this . map = options . map ;
9
- this . layers = options . layers || [ ] ;
10
10
this . appendLayers = options . appendLayers || false ;
11
11
this . unexpectedSourceNames = [
12
12
'tdt-search-' ,
@@ -21,12 +21,23 @@ export class AppreciableLayerBase extends Events {
21
21
this . layersVisibleMap = new Map ( ) ;
22
22
this . eventTypes = [ 'layerupdatechanged' ] ;
23
23
this . _styleDataUpdatedHandler = this . _styleDataUpdatedHandler . bind ( this ) ;
24
+ this . baseLayerInfoOnMap = null ;
25
+ this . setLayers ( options . layers ) ;
26
+ this . _initBaseLayerInfo ( options . layers ) ;
24
27
}
25
28
26
- setLayers ( layers ) {
29
+ setLayers ( layers = [ ] ) {
27
30
this . layers = layers ;
28
31
}
29
32
33
+ setDefaultBaseLayerInfo ( baseLayerInfo ) {
34
+ this . baseLayerInfoOnMap = baseLayerInfo ;
35
+ }
36
+
37
+ setBaseLayer ( ) {
38
+ throw new Error ( 'setBaseLayer is not implemented' ) ;
39
+ }
40
+
30
41
createLayerCatalogs ( ) {
31
42
throw new Error ( 'createLayerCatalogs is not implemented' ) ;
32
43
}
@@ -39,6 +50,14 @@ export class AppreciableLayerBase extends Events {
39
50
throw new Error ( 'initLayers is not implemented' ) ;
40
51
}
41
52
53
+ changeBaseLayer ( layer ) {
54
+ if ( this . map ) {
55
+ this . _removeBaseLayer ( ) ;
56
+ this . _addBaseLayer ( layer ) ;
57
+ return cloneDeep ( this . baseLayerInfoOnMap ) ;
58
+ }
59
+ }
60
+
42
61
createAppreciableLayers ( ) {
43
62
const detailLayers = this . initLayers ( ) ;
44
63
return this . _initAppreciableLayers ( detailLayers ) ;
@@ -335,4 +354,111 @@ export class AppreciableLayerBase extends Events {
335
354
}
336
355
return topLayers . concat ( autoLayers , bottomLayers ) ;
337
356
}
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
+ }
338
464
}
0 commit comments