Skip to content

Commit 82baf3d

Browse files
committed
【feature】webmap 3.0 可感知图层优化
1 parent 00df882 commit 82baf3d

File tree

4 files changed

+80
-45
lines changed

4 files changed

+80
-45
lines changed

src/mapboxgl/mapping/utils/L7LayerUtil.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1354,7 +1354,7 @@ function transformWebmapTextLayerToSceneLayer(layer, source, visible) {
13541354
const { paint, layout } = layer;
13551355
const field = layout['text-field'].split('{')[1].split('}')[0];
13561356
const style = {};
1357-
Object.keys(omitAttrs(TEXT_MAPBOXGL_ANTVL7_KEY, 'text-color', 'text-size', 'text-field')).forEach((k) => {
1357+
Object.keys(omitAttrs(TEXT_MAPBOXGL_ANTVL7_KEY, ['text-color', 'text-size', 'text-field'])).forEach((k) => {
13581358
const value = (layer[getPaintOrLayutByStyleName(k)] || {})[k];
13591359
value !== undefined && (style[TEXT_MAPBOXGL_ANTVL7_KEY[k]] = value);
13601360
});

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

Lines changed: 34 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ export class WebMap extends mapboxgl.Evented {
333333
mapboxglLayers.forEach((layer) => {
334334
layer.source && !this.map.getSource(layer.source) && this.map.addSource(layer.source, sources[layer.source]);
335335
// L7才会用到此属性
336-
if (layer.type === 'symbol' && (layer.layout || {})['text-z-offset'] === 0) {
336+
if (layer.type === 'symbol' && layer.layout['text-z-offset'] === 0) {
337337
delete layer.layout['text-z-offset'];
338338
}
339339
this.map.addLayer(layer);
@@ -434,15 +434,17 @@ export class WebMap extends mapboxgl.Evented {
434434
this.fire('addlayerssucceeded', { map: this.map, mapparams: this.mapParams, layers: matchLayers });
435435
}
436436

437-
_getLayerInfosFromCatalogs(catalogs) {
437+
_getLayerInfosFromCatalogs(catalogs, catalogTypeField = 'type') {
438438
const results = [];
439439
for (let i = 0; i < catalogs.length; i++) {
440-
const { catalogType, children } = catalogs[i];
441-
if (catalogType === 'layer') {
440+
const catalogType = catalogs[i][catalogTypeField];
441+
if (catalogType !== 'group') {
442442
results.push(catalogs[i]);
443+
continue;
443444
}
444-
if (catalogType === 'group' && children && children.length > 0) {
445-
const result = this._getLayerInfosFromCatalogs(children);
445+
const { children } = catalogs[i];
446+
if (children && children.length > 0) {
447+
const result = this._getLayerInfosFromCatalogs(children, catalogTypeField);
446448
results.push(...result);
447449
}
448450
}
@@ -527,19 +529,22 @@ export class WebMap extends mapboxgl.Evented {
527529
_generateLayers() {
528530
const allLayersOnMap = this._getLayersOnMap();
529531
const { catalogs = [], datas = [] } = this._mapResourceInfo;
530-
const originLayers = this._getLayerInfosFromCatalogs(catalogs);
532+
const projectCataglogs = this._getLayerInfosFromCatalogs(catalogs, 'catalogType');
533+
const metadataCatalogs = this._getLayerInfosFromCatalogs(this._mapInfo.metadata.layerCatalog);
531534
const layers = allLayersOnMap.reduce((layersList, layer) => {
532-
const containLayer = originLayers.find((item) => {
533-
if (item.layersContent && item.id !== layer.id) {
534-
return item.layersContent.includes(layer.id);
535+
const containLayer = metadataCatalogs.find((item) => {
536+
if (item.parts && item.id !== layer.id) {
537+
return item.parts.includes(layer.id);
535538
}
536539
return false;
537540
});
538541
if (containLayer) {
539542
return layersList;
540543
}
541-
const matchCatalogLayer = originLayers.find((item) => item.id === layer.id) || {};
542-
const { title = layer.id, visualization, layersContent, msDatasetId } = matchCatalogLayer;
544+
const matchProjectCatalog = projectCataglogs.find((item) => item.id === layer.id) || {};
545+
const matchMetadataCatalog = metadataCatalogs.find((item) => item.id === layer.id) || {};
546+
const { msDatasetId } = matchProjectCatalog;
547+
const { title = layer.id, parts } = matchMetadataCatalog;
543548
let dataType = '';
544549
let dataId = '';
545550
if (msDatasetId) {
@@ -563,7 +568,7 @@ export class WebMap extends mapboxgl.Evented {
563568
type: sourceOnMap && sourceOnMap.type,
564569
sourceLayer: layer.sourceLayer
565570
},
566-
renderLayers: this._getRenderLayers(layersContent, layer.id),
571+
renderLayers: this._getRenderLayers(parts, layer.id),
567572
dataSource: {
568573
serverId: dataId,
569574
type: dataType
@@ -573,22 +578,13 @@ export class WebMap extends mapboxgl.Evented {
573578
if (isL7Layer(layer)) {
574579
overlayLayers.l7Layer = true;
575580
}
576-
if (visualization) {
577-
const styleSettings = this._parseRendererStyleData(visualization.renderer);
578-
const defaultStyleSetting = styleSettings[0];
579-
if (defaultStyleSetting) {
580-
let themeField = '';
581-
if (defaultStyleSetting.type === 'heat') {
582-
themeField = defaultStyleSetting.field;
583-
} else if (defaultStyleSetting.color) {
584-
themeField = defaultStyleSetting.color.field;
585-
}
586-
if (themeField) {
587-
overlayLayers.themeSetting = {
588-
themeField
589-
};
590-
}
591-
}
581+
const matchThemeFields = this._legendList
582+
.filter((item) => item.layerId === layer.id)
583+
.map((item) => item.themeField)
584+
.filter((item) => !!item);
585+
const validThemeFields = Array.from(new Set(matchThemeFields));
586+
if (validThemeFields.length > 0) {
587+
overlayLayers.themeSetting = { themeField: validThemeFields };
592588
}
593589
layersList.push(overlayLayers);
594590
return layersList;
@@ -618,7 +614,6 @@ export class WebMap extends mapboxgl.Evented {
618614
const layerCatalogs = layerCatalog.concat(extraLayers);
619615
const appreciableLayers = this.getAppreciableLayers();
620616
const formatLayerCatalog = this._createFormatCatalogs(layerCatalogs, appreciableLayers);
621-
this._updateLayerVisible(formatLayerCatalog);
622617
return formatLayerCatalog;
623618
}
624619

@@ -656,13 +651,6 @@ export class WebMap extends mapboxgl.Evented {
656651
return formatCatalogs;
657652
}
658653

659-
_updateLayerVisible(catalogs) {
660-
for (const data of catalogs) {
661-
const list = this._collectChildrenKey([data], ['visible']);
662-
data.visible = list.every((item) => item);
663-
}
664-
}
665-
666654
_collectChildrenKey(catalogs, keys, list = []) {
667655
for (const data of catalogs) {
668656
if (data.type === 'group') {
@@ -770,7 +758,7 @@ export class WebMap extends mapboxgl.Evented {
770758

771759
_createLegendInfo() {
772760
const { catalogs = [] } = this._mapResourceInfo;
773-
const originLayers = this._getLayerInfosFromCatalogs(catalogs, this._mapInfo.layers);
761+
const originLayers = this._getLayerInfosFromCatalogs(catalogs, 'catalogType');
774762
for (const layer of originLayers) {
775763
const { renderer } = layer.visualization || {};
776764
if (!renderer) {
@@ -779,7 +767,12 @@ export class WebMap extends mapboxgl.Evented {
779767
const layerFromMapInfo = this._mapInfo.layers.find((item) => {
780768
return item.id === layer.id;
781769
});
782-
const nextLayer = Object.assign({}, layerFromMapInfo, { title: layer.title });
770+
let themeField;
771+
const sourceInfo = this._mapInfo.sources[layerFromMapInfo.source];
772+
if ('clusterField' in sourceInfo) {
773+
themeField = sourceInfo.clusterField;
774+
}
775+
const nextLayer = Object.assign({}, layerFromMapInfo, { title: layer.title, themeField });
783776
const styleSettings = this._parseRendererStyleData(renderer);
784777
const layerLegends = styleSettings.reduce((legends, styleSetting) => {
785778
const legendItems = this._createLayerLegendList(nextLayer, styleSetting);
@@ -798,7 +791,7 @@ export class WebMap extends mapboxgl.Evented {
798791
}
799792

800793
_transStyleKeys(renderType, keys) {
801-
return keys.map(key => this._getAliasKey(renderType, key));
794+
return keys.map((key) => this._getAliasKey(renderType, key));
802795
}
803796

804797
_transStyleSetting(renderType, styleSetting) {
@@ -894,7 +887,7 @@ export class WebMap extends mapboxgl.Evented {
894887
const layerId = layer.id;
895888
const layerTitle = layer.title;
896889
const commonStyleOptions = {
897-
themeField: styleSetting.field,
890+
themeField: layer.themeField || styleSetting.field,
898891
layerId,
899892
layerTitle
900893
};

test/mapboxgl/mapping/WebMapV3Spec.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,8 @@ describe('mapboxgl-webmap3.0', () => {
290290
const style = map.getStyle();
291291
expect(style.layers.length).toBe(nextMapInfo.layers.length + 1);
292292
const appreciableLayers = mapstudioWebmap.getAppreciableLayers();
293-
expect(appreciableLayers.length).toBeGreaterThanOrEqual(nextMapInfo.layers.length);
293+
const layerCatalogs = mapstudioWebmap.getLayerCatalog();
294+
expect(layerCatalogs.length).toBeLessThanOrEqual(appreciableLayers.length);
294295
delete mapboxgl.CRS;
295296
done();
296297
});
@@ -473,6 +474,7 @@ describe('mapboxgl-webmap3.0', () => {
473474
if (url.indexOf('/web/datas/1767084124/structureddata.json') > -1) {
474475
return Promise.resolve(new Response(l7StructureData1767084124));
475476
}
477+
console.log(url);
476478
return Promise.resolve();
477479
});
478480
mapboxgl.CRS = function () {};
@@ -490,7 +492,7 @@ describe('mapboxgl-webmap3.0', () => {
490492
const appreciableLayers = webmapInstance.getAppreciableLayers();
491493
const layerCatalogs = webmapInstance.getLayerCatalog();
492494
expect(layerCatalogs.length).toBeLessThanOrEqual(appreciableLayers.length);
493-
expect(webmapInstance.getLegendInfo().length).toBe(9);
495+
expect(webmapInstance.getLegendInfo().length).toBe(11);
494496
delete mapboxgl.Map.prototype.getCRS;
495497
delete mapboxgl.CRS;
496498
done();

0 commit comments

Comments
 (0)