Skip to content

Commit 24fb1b3

Browse files
committed
【fix】overlaymanager 原型链; ISVJ-8261
1 parent ea4662e commit 24fb1b3

File tree

4 files changed

+145
-3
lines changed

4 files changed

+145
-3
lines changed

src/mapboxgl/core/MapExtend.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ export var MapExtend = (function () {
2222
this.beforeLoadBak(id, options);
2323
};
2424
}
25-
mapboxgl.Map.prototype.overlayLayersManager = {};
25+
mapboxgl.Map = class Map extends mapboxgl.Map {
26+
overlayLayersManager = {};
27+
}
2628
if (mapboxgl.Map.prototype.addLayerBak === undefined) {
2729
mapboxgl.Map.prototype.addLayerBak = mapboxgl.Map.prototype.addLayer;
2830
mapboxgl.Map.prototype.addLayer = function (layer, before) {
@@ -89,13 +91,22 @@ export var MapExtend = (function () {
8991

9092
mapboxgl.Map.prototype.removeLayer = function (id) {
9193
if (this.overlayLayersManager[id]) {
94+
const layer = this.overlayLayersManager[id];
9295
delete this.overlayLayersManager[id];
96+
if (layer.type !== 'custom') {
97+
removeLayer(layer);
98+
return this;
99+
}
93100
}
94101
this.style.removeLayer(id);
95102
this._update(true);
96103
return this;
97104
};
98105

106+
function removeLayer(layer) {
107+
layer.removeFromMap && layer.removeFromMap();
108+
}
109+
99110
//目前扩展的overlayer,只支持显示或隐藏图层操作
100111
mapboxgl.Map.prototype.setLayoutProperty = function (layerID, name, value) {
101112
if (this.overlayLayersManager[layerID]) {

src/maplibregl/core/MapExtend.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ import maplibregl from 'maplibre-gl';
99
* @private
1010
*/
1111
export var MapExtend = (function () {
12-
maplibregl.Map.prototype.overlayLayersManager = {};
12+
maplibregl.Map = class Map extends maplibregl.Map {
13+
overlayLayersManager = {};
14+
}
1315
if (maplibregl.Map.prototype.addLayerBak === undefined) {
1416
maplibregl.Map.prototype.addLayerBak = maplibregl.Map.prototype.addLayer;
1517
maplibregl.Map.prototype.addLayer = function (layer, before) {
@@ -76,12 +78,21 @@ import maplibregl from 'maplibre-gl';
7678

7779
maplibregl.Map.prototype.removeLayer = function (id) {
7880
if (this.overlayLayersManager[id]) {
81+
const layer = this.overlayLayersManager[id];
7982
delete this.overlayLayersManager[id];
83+
if (layer.type !== 'custom') {
84+
removeLayer(layer);
85+
return this;
86+
}
8087
}
8188
this.style.removeLayer(id);
8289
this._update(true);
8390
return this;
8491
};
92+
93+
function removeLayer(layer) {
94+
layer.removeFromMap && layer.removeFromMap();
95+
}
8596

8697
//目前扩展的overlayer,只支持显示或隐藏图层操作
8798
maplibregl.Map.prototype.setLayoutProperty = function (layerID, name, value) {

test/mapboxgl/core/MapExtendSpec.js

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { MapExtend } from '../../../src/mapboxgl/core/MapExtend';
66
import { decryptSources } from '../../../src/mapboxgl/core/decryptSource';
77
import { EncryptRequest } from '../../../src/common/util/EncryptRequest';
88

9-
describe('getServiceKey', () => {
9+
describe('MapExtend mapboxgl', () => {
1010
let originalTimeout, testDiv;
1111
const url = 'http:/fake:8090/iserver/iserver/services/map-China107/rest/maps/A';
1212
beforeAll(() => {
@@ -240,4 +240,74 @@ describe('getServiceKey', () => {
240240
expect(error).toEqual(new Error('mapbox-gl cannot support plane coordinate system.'));
241241
}
242242
});
243+
244+
it('overlayLayersManager', (done) => {
245+
const map1 = new mapboxgl.Map({
246+
container: 'map',
247+
style: {
248+
version: 8,
249+
sources: {
250+
'raster-tiles': {
251+
type: 'raster',
252+
tiles: ['https://maptiles.supermapol.com/iserver/services/map_China/rest/maps/China_Dark'],
253+
tileSize: 256
254+
}
255+
},
256+
layers: [
257+
{
258+
id: 'simple-tiles',
259+
type: 'raster',
260+
source: 'raster-tiles',
261+
minzoom: 0,
262+
maxzoom: 22
263+
}
264+
]
265+
},
266+
center: [116.4, 39.79],
267+
zoom: 3
268+
});
269+
expect(map1.overlayLayersManager).toEqual({});
270+
map1.overlayLayersManager = { l7_layer_1: { id: 'l7_layer_1', type: 'custom' }, heatmap_1: { id: 'heatmap_1', removeFromMap: function() {} } };
271+
spyOn(map1.overlayLayersManager.heatmap_1, 'removeFromMap').and.callThrough();
272+
spyOn(map1.style, 'removeLayer').and.callThrough();
273+
const removeFromMap = map1.overlayLayersManager.heatmap_1.removeFromMap;
274+
const testDiv2 = window.document.createElement('div');
275+
testDiv2.setAttribute('id', 'map2');
276+
window.document.body.appendChild(testDiv2);
277+
const map2 = new mapboxgl.Map({
278+
container: 'map2',
279+
style: {
280+
version: 8,
281+
sources: {
282+
'raster-tiles': {
283+
type: 'raster',
284+
tiles: ['https://maptiles.supermapol.com/iserver/services/map_China/rest/maps/China_Dark'],
285+
tileSize: 256
286+
}
287+
},
288+
layers: [
289+
{
290+
id: 'simple-tiles',
291+
type: 'raster',
292+
source: 'raster-tiles',
293+
minzoom: 0,
294+
maxzoom: 22
295+
}
296+
]
297+
},
298+
center: [116.4, 39.79],
299+
zoom: 3
300+
});
301+
expect(map2.overlayLayersManager).toEqual({});
302+
map1.on('load', () => {
303+
map1.removeLayer('heatmap_1')
304+
expect(removeFromMap.calls.count()).toEqual(1);
305+
map1.removeLayer('l7_layer_1');
306+
expect(map1.style.removeLayer.calls.count()).toEqual(1);
307+
map1.remove();
308+
map2.remove();
309+
document.body.removeChild(testDiv2);
310+
done();
311+
})
312+
});
243313
});

test/maplibregl/core/MapExtendSpec.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,11 @@ describe('maplibregl MapExtend', () => {
107107
}
108108
});
109109
});
110+
111+
afterEach(() => {
112+
map.overlayLayersManager = {};
113+
})
114+
110115
afterAll(() => {
111116
window.document.body.removeChild(testDiv);
112117
map && map.remove();
@@ -121,4 +126,49 @@ describe('maplibregl MapExtend', () => {
121126
expect(layers).toEqual(['raster', 'fill-1', 'circle-1', 'l7_layer_1', 'heatmap_1']);
122127
done();
123128
});
129+
130+
it('overlayLayersManager', (done) => {
131+
expect(map.overlayLayersManager).toEqual({});
132+
map.overlayLayersManager = { l7_layer_1: { id: 'l7_layer_1', type: 'custom' }, heatmap_1: { id: 'heatmap_1', removeFromMap: function() {} } };
133+
spyOn(map.overlayLayersManager.heatmap_1, 'removeFromMap').and.callThrough();
134+
spyOn(map.style, 'removeLayer').and.callThrough();
135+
const removeFromMap = map.overlayLayersManager.heatmap_1.removeFromMap;
136+
const testDiv2 = window.document.createElement('div');
137+
testDiv2.setAttribute('id', 'map2');
138+
window.document.body.appendChild(testDiv2);
139+
const map2 = new maplibregl.Map({
140+
container: 'map2',
141+
style: {
142+
version: 8,
143+
sources: {
144+
'raster-tiles': {
145+
type: 'raster',
146+
tiles: ['https://maptiles.supermapol.com/iserver/services/map_China/rest/maps/China_Dark'],
147+
tileSize: 256
148+
}
149+
},
150+
layers: [
151+
{
152+
id: 'simple-tiles',
153+
type: 'raster',
154+
source: 'raster-tiles',
155+
minzoom: 0,
156+
maxzoom: 22
157+
}
158+
]
159+
},
160+
center: [116.4, 39.79],
161+
zoom: 3
162+
});
163+
expect(map2.overlayLayersManager).toEqual({});
164+
map.on('load', () => {
165+
map.removeLayer('heatmap_1')
166+
expect(removeFromMap.calls.count()).toEqual(1);
167+
map.removeLayer('l7_layer_1');
168+
expect(map.style.removeLayer.calls.count()).toEqual(1);
169+
map2.remove();
170+
document.body.removeChild(testDiv2);
171+
done();
172+
})
173+
});
124174
});

0 commit comments

Comments
 (0)