fix: source empty err (#1332)

* fix: 修复 featureScale 错误

* style: lint style

* fix: remove featureScalePlugin async

* fix: fix empty source bug

* style: lint style

Co-authored-by: shihui <yiqianyao.yqy@alibaba-inc.com>
This commit is contained in:
YiQianYao 2022-09-09 10:19:41 +08:00 committed by GitHub
parent 1081a15e11
commit 5225675cbe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 177 additions and 34 deletions

View File

@ -0,0 +1,2 @@
### earth
<code src="./earth.tsx"></code>

View File

@ -0,0 +1,66 @@
// @ts-ignore
import { Scene, Earth, EarthLayer } from '@antv/l7';
import React, { useEffect } from 'react';
export default () => {
useEffect(() => {
const scene = new Scene({
id: 'map',
map: new Earth({
center: [120, 30],
pitch: 0,
zoom: 3,
}),
});
const earthlayer = new EarthLayer()
.source(
'https://gw.alipayobjects.com/mdn/rms_23a451/afts/img/A*3-3NSpqRqUoAAAAAAAAAAAAAARQnAQ',
{
parser: {
type: 'image',
},
},
)
.shape('base')
.style({
globelOtions: {
ambientRatio: 0.6, // 环境光
diffuseRatio: 0.4, // 漫反射
specularRatio: 0.1, // 高光反射
// earthTime: 4.0
earthTime: 0.1,
},
})
.animate(true);
// earthlayer.setEarthTime(4.0)
const atomLayer = new EarthLayer()
.color('#2E8AE6')
.shape('atomSphere')
.style({
opacity: 1,
});
const bloomLayer = new EarthLayer().color('#fff').shape('bloomSphere');
scene.on('loaded', () => {
scene.addLayer(earthlayer);
scene.addLayer(atomLayer);
scene.addLayer(bloomLayer);
earthlayer.setEarthTime(4.0);
});
}, []);
return (
<div
id="map"
style={{
height: '500px',
position: 'relative',
}}
/>
);
};

View File

@ -0,0 +1,2 @@
### sprite
<code src="./sprite.tsx"></code>

View File

@ -0,0 +1,60 @@
// @ts-ignore
import { Scene, GeometryLayer } from '@antv/l7';
// @ts-ignore
import { GaodeMap } from '@antv/l7-maps';
import React, { useEffect } from 'react';
export default () => {
useEffect(() => {
const scene = new Scene({
id: 'map',
map: new GaodeMap({
// map: new GaodeMapV2({
// map: new Mapbox({
pitch: 40,
style: 'dark',
center: [120, 30],
zoom: 6,
}),
});
scene.on('loaded', () => {
const layer = new GeometryLayer()
// .source([{x: 0, y: 0}], {parser: {type: 'json', x: 'x', y: 'y'}})
.shape('sprite')
.size(20)
.style({
// opacity: 0.3,
mapTexture:
'https://gw.alipayobjects.com/mdn/rms_816329/afts/img/A*zLQwQKBSagYAAAAAAAAAAAAAARQnAQ', // snow
// mapTexture: 'https://gw.alipayobjects.com/mdn/rms_816329/afts/img/A*w2SFSZJp4nIAAAAAAAAAAAAAARQnAQ', // rain
// mapTexture: 'https://gw.alipayobjects.com/mdn/rms_816329/afts/img/A*bq1cS7ADjR4AAAAAAAAAAAAAARQnAQ', // blub
center: [120, 30],
// spriteAnimate: 'up',
spriteCount: 60,
spriteRadius: 10,
spriteTop: 2500000,
spriteUpdate: 10000,
spriteScale: 0.8,
// spriteTop: 1000,
// spriteUpdate: 5,
// spriteBottom: -10,
// spriteScale: 0.6,
})
.active(true)
.color('#f00');
scene.addLayer(layer);
});
}, []);
return (
<div
id="map"
style={{
height: '500px',
position: 'relative',
}}
/>
);
};

View File

@ -269,6 +269,7 @@ export interface ILayer {
data: any[],
options: ISourceCFG | undefined,
},
encodeDataLength: number;
pickedFeatureID: number | null;
hooks: {
init: SyncBailHook;

View File

@ -6,6 +6,16 @@ export default class GeometryLayer extends BaseLayer<
IGeometryLayerStyleOptions
> {
public type: string = 'GeometryLayer';
public defaultSourceConfig = {
data: [{ x: 0, y: 0 }],
options: {
parser: {
type: 'json',
x: 'x',
y: 'y',
},
},
};
public buildModels() {
const modelType = this.getModelType();
this.layerModel = new GeometryModels[modelType](this);

View File

@ -77,6 +77,7 @@ export default class BaseLayer<ChildLayerStyleOptions = {}>
public selectedFeatureID: number | null = null;
public styleNeedUpdate: boolean = false;
public rendering: boolean;
public forceRender: boolean = false;
public clusterZoom: number = 0; // 聚合等级标记
public layerType?: string | undefined;
public triangulation?: Triangulation | undefined;
@ -84,7 +85,7 @@ export default class BaseLayer<ChildLayerStyleOptions = {}>
public defaultSourceConfig: {
data: any[];
options: ISourceCFG | undefined;
}={
} = {
data: [],
options: {
parser: {
@ -93,7 +94,6 @@ export default class BaseLayer<ChildLayerStyleOptions = {}>
},
};
public dataState: IDataState = {
dataSourceNeedUpdate: false,
dataMappingNeedUpdate: false,
@ -696,10 +696,9 @@ export default class BaseLayer<ChildLayerStyleOptions = {}>
this.tileLayer.render();
return this;
}
// TODO: this.getEncodedData().length !== 0 这个判断是为了解决在 2.5.x 引入数据纹理后产生的 空数据渲染导致 texture 超出上限问题
if (this.getEncodedData() && this.getEncodedData().length !== 0) {
this.renderModels();
}
if (this.encodeDataLength <= 0 && !this.forceRender) return this;
// Tip: this.getEncodedData().length !== 0 这个判断是为了解决在 2.5.x 引入数据纹理后产生的 空数据渲染导致 texture 超出上限问题
this.renderModels();
return this;
}
@ -707,16 +706,15 @@ export default class BaseLayer<ChildLayerStyleOptions = {}>
* renderMultiPass multipass layer
*/
public async renderMultiPass() {
if (this.getEncodedData() && this.getEncodedData().length !== 0) {
if (this.multiPassRenderer && this.multiPassRenderer.getRenderFlag()) {
// multi render 开始执行 multiPassRender 的渲染流程
await this.multiPassRenderer.render();
} else if (this.multiPassRenderer) {
// renderPass 触发的渲染
this.renderModels();
} else {
this.renderModels();
}
if (this.encodeDataLength <= 0 && !this.forceRender) return;
if (this.multiPassRenderer && this.multiPassRenderer.getRenderFlag()) {
// multi render 开始执行 multiPassRender 的渲染流程
await this.multiPassRenderer.render();
} else if (this.multiPassRenderer) {
// renderPass 触发的渲染
this.renderModels();
} else {
this.renderModels();
}
}
@ -1078,8 +1076,10 @@ export default class BaseLayer<ChildLayerStyleOptions = {}>
return this.scaleOptions;
}
public encodeDataLength: number = 0;
public setEncodedData(encodedData: IEncodeFeature[]) {
this.encodedData = encodedData;
this.encodeDataLength = encodedData.length;
}
public getEncodedData() {
return this.encodedData;
@ -1294,27 +1294,27 @@ export default class BaseLayer<ChildLayerStyleOptions = {}>
public renderModels(isPicking?: boolean) {
// TODO: this.getEncodedData().length > 0 这个判断是为了解决在 2.5.x 引入数据纹理后产生的 空数据渲染导致 texture 超出上限问题
if (this.getEncodedData() && this.getEncodedData().length > 0) {
if (this.layerModelNeedUpdate && this.layerModel) {
this.layerModel.buildModels((models: IModel[]) => {
this.models = models;
this.hooks.beforeRender.call();
this.layerModelNeedUpdate = false;
});
}
if (this?.layerModel?.renderUpdate) {
this.layerModel.renderUpdate();
}
if (this.encodeDataLength <= 0 && !this.forceRender) return this;
this.models.forEach((model) => {
model.draw(
{
uniforms: this.layerModel.getUninforms(),
},
isPicking,
);
if (this.layerModelNeedUpdate && this.layerModel) {
this.layerModel.buildModels((models: IModel[]) => {
this.models = models;
this.hooks.beforeRender.call();
this.layerModelNeedUpdate = false;
});
}
if (this?.layerModel?.renderUpdate) {
this.layerModel.renderUpdate();
}
this.models.forEach((model) => {
model.draw(
{
uniforms: this.layerModel.getUninforms(),
},
isPicking,
);
});
return this;
}

View File

@ -39,6 +39,7 @@ export default class ThreeJSLayer
},
},
};
public forceRender: boolean = true;
public setUpdate(callback: () => void) {
this.update = callback;
@ -168,6 +169,7 @@ export default class ThreeJSLayer
}
}
public renderModels() {
if (!this.threeRenderService) return this;
if (this.isUpdate && this.update) {
this.update();
}