11import { WebMapService } from './WebMapService' ;
22import { SourceListModelV2 } from './utils/SourceListModelV2' ;
3+ import { createAppreciableLayerId , isSameRasterLayer } from './utils/util' ;
34
45export function createMapStyleExtending ( SuperClass , { MapManager, mapRepo } ) {
56 return class MapStyle extends SuperClass {
@@ -70,6 +71,10 @@ export function createMapStyleExtending(SuperClass, { MapManager, mapRepo }) {
7071 _addLayersToMap ( ) {
7172 const { sources, layers, layerIdMapList } = this . _setUniqueId ( this . mapOptions . style ) ;
7273 layers . forEach ( ( layer ) => {
74+ const matchRenameLayer = layerIdMapList . find ( sub => sub . renderId === layer . id ) ;
75+ if ( matchRenameLayer && matchRenameLayer . reused ) {
76+ return ;
77+ }
7378 layer . source && ! this . map . getSource ( layer . source ) && this . map . addSource ( layer . source , sources [ layer . source ] ) ;
7479 this . map . addLayer ( layer ) ;
7580 } ) ;
@@ -81,13 +86,15 @@ export function createMapStyleExtending(SuperClass, { MapManager, mapRepo }) {
8186 _setUniqueId ( style ) {
8287 const layersToMap = JSON . parse ( JSON . stringify ( style . layers ) ) ;
8388 const nextSources = { } ;
89+ const sourcesIdChangedMap = { } ;
8490 const layerIdToChange = [ ] ;
8591 const timestamp = `_${ + new Date ( ) } ` ;
8692 for ( const sourceId in style . sources ) {
8793 let nextSourceId = sourceId ;
8894 if ( this . map . getSource ( sourceId ) ) {
8995 nextSourceId = sourceId + timestamp ;
9096 }
97+ sourcesIdChangedMap [ nextSourceId ] = sourceId ;
9198 nextSources [ nextSourceId ] = style . sources [ sourceId ] ;
9299 for ( const layer of layersToMap ) {
93100 if ( layer . source === sourceId ) {
@@ -97,11 +104,22 @@ export function createMapStyleExtending(SuperClass, { MapManager, mapRepo }) {
97104 }
98105 for ( const layer of layersToMap ) {
99106 const originId = layer . id ;
100- if ( this . map . getLayer ( layer . id ) ) {
101- const layerId = layer . id + timestamp ;
102- layer . id = layerId ;
107+ let reused ;
108+ const existLayer = this . map . getLayer ( layer . id ) ;
109+ if ( existLayer ) {
110+ // 此时用 getSource(xx).tiles 为空
111+ if (
112+ this . options . checkSameLayer &&
113+ isSameRasterLayer ( nextSources [ layer . source ] , this . map . getStyle ( ) . sources [ existLayer . source ] )
114+ ) {
115+ reused = true ;
116+ layer . source = sourcesIdChangedMap [ layer . source ] ;
117+ } else {
118+ const layerId = layer . id + timestamp ;
119+ layer . id = layerId ;
120+ }
103121 }
104- layerIdToChange . push ( { originId : originId , renderId : layer . id } ) ;
122+ layerIdToChange . push ( { originId : originId , renderId : layer . id , reused } ) ;
105123 }
106124 return {
107125 sources : nextSources ,
@@ -112,7 +130,8 @@ export function createMapStyleExtending(SuperClass, { MapManager, mapRepo }) {
112130
113131 _generateAppreciableLayers ( ) {
114132 return this . mapOptions . style . layers . reduce ( ( layers , layer ) => {
115- const id = layer [ 'source-layer' ] || layer . source || layer . id ;
133+ const nameLayer = layer [ 'source-layer' ] ? layer : { ...layer , layerInfo : { id : layer . id } } ;
134+ const id = createAppreciableLayerId ( nameLayer ) ;
116135 const matchLayer = layers . find ( item => item . id === id ) ;
117136 if ( matchLayer ) {
118137 matchLayer . renderLayers . push ( layer . id ) ;
@@ -122,7 +141,8 @@ export function createMapStyleExtending(SuperClass, { MapManager, mapRepo }) {
122141 ...layer ,
123142 id,
124143 name : matchRenameLayer && matchRenameLayer . originId ,
125- renderLayers : [ layer . id ]
144+ renderLayers : [ layer . id ] ,
145+ reused : matchRenameLayer && matchRenameLayer . reused
126146 } ) ;
127147 }
128148 return layers ;
0 commit comments