mirror of https://gitee.com/antv-l7/antv-l7
Merge branch 'master' of https://github.com/antvis/L7
This commit is contained in:
commit
e0757ed868
|
@ -140,7 +140,14 @@ export default class PickingService implements IPickingService {
|
||||||
return features;
|
return features;
|
||||||
}
|
}
|
||||||
private async pickingAllLayer(target: IInteractionTarget) {
|
private async pickingAllLayer(target: IInteractionTarget) {
|
||||||
if (this.alreadyInPicking || this.layerService.alreadyInRendering) {
|
if (
|
||||||
|
// TODO: this.alreadyInPicking 避免多次重复拾取
|
||||||
|
this.alreadyInPicking ||
|
||||||
|
// TODO: this.layerService.alreadyInRendering 一个渲染序列中只进行一次拾取操作
|
||||||
|
this.layerService.alreadyInRendering ||
|
||||||
|
// TODO: this.layerService.isMapDragging() 如果地图正在拖拽 则不进行拾取操作
|
||||||
|
this.layerService.isMapDragging()
|
||||||
|
) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.alreadyInPicking = true;
|
this.alreadyInPicking = true;
|
||||||
|
|
|
@ -384,5 +384,6 @@ export interface ILayerService {
|
||||||
updateRenderOrder(): void;
|
updateRenderOrder(): void;
|
||||||
renderLayers(type?: string): void;
|
renderLayers(type?: string): void;
|
||||||
getOESTextureFloat(): boolean;
|
getOESTextureFloat(): boolean;
|
||||||
|
isMapDragging(): boolean;
|
||||||
destroy(): void;
|
destroy(): void;
|
||||||
}
|
}
|
||||||
|
|
|
@ -162,6 +162,16 @@ export default class LayerService implements ILayerService {
|
||||||
return this.renderService.extensionObject.OES_texture_float;
|
return this.renderService.extensionObject.OES_texture_float;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: 判断地图是否正在被拖动
|
||||||
|
public isMapDragging() {
|
||||||
|
return this.mapService.dragging;
|
||||||
|
}
|
||||||
|
|
||||||
|
private runRender() {
|
||||||
|
this.renderLayers();
|
||||||
|
this.layerRenderID = requestAnimationFrame(this.runRender.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
// 渲染检测
|
// 渲染检测
|
||||||
private renderTest(renderType: string | undefined): boolean {
|
private renderTest(renderType: string | undefined): boolean {
|
||||||
const now = new Date().getTime();
|
const now = new Date().getTime();
|
||||||
|
@ -174,8 +184,9 @@ export default class LayerService implements ILayerService {
|
||||||
if (renderType) {
|
if (renderType) {
|
||||||
switch (renderType) {
|
switch (renderType) {
|
||||||
case 'picking':
|
case 'picking':
|
||||||
|
// return false;
|
||||||
// TODO: picking 类型的渲染事件
|
// TODO: picking 类型的渲染事件
|
||||||
// 若是上次触发为地图或动画触发的渲染,则认为是地图事件与拾取事件在同时触发,放弃此次渲染
|
// 若是上次触发为地图触发的渲染,则认为是地图事件与拾取事件在同时触发,放弃此次渲染
|
||||||
if (
|
if (
|
||||||
this.lastRenderType === 'mapRender' ||
|
this.lastRenderType === 'mapRender' ||
|
||||||
this.lastRenderType === 'animate'
|
this.lastRenderType === 'animate'
|
||||||
|
@ -192,6 +203,7 @@ export default class LayerService implements ILayerService {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case 'animate':
|
case 'animate':
|
||||||
|
// return false;
|
||||||
if (this.lastRenderType === 'mapRender') {
|
if (this.lastRenderType === 'mapRender') {
|
||||||
this.lastRenderType = 'animate';
|
this.lastRenderType = 'animate';
|
||||||
return false;
|
return false;
|
||||||
|
@ -225,11 +237,6 @@ export default class LayerService implements ILayerService {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private runRender() {
|
|
||||||
this.renderLayers('animate');
|
|
||||||
this.layerRenderID = requestAnimationFrame(this.runRender.bind(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
private stopRender() {
|
private stopRender() {
|
||||||
cancelAnimationFrame(this.layerRenderID);
|
cancelAnimationFrame(this.layerRenderID);
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@ export interface IMapWrapper {
|
||||||
export interface IMapService<RawMap = {}> {
|
export interface IMapService<RawMap = {}> {
|
||||||
version?: string;
|
version?: string;
|
||||||
map: RawMap;
|
map: RawMap;
|
||||||
|
dragging: boolean;
|
||||||
bgColor: string;
|
bgColor: string;
|
||||||
setBgColor(color: string): void;
|
setBgColor(color: string): void;
|
||||||
init(): void;
|
init(): void;
|
||||||
|
|
|
@ -31,6 +31,7 @@ export default class LineLayer extends BaseLayer<ILineLayerStyleOptions> {
|
||||||
line: {},
|
line: {},
|
||||||
arc3d: { blend: 'additive' },
|
arc3d: { blend: 'additive' },
|
||||||
arc: { blend: 'additive' },
|
arc: { blend: 'additive' },
|
||||||
|
arcmini: { blend: 'additive' },
|
||||||
greatcircle: { blend: 'additive' },
|
greatcircle: { blend: 'additive' },
|
||||||
};
|
};
|
||||||
return defaultConfig[type];
|
return defaultConfig[type];
|
||||||
|
|
|
@ -0,0 +1,134 @@
|
||||||
|
import {
|
||||||
|
AttributeType,
|
||||||
|
gl,
|
||||||
|
IAnimateOption,
|
||||||
|
IEncodeFeature,
|
||||||
|
ILayerConfig,
|
||||||
|
IModel,
|
||||||
|
IModelUniform,
|
||||||
|
} from '@antv/l7-core';
|
||||||
|
|
||||||
|
import { rgb2arr } from '@antv/l7-utils';
|
||||||
|
import { isNumber } from 'lodash';
|
||||||
|
import BaseModel from '../../core/BaseModel';
|
||||||
|
import { ILineLayerStyleOptions } from '../../core/interface';
|
||||||
|
import { LineArcTriangulation } from '../../core/triangulation';
|
||||||
|
import line_arcmini_frag from '../shaders/line_arcmini_frag.glsl';
|
||||||
|
import line_arcmini_vert from '../shaders/line_arcmini_vert.glsl';
|
||||||
|
|
||||||
|
export default class ArcMiniModel extends BaseModel {
|
||||||
|
public getUninforms(): IModelUniform {
|
||||||
|
const {
|
||||||
|
opacity,
|
||||||
|
sourceColor,
|
||||||
|
targetColor,
|
||||||
|
forward = true,
|
||||||
|
segmentNumber = 30,
|
||||||
|
thetaOffset = 0.314,
|
||||||
|
} = this.layer.getLayerConfig() as ILineLayerStyleOptions;
|
||||||
|
|
||||||
|
// 转化渐变色
|
||||||
|
let useLinearColor = 0; // 默认不生效
|
||||||
|
let sourceColorArr = [0, 0, 0, 0];
|
||||||
|
let targetColorArr = [0, 0, 0, 0];
|
||||||
|
if (sourceColor && targetColor) {
|
||||||
|
sourceColorArr = rgb2arr(sourceColor);
|
||||||
|
targetColorArr = rgb2arr(targetColor);
|
||||||
|
useLinearColor = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
u_thetaOffset: thetaOffset,
|
||||||
|
|
||||||
|
u_opacity: isNumber(opacity) ? opacity : 1.0,
|
||||||
|
|
||||||
|
segmentNumber,
|
||||||
|
u_blur: 0.9,
|
||||||
|
u_lineDir: forward ? 1 : -1,
|
||||||
|
|
||||||
|
// 渐变色支持参数
|
||||||
|
u_linearColor: useLinearColor,
|
||||||
|
u_sourceColor: sourceColorArr,
|
||||||
|
u_targetColor: targetColorArr,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public getAnimateUniforms(): IModelUniform {
|
||||||
|
const { animateOption } = this.layer.getLayerConfig() as ILayerConfig;
|
||||||
|
return {
|
||||||
|
u_aimate: this.animateOption2Array(animateOption as IAnimateOption),
|
||||||
|
u_time: this.layer.getLayerAnimateTime(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public initModels(): IModel[] {
|
||||||
|
return this.buildModels();
|
||||||
|
}
|
||||||
|
|
||||||
|
public buildModels(): IModel[] {
|
||||||
|
const {
|
||||||
|
segmentNumber = 30,
|
||||||
|
} = this.layer.getLayerConfig() as ILineLayerStyleOptions;
|
||||||
|
|
||||||
|
return [
|
||||||
|
this.layer.buildLayerModel({
|
||||||
|
moduleName: 'arc2dminiline',
|
||||||
|
vertexShader: line_arcmini_vert,
|
||||||
|
fragmentShader: line_arcmini_frag,
|
||||||
|
triangulation: LineArcTriangulation,
|
||||||
|
depth: { enable: false },
|
||||||
|
blend: this.getBlend(),
|
||||||
|
segmentNumber,
|
||||||
|
}),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
protected registerBuiltinAttributes() {
|
||||||
|
// point layer size;
|
||||||
|
this.styleAttributeService.registerStyleAttribute({
|
||||||
|
name: 'size',
|
||||||
|
type: AttributeType.Attribute,
|
||||||
|
descriptor: {
|
||||||
|
name: 'a_Size',
|
||||||
|
buffer: {
|
||||||
|
// give the WebGL driver a hint that this buffer may change
|
||||||
|
usage: gl.DYNAMIC_DRAW,
|
||||||
|
data: [],
|
||||||
|
type: gl.FLOAT,
|
||||||
|
},
|
||||||
|
size: 1,
|
||||||
|
update: (
|
||||||
|
feature: IEncodeFeature,
|
||||||
|
featureIdx: number,
|
||||||
|
vertex: number[],
|
||||||
|
attributeIdx: number,
|
||||||
|
) => {
|
||||||
|
const { size = 1 } = feature;
|
||||||
|
return Array.isArray(size) ? [size[0]] : [size as number];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
this.styleAttributeService.registerStyleAttribute({
|
||||||
|
name: 'instance', // 弧线起始点信息
|
||||||
|
type: AttributeType.Attribute,
|
||||||
|
descriptor: {
|
||||||
|
name: 'a_Instance',
|
||||||
|
buffer: {
|
||||||
|
usage: gl.STATIC_DRAW,
|
||||||
|
data: [],
|
||||||
|
type: gl.FLOAT,
|
||||||
|
},
|
||||||
|
size: 4,
|
||||||
|
update: (
|
||||||
|
feature: IEncodeFeature,
|
||||||
|
featureIdx: number,
|
||||||
|
vertex: number[],
|
||||||
|
attributeIdx: number,
|
||||||
|
) => {
|
||||||
|
return [vertex[3], vertex[4], vertex[5], vertex[6]];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,12 +1,19 @@
|
||||||
import ArcModel from './arc';
|
import ArcModel from './arc';
|
||||||
import Arc3DModel from './arc_3d';
|
import Arc3DModel from './arc_3d';
|
||||||
|
import ArcMiniModel from './arcmini';
|
||||||
import GreatCircleModel from './great_circle';
|
import GreatCircleModel from './great_circle';
|
||||||
import LineModel from './line';
|
import LineModel from './line';
|
||||||
|
|
||||||
export type LineModelType = 'arc' | 'arc3d' | 'greatcircle' | 'line';
|
export type LineModelType =
|
||||||
|
| 'arc'
|
||||||
|
| 'arcmini'
|
||||||
|
| 'arc3d'
|
||||||
|
| 'greatcircle'
|
||||||
|
| 'line';
|
||||||
|
|
||||||
const LineModels: { [key in LineModelType]: any } = {
|
const LineModels: { [key in LineModelType]: any } = {
|
||||||
arc: ArcModel,
|
arc: ArcModel,
|
||||||
|
arcmini: ArcMiniModel,
|
||||||
arc3d: Arc3DModel,
|
arc3d: Arc3DModel,
|
||||||
greatcircle: GreatCircleModel,
|
greatcircle: GreatCircleModel,
|
||||||
line: LineModel,
|
line: LineModel,
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
#define LineTypeSolid 0.0
|
||||||
|
#define Animate 0.0
|
||||||
|
|
||||||
|
uniform float u_opacity;
|
||||||
|
uniform float u_blur : 0.9;
|
||||||
|
// varying vec2 v_normal;
|
||||||
|
varying vec4 v_color;
|
||||||
|
|
||||||
|
uniform float u_time;
|
||||||
|
uniform vec4 u_aimate: [ 0, 2., 1.0, 0.2 ];
|
||||||
|
|
||||||
|
uniform float segmentNumber;
|
||||||
|
varying float v_distance_ratio;
|
||||||
|
|
||||||
|
uniform float u_linearColor: 0;
|
||||||
|
uniform vec4 u_sourceColor;
|
||||||
|
uniform vec4 u_targetColor;
|
||||||
|
|
||||||
|
#pragma include "picking"
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
|
||||||
|
// 设置弧线的底色
|
||||||
|
if(u_linearColor == 1.0) { // 使用渐变颜色
|
||||||
|
gl_FragColor = mix(u_sourceColor, u_targetColor, v_distance_ratio);
|
||||||
|
} else { // 使用 color 方法传入的颜色
|
||||||
|
gl_FragColor = v_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
gl_FragColor.a *= u_opacity;
|
||||||
|
|
||||||
|
if(u_aimate.x == Animate) {
|
||||||
|
float animateSpeed = u_time / u_aimate.y; // 运动速度
|
||||||
|
float alpha =1.0 - fract( mod(1.0- v_distance_ratio, u_aimate.z)* (1.0/ u_aimate.z) + u_time / u_aimate.y);
|
||||||
|
alpha = (alpha + u_aimate.w -1.0) / u_aimate.w;
|
||||||
|
// alpha = smoothstep(0., 1., alpha);
|
||||||
|
alpha = clamp(alpha, 0.0, 1.0);
|
||||||
|
gl_FragColor.a *= alpha;
|
||||||
|
}
|
||||||
|
gl_FragColor = filterColor(gl_FragColor);
|
||||||
|
}
|
|
@ -0,0 +1,105 @@
|
||||||
|
#define LineTypeSolid 0.0
|
||||||
|
#define LineTypeDash 1.0
|
||||||
|
#define Animate 0.0
|
||||||
|
|
||||||
|
attribute vec4 a_Color;
|
||||||
|
attribute vec3 a_Position;
|
||||||
|
attribute vec4 a_Instance;
|
||||||
|
attribute float a_Size;
|
||||||
|
uniform mat4 u_ModelMatrix;
|
||||||
|
uniform mat4 u_Mvp;
|
||||||
|
uniform float segmentNumber;
|
||||||
|
uniform vec4 u_aimate: [ 0, 2., 1.0, 0.2 ];
|
||||||
|
varying vec4 v_color;
|
||||||
|
// varying vec2 v_normal;
|
||||||
|
|
||||||
|
uniform float u_lineDir: 1.0;
|
||||||
|
|
||||||
|
// 偏移量
|
||||||
|
uniform float u_thetaOffset: 0.314;
|
||||||
|
|
||||||
|
uniform float u_opacity: 1.0;
|
||||||
|
varying float v_distance_ratio;
|
||||||
|
|
||||||
|
#pragma include "projection"
|
||||||
|
#pragma include "project"
|
||||||
|
#pragma include "picking"
|
||||||
|
|
||||||
|
float bezier3(vec3 arr, float t) {
|
||||||
|
float ut = 1. - t;
|
||||||
|
return (arr.x * ut + arr.y * t) * ut + (arr.y * ut + arr.z * t) * t;
|
||||||
|
}
|
||||||
|
vec2 midPoint(vec2 source, vec2 target) {
|
||||||
|
vec2 center = target - source;
|
||||||
|
float r = length(center);
|
||||||
|
float theta = atan(center.y, center.x);
|
||||||
|
float thetaOffset = u_thetaOffset;
|
||||||
|
float r2 = r / 2.0 / cos(thetaOffset);
|
||||||
|
float theta2 = theta + thetaOffset;
|
||||||
|
vec2 mid = vec2(r2*cos(theta2) + source.x, r2*sin(theta2) + source.y);
|
||||||
|
if(u_lineDir == 1.0) { // 正向
|
||||||
|
return mid;
|
||||||
|
} else { // 逆向
|
||||||
|
// (mid + vmin)/2 = (s + t)/2
|
||||||
|
vec2 vmid = source + target - mid;
|
||||||
|
return vmid;
|
||||||
|
}
|
||||||
|
// return mid;
|
||||||
|
}
|
||||||
|
float getSegmentRatio(float index) {
|
||||||
|
return smoothstep(0.0, 1.0, index / (segmentNumber - 1.));
|
||||||
|
}
|
||||||
|
vec2 interpolate (vec2 source, vec2 target, float t) {
|
||||||
|
// if the angularDist is PI, linear interpolation is applied. otherwise, use spherical interpolation
|
||||||
|
vec2 mid = midPoint(source, target);
|
||||||
|
vec3 x = vec3(source.x, mid.x, target.x);
|
||||||
|
vec3 y = vec3(source.y, mid.y, target.y);
|
||||||
|
return vec2(bezier3(x ,t), bezier3(y,t));
|
||||||
|
}
|
||||||
|
vec2 getExtrusionOffset(vec2 line_clipspace, float offset_direction) {
|
||||||
|
// normalized direction of the line
|
||||||
|
vec2 dir_screenspace = normalize(line_clipspace);
|
||||||
|
// rotate by 90 degrees
|
||||||
|
dir_screenspace = vec2(-dir_screenspace.y, dir_screenspace.x);
|
||||||
|
vec2 offset = dir_screenspace * offset_direction * setPickingSize(a_Size) / 2.0;
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
vec2 getNormal(vec2 line_clipspace, float offset_direction) {
|
||||||
|
// normalized direction of the line
|
||||||
|
vec2 dir_screenspace = normalize(line_clipspace);
|
||||||
|
// rotate by 90 degrees
|
||||||
|
dir_screenspace = vec2(-dir_screenspace.y, dir_screenspace.x);
|
||||||
|
return reverse_offset_normal(vec3(dir_screenspace,1.0)).xy * sign(offset_direction);
|
||||||
|
}
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
v_color = a_Color;
|
||||||
|
|
||||||
|
vec2 source = a_Instance.rg; // 起始点
|
||||||
|
vec2 target = a_Instance.ba; // 终点
|
||||||
|
float segmentIndex = a_Position.x;
|
||||||
|
float segmentRatio = getSegmentRatio(segmentIndex);
|
||||||
|
|
||||||
|
float indexDir = mix(-1.0, 1.0, step(segmentIndex, 0.0));
|
||||||
|
float nextSegmentRatio = getSegmentRatio(segmentIndex + indexDir);
|
||||||
|
|
||||||
|
v_distance_ratio = segmentIndex / segmentNumber;
|
||||||
|
|
||||||
|
if(u_aimate.x == Animate && u_lineDir != 1.0) {
|
||||||
|
v_distance_ratio = 1.0 - v_distance_ratio;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec4 curr = project_position(vec4(interpolate(source, target, segmentRatio), 0.0, 1.0));
|
||||||
|
vec4 next = project_position(vec4(interpolate(source, target, nextSegmentRatio), 0.0, 1.0));
|
||||||
|
// v_normal = getNormal((next.xy - curr.xy) * indexDir, a_Position.y);
|
||||||
|
//unProjCustomCoord
|
||||||
|
|
||||||
|
vec2 offset = project_pixel(getExtrusionOffset((next.xy - curr.xy) * indexDir, a_Position.y));
|
||||||
|
|
||||||
|
if(u_CoordinateSystem == COORDINATE_SYSTEM_P20_2) { // gaode2.x
|
||||||
|
gl_Position = u_Mvp * (vec4(curr.xy + offset, 0, 1.0));
|
||||||
|
} else {
|
||||||
|
gl_Position = project_common_position_to_clipspace(vec4(curr.xy + offset, 0, 1.0));
|
||||||
|
}
|
||||||
|
setPickingColor(a_PickingColor);
|
||||||
|
}
|
|
@ -61,6 +61,9 @@ export default class AMapService
|
||||||
*/
|
*/
|
||||||
public map: AMap.Map & IAMapInstance;
|
public map: AMap.Map & IAMapInstance;
|
||||||
|
|
||||||
|
// TODO: 判断地图是否正在拖拽
|
||||||
|
public dragging: boolean = false;
|
||||||
|
|
||||||
// 背景色
|
// 背景色
|
||||||
public bgColor: string = 'rgba(0, 0, 0, 0)';
|
public bgColor: string = 'rgba(0, 0, 0, 0)';
|
||||||
|
|
||||||
|
@ -403,6 +406,16 @@ export default class AMapService
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// TODO: 判断地图是否正在被拖拽
|
||||||
|
this.map.on('dragstart', () => {
|
||||||
|
this.dragging = true;
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
this.map.on('dragend', () => {
|
||||||
|
this.dragging = false;
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
this.viewport = new Viewport();
|
this.viewport = new Viewport();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -64,6 +64,9 @@ export default class AMapService
|
||||||
*/
|
*/
|
||||||
public map: AMap.Map & IAMapInstance;
|
public map: AMap.Map & IAMapInstance;
|
||||||
|
|
||||||
|
// TODO: 判断地图是否正在拖拽
|
||||||
|
public dragging: boolean = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用于 customCooords 数据的计算
|
* 用于 customCooords 数据的计算
|
||||||
*/
|
*/
|
||||||
|
@ -494,6 +497,16 @@ export default class AMapService
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// TODO: 判断地图是否正在被拖拽
|
||||||
|
this.map.on('dragstart', () => {
|
||||||
|
this.dragging = true;
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
this.map.on('dragend', () => {
|
||||||
|
this.dragging = false;
|
||||||
|
return '';
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public exportMap(type: 'jpg' | 'png'): string {
|
public exportMap(type: 'jpg' | 'png'): string {
|
||||||
|
|
|
@ -42,6 +42,9 @@ export default class L7EarthService implements IEarthService<Map> {
|
||||||
public version: string = Version.GLOBEL;
|
public version: string = Version.GLOBEL;
|
||||||
public map: Map;
|
public map: Map;
|
||||||
|
|
||||||
|
// TODO: 判断地图是否正在拖拽
|
||||||
|
public dragging: boolean = false;
|
||||||
|
|
||||||
// 背景色
|
// 背景色
|
||||||
public bgColor: string = '#000';
|
public bgColor: string = '#000';
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,9 @@ export default class L7MapService implements IMapService<Map> {
|
||||||
public version: string = Version.L7MAP;
|
public version: string = Version.L7MAP;
|
||||||
public map: Map;
|
public map: Map;
|
||||||
|
|
||||||
|
// TODO: 判断地图是否正在拖拽
|
||||||
|
public dragging: boolean = false;
|
||||||
|
|
||||||
// 背景色
|
// 背景色
|
||||||
public bgColor: string = 'rgba(0.0, 0.0, 0.0, 0.0)';
|
public bgColor: string = 'rgba(0.0, 0.0, 0.0, 0.0)';
|
||||||
|
|
||||||
|
@ -280,6 +283,16 @@ export default class L7MapService implements IMapService<Map> {
|
||||||
this.map.on('load', this.handleCameraChanged);
|
this.map.on('load', this.handleCameraChanged);
|
||||||
this.map.on('move', this.handleCameraChanged);
|
this.map.on('move', this.handleCameraChanged);
|
||||||
|
|
||||||
|
// TODO: 判断地图是否正在被拖拽
|
||||||
|
this.map.on('dragstart', () => {
|
||||||
|
this.dragging = true;
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
this.map.on('dragend', () => {
|
||||||
|
this.dragging = false;
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
// 不同于高德地图,需要手动触发首次渲染
|
// 不同于高德地图,需要手动触发首次渲染
|
||||||
this.handleCameraChanged();
|
this.handleCameraChanged();
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,6 +50,9 @@ export default class MapboxService
|
||||||
public version: string = Version.MAPBOX;
|
public version: string = Version.MAPBOX;
|
||||||
public map: Map & IMapboxInstance;
|
public map: Map & IMapboxInstance;
|
||||||
|
|
||||||
|
// TODO: 判断地图是否正在拖拽
|
||||||
|
public dragging: boolean = false;
|
||||||
|
|
||||||
// 背景色
|
// 背景色
|
||||||
public bgColor: string = 'rgba(0.0, 0.0, 0.0, 0.0)';
|
public bgColor: string = 'rgba(0.0, 0.0, 0.0, 0.0)';
|
||||||
|
|
||||||
|
@ -363,6 +366,16 @@ export default class MapboxService
|
||||||
this.map.on('load', this.handleCameraChanged);
|
this.map.on('load', this.handleCameraChanged);
|
||||||
this.map.on('move', this.handleCameraChanged);
|
this.map.on('move', this.handleCameraChanged);
|
||||||
|
|
||||||
|
// TODO: 判断地图是否正在被拖拽
|
||||||
|
this.map.on('dragstart', () => {
|
||||||
|
this.dragging = true;
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
this.map.on('dragend', () => {
|
||||||
|
this.dragging = false;
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
// 不同于高德地图,需要手动触发首次渲染
|
// 不同于高德地图,需要手动触发首次渲染
|
||||||
this.handleCameraChanged();
|
this.handleCameraChanged();
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
// @ts-nocheck
|
||||||
|
// @ts-ignore
|
||||||
|
import { Scene } from '@antv/l7';
|
||||||
|
import { PointLayer, LineLayer } from '@antv/l7-layers';
|
||||||
|
import { GaodeMap, Mapbox } from '@antv/l7-maps';
|
||||||
|
import * as React from 'react';
|
||||||
|
|
||||||
|
export default class PointTest extends React.Component {
|
||||||
|
private scene: Scene;
|
||||||
|
|
||||||
|
public componentWillUnmount() {
|
||||||
|
this.scene.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async componentDidMount() {
|
||||||
|
const scene = new Scene({
|
||||||
|
id: 'map',
|
||||||
|
map: new GaodeMap({
|
||||||
|
center: [110.19382669582967, 30.258134],
|
||||||
|
pitch: 0,
|
||||||
|
zoom: 4,
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
let address =
|
||||||
|
'https://gw.alipayobjects.com/os/bmw-prod/3f2f9284-3fb1-4838-8baa-6ffd06738fcd.csv';
|
||||||
|
fetch(address)
|
||||||
|
.then((res) => res.text())
|
||||||
|
.then((data) => {
|
||||||
|
const lineLayer = new LineLayer({
|
||||||
|
autoFit: true,
|
||||||
|
blend: 'normal',
|
||||||
|
})
|
||||||
|
.source(data, {
|
||||||
|
parser: {
|
||||||
|
type: 'csv',
|
||||||
|
x: 'f_lon',
|
||||||
|
y: 'f_lat',
|
||||||
|
x1: 't_lon',
|
||||||
|
y1: 't_lat',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.shape('arcmini')
|
||||||
|
.size(2)
|
||||||
|
.color('rgb(13,64,140)')
|
||||||
|
.style({
|
||||||
|
segmentNumber: 30,
|
||||||
|
})
|
||||||
|
.select({
|
||||||
|
color: '#ff0',
|
||||||
|
})
|
||||||
|
.active({
|
||||||
|
color: '#ff0',
|
||||||
|
});
|
||||||
|
// .animate(true)
|
||||||
|
|
||||||
|
scene.addLayer(lineLayer);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public render() {
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
id="map"
|
||||||
|
style={{
|
||||||
|
position: 'absolute',
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
right: 0,
|
||||||
|
bottom: 0,
|
||||||
|
}}
|
||||||
|
></div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,3 +1,4 @@
|
||||||
|
// @ts-nocheck
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
import { Scene } from '@antv/l7';
|
import { Scene } from '@antv/l7';
|
||||||
import { PointLayer } from '@antv/l7-layers';
|
import { PointLayer } from '@antv/l7-layers';
|
||||||
|
@ -169,32 +170,6 @@ export default class PointTest extends React.Component {
|
||||||
|
|
||||||
scene.on('loaded', () => {
|
scene.on('loaded', () => {
|
||||||
scene.addLayer(layer);
|
scene.addLayer(layer);
|
||||||
// @ts-ignore
|
|
||||||
// layer.layerService.startAnimate2(stats)
|
|
||||||
|
|
||||||
// ILayerService
|
|
||||||
// ---
|
|
||||||
// startAnimate2(state: any): void;
|
|
||||||
// ---
|
|
||||||
// LayerService
|
|
||||||
// ---
|
|
||||||
// private stats: any;
|
|
||||||
// ---
|
|
||||||
// @ts-ignore
|
|
||||||
// public startAnimate2(stats) {
|
|
||||||
// // @ts-ignore
|
|
||||||
// this.stats = stats
|
|
||||||
// if (this.animateInstanceCount++ === 0) {
|
|
||||||
// this.clock.start();
|
|
||||||
// this.runRender();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// public runRender() {
|
|
||||||
// // @ts-ignore
|
|
||||||
// this.stats.update()
|
|
||||||
// this.renderLayers();
|
|
||||||
// this.layerRenderID = requestAnimationFrame(this.runRender.bind(this));
|
|
||||||
// }
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,8 @@ import { storiesOf } from '@storybook/react';
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
|
|
||||||
import PointTest from './components/Map';
|
import PointTest from './components/Map';
|
||||||
|
import BigLine from './components/BigLine'
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
storiesOf('地图性能检测', module)
|
storiesOf('地图性能检测', module)
|
||||||
.add('点', () => <PointTest />)
|
.add('点', () => <PointTest />)
|
||||||
|
.add('BigLine', () => <BigLine />)
|
||||||
|
|
Loading…
Reference in New Issue