Skip to content

Commit 9a0a0fb

Browse files
committed
【feature】获取图层列表和可感知图层优化; fix webmapv2 加载 baselayer source 存在时优化
1 parent de1eead commit 9a0a0fb

File tree

14 files changed

+225
-99
lines changed

14 files changed

+225
-99
lines changed

src/common/mapping/MapBase.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,16 @@ export function createMapClassExtending(SuperClass = class {}) {
2626
return this._legendList;
2727
}
2828

29-
getSelfAppreciableLayers(appreciableLayers) {
30-
return (this._sourceListModel && this._sourceListModel.getSelfLayers(appreciableLayers)) || [];
29+
getSelfAppreciableLayers() {
30+
return (this._sourceListModel && this._sourceListModel.getSelfLayers(...arguments)) || [];
3131
}
3232

33-
setLayersVisible(layers, visibility) {
34-
this._sourceListModel && this._sourceListModel.setLayersVisible(layers, visibility);
33+
setLayersVisible() {
34+
this._sourceListModel && this._sourceListModel.setLayersVisible(...arguments);
3535
}
3636

37-
toggleLayerVisible(layerId, visible) {
38-
this._sourceListModel && this._sourceListModel.toggleLayerVisible(layerId, visible);
37+
toggleLayerVisible() {
38+
this._sourceListModel && this._sourceListModel.toggleLayerVisible(...arguments);
3939
}
4040

4141
rectifyLayersOrder(appreciableLayers, topLayerBeforeId) {

src/common/mapping/WebMapBase.js

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -392,23 +392,23 @@
392392
return (this._handler && this._handler.getLayerCatalog()) || [];
393393
}
394394

395-
setLayersVisible(layers, visibility) {
396-
this._handler && this._handler.setLayersVisible(layers, visibility);
395+
setLayersVisible() {
396+
this._handler && this._handler.setLayersVisible(...arguments);
397397
}
398398

399399
/**
400400
* @version 11.2.1
401401
* @function WebMapBase.prototype.toggleLayerVisible
402-
* @param {string} layerId - 图层 id
402+
* @param {string} layer - 图层信息
403403
* @param {boolean} visible - 图层是否可见。true 表示显示,false 表示隐藏。
404404
* @description 设置图层显隐。
405405
*/
406-
toggleLayerVisible(layerId, visible) {
407-
this._handler && this._handler.toggleLayerVisible(layerId, visible);
406+
toggleLayerVisible() {
407+
this._handler && this._handler.toggleLayerVisible(...arguments);
408408
}
409409

410410
/**
411-
* @version 11.3.0
411+
* @version 11.2.1
412412
* @function WebMapBase.prototype.getWebMapType
413413
* @description 获取地图类型。
414414
* @returns {String} 地图类型。
@@ -418,12 +418,14 @@
418418
}
419419

420420
/**
421-
* @version 11.3.0
421+
* @version 11.2.1
422422
* @function WebMapBase.prototype.rectifyLayersOrder
423+
* @param {Array} layers - 图层列表。
424+
* @param {string} topLayerBeforeId - 图层列表中置顶图层指定的 beforeId。
423425
* @description 根据已知顺序的可感知图层,对地图上图顺序进行排序。
424426
*/
425-
rectifyLayersOrder(appreciableLayers, topLayerBeforeId) {
426-
this._handler && this._handler.rectifyLayersOrder(appreciableLayers, topLayerBeforeId);
427+
rectifyLayersOrder() {
428+
this._handler && this._handler.rectifyLayersOrder(...arguments);
427429
}
428430

429431
/**
@@ -436,8 +438,8 @@
436438
* @param {Array} features - 要素信息。
437439
* @param {string} mergeByField - 属性关联字段。
438440
*/
439-
updateOverlayLayer(layerInfo, features, mergeByField) {
440-
this._handler && this._handler.updateOverlayLayer(layerInfo, features, mergeByField);
441+
updateOverlayLayer() {
442+
this._handler && this._handler.updateOverlayLayer(...arguments);
441443
}
442444

443445
/**
@@ -448,8 +450,8 @@
448450
* @param {Object} [layerInfo] - 复制图层信息。如 id、source、layout
449451
* @returns {Array} 复制成功的信图层信息。
450452
*/
451-
copyLayer(id, layerInfo) {
452-
return this._handler && this._handler.copyLayer(id, layerInfo);
453+
copyLayer() {
454+
return this._handler && this._handler.copyLayer(...arguments);
453455
}
454456

455457
/**

src/common/mapping/WebMapV2.js

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo }) {
337337
}
338338
style.layers.forEach(layer => {
339339
layer.layout && (layer.layout.visibility = this._getVisibility(layerInfo.visible));
340-
})
340+
});
341341
this.map.addStyle(style);
342342
const layerIds = [];
343343
style.layers.forEach((item) => {
@@ -2394,11 +2394,16 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo }) {
23942394
if (bounds) {
23952395
source.bounds = bounds;
23962396
}
2397+
let sourceId = source;
2398+
if (this.map.getSource(layerID) && (!this.map.getLayer(layerID) || !this.checkSameLayer || !this._isSameRasterLayer(layerID, source))) {
2399+
sourceId = `${layerID}_${+new Date()}`;
2400+
this.map.addSource(sourceId, source);
2401+
}
23972402
this._addLayer(
23982403
{
23992404
id: layerID,
24002405
type: 'raster',
2401-
source: source,
2406+
source: sourceId,
24022407
minzoom: minzoom || 0,
24032408
maxzoom: maxzoom || 22,
24042409
layout: {
@@ -2740,7 +2745,7 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo }) {
27402745
_addLayer(layerInfo, parentLayerId = layerInfo.id, beforeId) {
27412746
const { id } = layerInfo;
27422747
if (this.map.getLayer(id)) {
2743-
if (this.checkSameLayer && this._isSameRasterLayer(id, layerInfo)) {
2748+
if (this.checkSameLayer && this._isSameRasterLayer(id, layerInfo.source)) {
27442749
this._setCacheLayer({ layerInfo, parentLayerId, id, reused: true, beforeId });
27452750
return;
27462751
}
@@ -2847,8 +2852,8 @@ export function createWebMapV2Extending(SuperClass, { MapManager, mapRepo }) {
28472852
};
28482853
}
28492854

2850-
_isSameRasterLayer(id, layerInfo) {
2851-
return isSameRasterLayer(layerInfo.source, this.map.getSource(id));
2855+
_isSameRasterLayer(sourceId, sourceInfo) {
2856+
return isSameRasterLayer(sourceInfo, this.map.getSource(sourceId));
28522857
}
28532858

28542859
_centerValid(center) {

src/common/mapping/utils/AppreciableLayerBase.js

Lines changed: 19 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,12 @@ export class AppreciableLayerBase extends Events {
1010
this.appendLayers = options.appendLayers || false;
1111
this.unexpectedSourceNames = ['tdt-search-', 'tdt-route-', 'smmeasure', 'mapbox-gl-draw', 'maplibre-gl-draw', /tracklayer-\d+-line/];
1212
this.layersVisibleMap = new Map();
13-
this.layerCatalogs = [];
14-
this.appreciableLayers = [];
1513
this.eventTypes = ['layerupdatechanged'];
1614
this._styleDataUpdatedHandler = this._styleDataUpdatedHandler.bind(this);
1715
}
1816

1917
setSelfLayers(layers) {
2018
this.layers = layers;
21-
if (this.appreciableLayers.length > 0) {
22-
this._styleDataUpdatedHandler();
23-
}
2419
}
2520

2621
createAppreciableLayers() {
@@ -36,11 +31,13 @@ export class AppreciableLayerBase extends Events {
3631
}
3732

3833
getLayerCatalog() {
39-
return this.layerCatalogs;
34+
const layerCatalog = this.createLayerCatalogs();
35+
this._updateLayerCatalogsVisible(layerCatalog);
36+
return layerCatalog;
4037
}
4138

4239
getLayers() {
43-
return this.appreciableLayers;
40+
return this.createAppreciableLayers();
4441
}
4542

4643
getSelfLayers(appreciableLayers = this.getLayers()) {
@@ -50,19 +47,15 @@ export class AppreciableLayerBase extends Events {
5047
);
5148
}
5249

53-
toggleLayerVisible(layerId, visible) {
54-
const item = this._findLayerCatalog(this.layerCatalogs, layerId);
55-
if (!item) {
56-
return;
57-
}
50+
toggleLayerVisible(layer, visible) {
5851
const visibility = visible ? 'visible' : 'none';
59-
if (item.type === 'group') {
60-
const visbleId = this._getLayerVisibleId(item);
52+
if (layer.type === 'group') {
53+
const visbleId = this._getLayerVisibleId(layer);
6154
this.layersVisibleMap.set(visbleId, visible);
62-
const targetLayers = getLayerInfosFromCatalogs(item.children);
55+
const targetLayers = getLayerInfosFromCatalogs(layer.children);
6356
this.setLayersVisible(targetLayers, visibility);
6457
} else {
65-
this.setLayersVisible([item], visibility);
58+
this.setLayersVisible([layer], visibility);
6659
}
6760
}
6861

@@ -74,7 +67,7 @@ export class AppreciableLayerBase extends Events {
7467
(layer.CLASS_INSTANCE && layer.CLASS_INSTANCE.show && layer.CLASS_INSTANCE.hide)
7568
) {
7669
visibility === 'visible' ? layer.CLASS_INSTANCE.show() : layer.CLASS_INSTANCE.hide();
77-
this._styleDataUpdatedHandler();
70+
this.map.style.fire('data', { dataType: 'style' });
7871
return;
7972
}
8073
layer.renderLayers.forEach((layerId) => {
@@ -98,7 +91,7 @@ export class AppreciableLayerBase extends Events {
9891
if (!this.map) {
9992
return;
10093
}
101-
this._initializeData();
94+
this._styleDataUpdatedHandler();
10295
this._registerMapEvent();
10396
}
10497

@@ -122,20 +115,19 @@ export class AppreciableLayerBase extends Events {
122115
}
123116

124117
_initSourceList(detailLayers) {
125-
const datas = detailLayers.reduce((sourceList, layer) => {
118+
const datas = detailLayers.slice().reverse().reduce((sourceList, layer) => {
119+
const id = layer.renderSource.sourceLayer ? `${layer.renderSource.id}-${+new Date()}` : layer.id;
126120
let matchItem = sourceList.find((item) => {
127-
const sourceId = layer.renderSource.id || layer.id;
128-
return item.id === sourceId;
121+
return item.id === id;
129122
});
130123
if (!matchItem) {
131-
const sourceListItem = new SourceModel(layer);
124+
const sourceListItem = new SourceModel(layer, id);
132125
sourceList.push(sourceListItem);
133126
matchItem = sourceListItem;
134127
}
135128
matchItem.addLayer(layer);
136129
return sourceList;
137130
}, []);
138-
datas.reverse();
139131
return datas;
140132
}
141133

@@ -278,23 +270,14 @@ export class AppreciableLayerBase extends Events {
278270
}
279271
}
280272

281-
_initializeData() {
282-
this.appreciableLayers = this.createAppreciableLayers();
283-
this.layerCatalogs = this.createLayerCatalogs();
284-
this._updateLayerCatalogsVisible(this.layerCatalogs);
285-
}
286-
287273
_registerMapEvent() {
288274
this.map.on('styledata', this._styleDataUpdatedHandler);
289275
}
290276

291277
_styleDataUpdatedHandler() {
292-
this._initializeData();
293-
if (!this._appendLayers) {
294-
this.triggerEvent('layerupdatechanged', {
295-
layers: this.appreciableLayers,
296-
layerCatalog: this.layerCatalogs
297-
});
278+
this.triggerEvent('layerupdatechanged', {
279+
layers: this.getLayers(),
280+
layerCatalog: this.getLayerCatalog()
281+
});
298282
}
299283
}
300-
}

src/common/mapping/utils/SourceModel.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
class SourceModel {
2-
constructor(options) {
2+
constructor(options, id) {
33
this.dataSource = options.dataSource;
4-
this.id = options.renderSource.id || options.id;
4+
this.id = id;
55
this.title = options.title;
66
this.renderSource = options.renderSource;
77
this.renderLayers = [];

test/common/mapping/utils/SourceListModelV2Spec.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,14 @@ describe('SourceListV2', () => {
200200
if (this.overlayLayersManager[layerId]) {
201201
this.overlayLayersManager.visible = visibility === 'visible';
202202
}
203-
})
203+
}),
204+
style: {
205+
fire(type, options) {
206+
if (type === 'data' && options.dataType === 'style' && mockEvents.styledata) {
207+
mockEvents.styledata();
208+
}
209+
}
210+
}
204211
};
205212
});
206213

@@ -440,7 +447,7 @@ describe('SourceListV2', () => {
440447
const layerList = sourceListModel.getLayerCatalog();
441448
expect(layerList.length).toBe(2);
442449
expect(layerList[0].children.length).toBe(2);
443-
expect(layerList[0].children[1].renderLayers).toEqual(appreciableLayers[2].renderLayers);
450+
expect(layerList[0].children[0].renderLayers).toEqual(appreciableLayers[2].renderLayers);
444451
expect(layerList[0].type).toBe('group');
445452
done();
446453
});
@@ -528,7 +535,7 @@ describe('SourceListV2', () => {
528535
done();
529536
}
530537
});
531-
sourceListModel.toggleLayerVisible(layerList[1].id, false);
538+
sourceListModel.toggleLayerVisible(layerList[1], false);
532539
expect(mockEvents.styledata).not.toBeUndefined();
533540
mockEvents.styledata();
534541
});

test/common/mapping/utils/SourceListModelV3Spec.js

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,14 @@ describe('SourceListV3', () => {
202202
if (this.overlayLayersManager[layerId]) {
203203
this.overlayLayersManager.visible = visibility === 'visible';
204204
}
205-
})
205+
}),
206+
style: {
207+
fire(type, options) {
208+
if (type === 'data' && options.dataType === 'style' && mockEvents.styledata) {
209+
mockEvents.styledata();
210+
}
211+
}
212+
}
206213
};
207214
});
208215

@@ -311,7 +318,7 @@ describe('SourceListV3', () => {
311318
done();
312319
}
313320
});
314-
sourceListModel.toggleLayerVisible(layerList[3].id, false);
321+
sourceListModel.toggleLayerVisible(layerList[3], false);
315322
});
316323

317324
it('toggleLayerVisible true', (done) => {
@@ -335,11 +342,11 @@ describe('SourceListV3', () => {
335342
let layerList = sourceListModel.getLayerCatalog();
336343
expect(layerList.length).toBe(mapInfo.metadata.layerCatalog.length + 3);
337344
expect(layerList[3].visible).toBeTruthy();
338-
sourceListModel.toggleLayerVisible(layerList[3].id, false);
345+
sourceListModel.toggleLayerVisible(layerList[3], false);
339346
layerList = sourceListModel.getLayerCatalog();
340347
expect(layerList[3].visible).toBeFalsy();
341348
expect(markerList[layerList[3].id].hide).toHaveBeenCalledTimes(1);
342-
sourceListModel.toggleLayerVisible(layerList[3].id, true);
349+
sourceListModel.toggleLayerVisible(layerList[3], true);
343350
layerList = sourceListModel.getLayerCatalog();
344351
expect(layerList[3].visible).toBeTruthy();
345352
expect(markerList[layerList[3].id].show).toHaveBeenCalledTimes(1);

test/mapboxgl/mapping/WebMapSpec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1251,7 +1251,7 @@ describe('mapboxgl_WebMap', () => {
12511251
expect(layers.length).toBe(2);
12521252
expect(layers[0].id).toBe('China4269@DataSource');
12531253
expect(layers[0].visible).toBeTruthy();
1254-
datavizWebmap.toggleLayerVisible(layers[0].id, false);
1254+
datavizWebmap.toggleLayerVisible(layers[0], false);
12551255
layers = datavizWebmap.getLayers();
12561256
expect(layers[0].visible).toBeFalsy();
12571257
datavizWebmap.once('layerupdatechanged', () => {

0 commit comments

Comments
 (0)