feat: 优化瓦片金字塔的计算 (#1355)

* fix: 修复 featureScale 错误

* style: lint style

* fix: remove featureScalePlugin async

* feat: opmitize tile cal

* style: lint style

* chore: update api name

Co-authored-by: shihui <yiqianyao.yqy@alibaba-inc.com>
This commit is contained in:
YiQianYao 2022-09-27 20:45:27 +08:00 committed by GitHub
parent 4f13cefca3
commit 54bdd69811
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 72 additions and 49 deletions

View File

@ -59,6 +59,8 @@ export default class DataMappingPlugin implements ILayerPlugin {
// remapping before render // remapping before render
layer.hooks.beforeRender.tap('DataMappingPlugin', () => { layer.hooks.beforeRender.tap('DataMappingPlugin', () => {
const { usage } = layer.getLayerConfig();
if (usage === 'basemap') return;
const source = layer.getSource(); const source = layer.getSource();
if (layer.layerModelNeedUpdate || !source || !source.inited) { if (layer.layerModelNeedUpdate || !source || !source.inited) {
return; return;

View File

@ -88,7 +88,8 @@ export default class FeatureScalePlugin implements ILayerPlugin {
}); });
layer.hooks.beforeRender.tap('FeatureScalePlugin', () => { layer.hooks.beforeRender.tap('FeatureScalePlugin', () => {
if (layer.layerModelNeedUpdate) { const { usage } = layer.getLayerConfig();
if (layer.layerModelNeedUpdate || usage === 'basemap') {
return; return;
} }
this.scaleOptions = layer.getScaleOptions(); this.scaleOptions = layer.getScaleOptions();

View File

@ -18,7 +18,12 @@ export default class UpdateStyleAttributePlugin implements ILayerPlugin {
}); });
layer.hooks.beforeRender.tap('UpdateStyleAttributePlugin', () => { layer.hooks.beforeRender.tap('UpdateStyleAttributePlugin', () => {
if (layer.layerModelNeedUpdate) { const { usage } = layer.getLayerConfig();
if (
layer.layerModelNeedUpdate ||
layer.tileLayer ||
usage === 'basemap'
) {
return; return;
} }
this.updateStyleAtrribute(layer, { styleAttributeService }); this.updateStyleAtrribute(layer, { styleAttributeService });

View File

@ -33,6 +33,7 @@ export interface ILayerTileConfig {
initOptions: ISubLayerInitOptions; initOptions: ISubLayerInitOptions;
vectorTileLayer?: any; vectorTileLayer?: any;
source: ISource; source: ISource;
needListen?: boolean;
} }
export interface ITileFactory { export interface ITileFactory {

View File

@ -131,6 +131,7 @@ export default class TileFactory implements ITileFactory {
initOptions, initOptions,
vectorTileLayer, vectorTileLayer,
source, source,
needListen = true,
} = tileLayerOption; } = tileLayerOption;
const { mask, color, layerType, size, shape, usage, basemapColor, basemapSize } = initOptions; const { mask, color, layerType, size, shape, usage, basemapColor, basemapSize } = initOptions;
const FactoryTileLayer = L7Layer ? L7Layer : VectorLayer; const FactoryTileLayer = L7Layer ? L7Layer : VectorLayer;
@ -138,6 +139,7 @@ export default class TileFactory implements ITileFactory {
visible: tile.isVisible, visible: tile.isVisible,
tileOrigin: vectorTileLayer?.l7TileOrigin, tileOrigin: vectorTileLayer?.l7TileOrigin,
coord: vectorTileLayer?.l7TileCoord, coord: vectorTileLayer?.l7TileCoord,
needListen,
...this.getLayerInitOption(initOptions), ...this.getLayerInitOption(initOptions),
}); });

View File

@ -28,6 +28,7 @@ export default class VectorPolygonTile extends TileFactory {
initOptions, initOptions,
vectorTileLayer, vectorTileLayer,
source: source as Source, source: source as Source,
needListen: false
}); });
layer.once('modelLoaded', () => { layer.once('modelLoaded', () => {
tile.layerLoad(); tile.layerLoad();

View File

@ -35,7 +35,7 @@ export default class TestTile extends TileFactory {
const properties = features[0].properties; const properties = features[0].properties;
const text = new VectorLayer({ layerType: 'PointLayer', usage: 'basemap' }) const text = new VectorLayer({ layerType: 'PointLayer', usage: 'basemap', needListen: false })
.source([properties], { .source([properties], {
parser: { parser: {
type: 'json', type: 'json',
@ -52,7 +52,7 @@ export default class TestTile extends TileFactory {
strokeWidth: 2 strokeWidth: 2
}); });
const line = new VectorLayer({ layerType: 'LineLayer', usage: 'basemap' }) const line = new VectorLayer({ layerType: 'LineLayer', usage: 'basemap', needListen: false })
.source({ .source({
type: 'FeatureCollection', type: 'FeatureCollection',
features: features, features: features,

View File

@ -27,9 +27,10 @@ import polygonFillModel from '../../polygon/models/tile';
export default class VectorLayer extends BaseLayer< export default class VectorLayer extends BaseLayer<
Partial< Partial<
IPolygonLayerStyleOptions & ILineLayerStyleOptions & IPointLayerStyleOptions IPolygonLayerStyleOptions & ILineLayerStyleOptions & IPointLayerStyleOptions & {needListen: boolean;}
> >
> { > {
public needListen: boolean = true;
public isVector: boolean = true; public isVector: boolean = true;
public type: string = this.layerType as string || 'vectorLayer'; public type: string = this.layerType as string || 'vectorLayer';
// Tip: 单独被 tile 瓦片的渲染链路使用(用于优化性能) // Tip: 单独被 tile 瓦片的渲染链路使用(用于优化性能)

View File

@ -125,8 +125,8 @@ export default class BaseTileLayer implements IBaseTileLayer {
return; return;
} }
this.lastViewStates = { zoom, latLonBounds }; this.lastViewStates = { zoom, latLonBounds };
this.tilesetManager?.update(zoom, latLonBounds); this.tilesetManager?.throttleUpdate(zoom, latLonBounds);
} }
private bindTilesetEvent() { private bindTilesetEvent() {

View File

@ -324,7 +324,7 @@ export default class BaseTileLayer implements ITileLayer {
} }
this.lastViewStates = { zoom, latLonBounds }; this.lastViewStates = { zoom, latLonBounds };
this.tilesetManager?.update(zoom, latLonBounds); this.tilesetManager?.throttleUpdate(zoom, latLonBounds);
} }
private bindTilesetEvent() { private bindTilesetEvent() {

View File

@ -1,7 +1,6 @@
import { ILayer } from '@antv/l7-core';
import { Tile } from '@antv/l7-utils'; import { Tile } from '@antv/l7-utils';
import BaseTileLayer from './tileLayer/baseMapTileLayer'; import BaseTileLayer from './tileLayer/baseMapTileLayer';
import { tileAllLoad, updateLayersConfig } from './utils'; import { updateTileVisible } from './utils';
export class TMSBaseMapTileLayer extends BaseTileLayer { export class TMSBaseMapTileLayer extends BaseTileLayer {
public type: string = 'BaseMapTMS'; public type: string = 'BaseMapTMS';
@ -36,7 +35,7 @@ export class TMSBaseMapTileLayer extends BaseTileLayer {
return; return;
} }
const layers = this.tileLayerManager.getChilds(tile.layerIDList); const layers = this.tileLayerManager.getChilds(tile.layerIDList);
this.updateTileVisible(tile, layers); updateTileVisible(tile, layers, this.layerService);
} }
}); });
@ -45,21 +44,4 @@ export class TMSBaseMapTileLayer extends BaseTileLayer {
this.parent.emit('tiles-loaded', this.tilesetManager.currentTiles); this.parent.emit('tiles-loaded', this.tilesetManager.currentTiles);
} }
} }
private dispatchTileVisibleChange(tile: Tile, callback: () => void) {
if (tile.isVisible) {
callback();
} else {
tileAllLoad(tile, () => {
callback();
});
}
}
private updateTileVisible(tile: Tile, layers: ILayer[]) {
this.dispatchTileVisibleChange(tile, () => {
updateLayersConfig(layers, 'visible', tile.isVisible);
this.layerService.reRender();
});
}
} }

View File

@ -1,7 +1,6 @@
import { ILayer } from '@antv/l7-core';
import { Tile } from '@antv/l7-utils'; import { Tile } from '@antv/l7-utils';
import BaseTileLayer from './tileLayer/baseTileLayer'; import BaseTileLayer from './tileLayer/baseTileLayer';
import { tileAllLoad, updateLayersConfig } from './utils'; import { updateTileVisible } from './utils';
export class TMSTileLayer extends BaseTileLayer { export class TMSTileLayer extends BaseTileLayer {
public type: string = 'TMS'; public type: string = 'TMS';
@ -37,7 +36,7 @@ export class TMSTileLayer extends BaseTileLayer {
return; return;
} }
const layers = this.tileLayerManager.getChilds(tile.layerIDList); const layers = this.tileLayerManager.getChilds(tile.layerIDList);
this.updateTileVisible(tile, layers); updateTileVisible(tile, layers, this.layerService);
this.setPickState(layers); this.setPickState(layers);
} }
}); });
@ -47,21 +46,4 @@ export class TMSTileLayer extends BaseTileLayer {
this.parent.emit('tiles-loaded', this.tilesetManager.currentTiles); this.parent.emit('tiles-loaded', this.tilesetManager.currentTiles);
} }
} }
private dispatchTileVisibleChange(tile: Tile, callback: () => void) {
if (tile.isVisible) {
callback();
} else {
tileAllLoad(tile, () => {
callback();
});
}
}
private updateTileVisible(tile: Tile, layers: ILayer[]) {
this.dispatchTileVisibleChange(tile, () => {
updateLayersConfig(layers, 'visible', tile.isVisible);
this.layerService.reRender();
});
}
} }

