Skip to content

Commit 34061f3

Browse files
committed
webmapV3新增获取图层列表方法,修改可感知图层结构 review by xiongjj
1 parent 92f9a92 commit 34061f3

File tree

2 files changed

+105
-9
lines changed

2 files changed

+105
-9
lines changed

src/mapboxgl/mapping/webmap/v3/WebMap.js

Lines changed: 104 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -306,11 +306,11 @@ export class WebMap extends mapboxgl.Evented {
306306
const { catalogs = [] } = this._mapResourceInfo;
307307
const originLayers = this._getLayerInfosFromCatalogs(catalogs);
308308
const layers = originLayers.map((layer) => {
309-
const { title, visualization } = layer;
309+
const { id, title, visualization, visible, layersContent } = layer;
310310
const layerFromMapInfo = this._mapInfo.layers.find((item) => {
311311
return item.id === layer.id;
312312
});
313-
this._createLegendInfo(Object.assign({}, layerFromMapInfo), visualization);
313+
this._createLegendInfo(Object.assign({}, layerFromMapInfo, { title: layer.title }), visualization);
314314
let dataType = '';
315315
let dataId = '';
316316
for (const data of this._mapResourceInfo.datas) {
@@ -321,16 +321,22 @@ export class WebMap extends mapboxgl.Evented {
321321
break;
322322
}
323323
}
324-
const overlayLayers = {
324+
const overlayLayers = this._formatLayer({
325325
dataSource: {
326326
serverId: dataId,
327327
type: dataType
328328
},
329-
layerID: layer.id,
330-
layerType: layerFromMapInfo.type === 'raster' ? 'raster' : 'vector',
329+
id,
331330
type: layerFromMapInfo.type,
332-
name: title
333-
};
331+
title,
332+
visible,
333+
renderSource: {
334+
id: layerFromMapInfo.source,
335+
type: layerFromMapInfo.type === 'raster' ? 'raster' : 'vector',
336+
sourceLayer: layerFromMapInfo["source-layer"]
337+
},
338+
renderLayers: this._getRenderLayers(layersContent, id)
339+
});
334340
const styleSettings = this._parseRendererStyleData(visualization.renderer);
335341
const defaultStyleSetting = styleSettings[0];
336342
if (defaultStyleSetting) {
@@ -348,7 +354,97 @@ export class WebMap extends mapboxgl.Evented {
348354
}
349355
return overlayLayers;
350356
});
351-
return layers;
357+
const baseLayer = this._getBaseLayer(layers);
358+
return baseLayer ? [baseLayer].concat(layers) : layers;
359+
}
360+
361+
getLayerCatalog() {
362+
const originLayerCatalog = this._mapInfo.metadata.layerCatalog;
363+
const formatLayerCatalog = this._createFormatCatalogs(originLayerCatalog);
364+
const baseLayer = this._getBaseLayer(formatLayerCatalog);
365+
return baseLayer ? [baseLayer].concat(formatLayerCatalog) : formatLayerCatalog;
366+
}
367+
368+
_createFormatCatalogs(catalogs) {
369+
const formatCatalogs = catalogs.map((catalog) => {
370+
let formatItem;
371+
const { id, title, type, visible, children, parts } = catalog;
372+
if(catalog.type === "group") {
373+
formatItem = {
374+
children: this._createFormatCatalogs(children),
375+
id,
376+
title,
377+
type,
378+
visible
379+
}
380+
} else {
381+
const appreciableLayers = this._generateLayers();
382+
const matchLayer = appreciableLayers.find(layer => layer.id === id);
383+
formatItem = this._formatLayer({
384+
dataSource: matchLayer.dataSource,
385+
id,
386+
type: matchLayer.type,
387+
title,
388+
visible,
389+
renderSource: matchLayer.renderSource,
390+
renderLayers: this._getRenderLayers(parts, id),
391+
themeSetting: matchLayer.themeSetting
392+
})
393+
}
394+
return formatItem;
395+
});
396+
return formatCatalogs;
397+
}
398+
399+
_getRenderLayers(layerIds, layerId) {
400+
if(layerIds) {
401+
if(layerIds.includes(layerId)) {
402+
return layerIds;
403+
} else {
404+
return [layerId, ...layerIds]
405+
}
406+
} else {
407+
return [layerId]
408+
}
409+
}
410+
411+
_getBaseLayer(layers) {
412+
const baseLayer = this._mapInfo.layers[0];
413+
const { id, type } = baseLayer;
414+
const baseLayerInfo = this.map.getLayer(id);
415+
const ids = layers.map(layer => layer.id);
416+
if(!ids.includes(id)) {
417+
const formatBaseLayer = this._formatLayer({
418+
dataSource: {},
419+
id,
420+
title: id,
421+
type,
422+
visible: true,
423+
renderSource: {
424+
id: baseLayerInfo.source,
425+
type: baseLayerInfo.type === 'raster' ? 'raster' : 'vector',
426+
sourceLayer: baseLayerInfo["source-layer"]
427+
},
428+
renderLayers: [id],
429+
themeSetting: {}
430+
});
431+
return formatBaseLayer;
432+
}
433+
return null;
434+
}
435+
436+
_formatLayer(option) {
437+
const { dataSource = {}, id, title, type, visible = true, renderSource = {}, renderLayers = [], themeSetting = {} } = option;
438+
return {
439+
dataSource,
440+
id,
441+
title,
442+
type,
443+
visible,
444+
renderSource,
445+
renderLayers,
446+
themeSetting
447+
}
352448
}
353449

354450
_parseRendererStyleData(renderer) {

test/mapboxgl/mapping/WebMapV3Spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ describe('mapboxgl-webmap3.0', () => {
4747
expect(mapstudioWebmap.options.target).toBe('map');
4848
expect(mapstudioWebmap.mapId).toBe(id);
4949
mapstudioWebmap.on('addlayerssucceeded', ({ map }) => {
50-
expect(map).not.toBeUndefined();
5150
expect(mapstudioWebmap.map).toEqual(map);
5251
expect(mapstudioWebmap.mapParams.title).toBe('空地图');
5352
expect(mapstudioWebmap.mapParams.description).toBe('');
@@ -117,6 +116,7 @@ describe('mapboxgl-webmap3.0', () => {
117116
expect(style.layers.length).toBe(mapInfo.layers.length);
118117
expect(webMapV3.getLayers().length).toBeLessThanOrEqual(mapInfo.layers.length);
119118
expect(webMapV3.getLegendInfo().length).not.toBe(0);
119+
expect(webMapV3.getLayerCatalog().length).not.toBe(0);
120120
done();
121121
});
122122
});

0 commit comments

Comments
 (0)