View File

@ -3,6 +3,7 @@ import {
ILayer, ILayer,
IMapService, IMapService,
IRendererService, IRendererService,
ILayerService,
} from '@antv/l7-core'; } from '@antv/l7-core';
import { DOM, Tile } from '@antv/l7-utils'; import { DOM, Tile } from '@antv/l7-utils';
import { Container } from 'inversify'; import { Container } from 'inversify';
@ -180,3 +181,42 @@ export function updateLayersConfig(layers: ILayer[], key: string, value: any) {
} }
}); });
} }
function dispatchTileVisibleChange(tile: Tile, callback: () => void) {
if (tile.isVisible) {
callback();
} else {
tileAllLoad(tile, () => {
callback();
});
}
}
function updateImmediately(layers: ILayer[]) {
let immediately = true;
layers.map((layer) => {
if (layer.type !== 'PointLayer') {
immediately = false;
}
});
return immediately;
}
export function updateTileVisible(
tile: Tile,
layers: ILayer[],
layerService: ILayerService,
) {
if (layers.length === 0) return;
if (updateImmediately(layers)) {
updateLayersConfig(layers, 'visible', tile.isVisible);
layerService.reRender();
return;
}
dispatchTileVisibleChange(tile, () => {
updateLayersConfig(layers, 'visible', tile.isVisible);
layerService.reRender();
});
}

View File

@ -31,7 +31,8 @@
"earcut": "^2.1.0", "earcut": "^2.1.0",
"eventemitter3": "^4.0.0", "eventemitter3": "^4.0.0",
"gl-matrix": "^3.1.0", "gl-matrix": "^3.1.0",
"web-worker-helper": "^0.0.3" "web-worker-helper": "^0.0.3",
"lodash": "^4.17.15"
}, },
"devDependencies": { "devDependencies": {
"@types/d3-color": "^1.2.2", "@types/d3-color": "^1.2.2",

View File

@ -13,6 +13,7 @@ import {
isLatLonBoundsContains, isLatLonBoundsContains,
} from './utils/bound-buffer'; } from './utils/bound-buffer';
import { getTileIndices } from './utils/lonlat-tile'; import { getTileIndices } from './utils/lonlat-tile';
import { throttle } from 'lodash';
/** /**
* *
@ -69,6 +70,10 @@ export class TilesetManager extends EventEmitter {
this.options = { ...this.options, ...options, minZoom, maxZoom }; this.options = { ...this.options, ...options, minZoom, maxZoom };
} }
public throttleUpdate = throttle((zoom, latLonBounds) => {
this.update(zoom, latLonBounds);
}, 16);
// 更新 // 更新
// 1.瓦片序号发生改变 2.瓦片新增 3.瓦片显隐控制 // 1.瓦片序号发生改变 2.瓦片新增 3.瓦片显隐控制
public update(zoom: number, latLonBounds: [number, number, number, number]) { public update(zoom: number, latLonBounds: [number, number, number, number]) {