Skip to content

Commit ea11251

Browse files
committed
refactor(layers): extract LayerRelativeCoords (stage-1 1.4)
1 parent 1c07545 commit ea11251

4 files changed

Lines changed: 116 additions & 27 deletions

File tree

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
---
2+
'@antv/l7-layers': patch
3+
---
4+
5+
refactor(layers): extract LayerRelativeCoords (stage-1 1.4)
6+
7+
P4 阶段 1 第三刀(1.4,对外透明 delegate,零 API/行为变更)。
8+
9+
从 BaseLayer 抽出相对坐标状态与转换 delegate `core/LayerRelativeCoords.ts`
10+
收口 3 个原 protected 字段(`relativeOrigin` / `originalExtent` /
11+
`absoluteDataArray`)与 4 个方法:`processRelativeCoordinates`(原 protected,
12+
自我触发,init / setData 钩子调用)、`getAbsoluteData` / `getRelativeOrigin` /
13+
`getOriginalExtent`(public getter)。
14+
15+
BaseLayer 保留全部对外签名作为薄转发:`processRelativeCoordinates` 保留
16+
protected 自调用(内部 call site 不变),3 getter 转发到 delegate。
17+
`processRelativeCoordinates` 核心逻辑字节级镜像原实现——读 `getLayerConfig`
18+
`enableRelativeCoordinates`(经 `(layerConfig as any)?.` 兼容字段不在类型上),
19+
经公开 `getSource()` 读写 `source.data.dataArray`(同引用,mutation 生效),
20+
不跨类直访 protected `layerSource`
21+
22+
3 字段原 protected、外部全走 ILayer getter 访问(grep 已确认无一字段直读),
23+
搬入 delegate 安全。`@antv/l7-utils``processRelativeCoordinates` 函数
24+
import 从 BaseLayer 上移至 delegate(阶段 0 已就绪,不跨包)。
25+
26+
验证:eslint 0 error、prettier 通过、layers father build 275 files(含
27+
declaration d.ts 类型检查)、jest layers+maps 76 suites/653 passed。

docs/refactoring/layers/PLAN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ citybuilding/ geometry/ — 12 个具体图层 extends BaseLayer(各自只 ove
7272
| 1.1 | `LayerStyleFluent` | 流式 API(`color/size/shape/texture/rotate/filter/label/style/scale/animate/active/select``return this`)+ `pendingStyleAttributes` 注册 + `encodeStyle` + `splitValuesAndCallbackInAttribute`~200 行) | plugin 已吃一半,本步收口方法体 |
7373
| 1.2 | `LayerModelManager` | `models[]/layerModel/buildLayerModel/buildModels/rebuildModels/initLayerModels/createAttributes/updateModelData/prepareBuildModel/clearModels/uniformBuffers/getPickingUniformBuffer` + blend/`BlendTypes`~250 行) ||
7474
| 1.3 | `LayerPickingManager` | `pick/boxSelect/active/setActive/select/setSelect` + `pickedFeatureID/selectedFeatureID/currentPickId/needPick` + set/get + `hooks.beforeHighlight/beforeSelect` 编排 + `setTimeout(reRender,1)` 收敛为可读调度(~150 行)。**1.3a ☑**`pick/boxSelect/needPick` + `currentPickId/selectedFeatureID` 搬入 delegate,BaseLayer 薄转发。**1.3b ☑**`active/setActive/select/setSelect` + hooks 编排 + setTimeout 收敛搬入 delegate;`reRender`(protected)经 ctor 注入 `rerender` 回调桥接(箭头延迟求值),零 protected 跨类访问 | `LayerPickService` 已抽出(picking 委托),本步收口**状态+编排** |
75-
| 1.4 | `LayerRelativeCoords` | `relativeOrigin/originalExtent/absoluteDataArray/processRelativeCoordinates/getAbsoluteData/getRelativeOrigin/getOriginalExtent`~50 行,函数已 `@antv/l7-utils`| |
75+
| 1.4 | `LayerRelativeCoords` | `relativeOrigin/originalExtent/absoluteDataArray/processRelativeCoordinates/getAbsoluteData/getRelativeOrigin/getOriginalExtent`~50 行,函数已 `@antv/l7-utils`| |
7676
| 1.5 | `LayerAnimateState` | `animateOptions/animateStartTime/animateStatus/getTime/setAnimateStartTime/stopAnimate/getLayerAnimateTime`~40 行) ||
7777
| 1.6 | `LayerScaleLegend` | `scaleOptions/getScaleOptions/getScale/getLegend/getLegendItems``invertExtent/ticks/domain` 三分支分类法,~80 行) ||
7878
| 1.7 | `LayerMaskManager` | `addMask/removeMask/disableMask/enableMask/addMaskLayer/removeMaskLayer` + `masks[]`~50 行) ||

packages/layers/src/core/BaseLayer.ts

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ import type {
4141
Triangulation,
4242
} from '@antv/l7-core';
4343
import { BlendType, IDebugLog, ILayerStage, globalConfigService } from '@antv/l7-core';
44-
import { lodashUtil, processRelativeCoordinates } from '@antv/l7-utils';
44+
import { lodashUtil } from '@antv/l7-utils';
4545
import { EventEmitter } from 'eventemitter3';
4646
import { createPlugins } from '../plugins';
4747
import type Source from '../source';
@@ -50,6 +50,7 @@ import { createMultiPassRenderer, normalizePasses } from '../utils/multiPassRend
5050
import LayerMaskManager from './LayerMaskManager';
5151
import LayerPickingManager from './LayerPickingManager';
5252
import LayerPickService from './LayerPickService';
53+
import LayerRelativeCoords from './LayerRelativeCoords';
5354
import LayerVisibilityZoom from './LayerVisibilityZoom';
5455
import TextureService from './TextureService';
5556
const { isEqual, isFunction, isNumber, isObject, isPlainObject, isUndefined } = lodashUtil;
@@ -217,9 +218,11 @@ export default class BaseLayer<ChildLayerStyleOptions = {}>
217218
protected animateOptions: IAnimateOption = { enable: false };
218219

219220
// 相对坐标系支持
220-
protected relativeOrigin: [number, number] = [0, 0];
221-
protected originalExtent: [number, number, number, number] = [0, 0, 0, 0];
222-
protected absoluteDataArray: IParseDataItem[] = []; // 保存绝对坐标数据用于交互
221+
/**
222+
* 相对坐标状态与转换 delegate(阶段 1.4)。原 protected 字段搬入;
223+
* 外部经 ILayer getter 访问,`processRelativeCoordinates` 经 protected 薄转发。
224+
*/
225+
protected relativeCoordsManager: LayerRelativeCoords = new LayerRelativeCoords(this);
223226

224227
/**
225228
* 图层容器
@@ -1249,46 +1252,28 @@ export default class BaseLayer<ChildLayerStyleOptions = {}>
12491252
* 处理相对坐标转换
12501253
*/
12511254
protected processRelativeCoordinates() {
1252-
const layerConfig = this.getLayerConfig();
1253-
const enableRelativeCoordinates = layerConfig?.enableRelativeCoordinates;
1254-
1255-
if (!enableRelativeCoordinates || !this.layerSource || !this.layerSource.data) {
1256-
return;
1257-
}
1258-
1259-
// 保存原始绝对坐标数据用于交互
1260-
this.absoluteDataArray = [...this.layerSource.data.dataArray];
1261-
1262-
// 处理相对坐标转换
1263-
const result = processRelativeCoordinates(this.layerSource.data.dataArray, {
1264-
enableRelativeCoordinates: true,
1265-
});
1266-
1267-
// 更新source数据为相对坐标
1268-
this.layerSource.data.dataArray = result.dataArray;
1269-
this.relativeOrigin = result.relativeOrigin;
1270-
this.originalExtent = result.originalExtent;
1255+
this.relativeCoordsManager.processRelativeCoordinates();
12711256
}
12721257

12731258
/**
12741259
* 获取绝对坐标数据(用于交互计算)
12751260
*/
12761261
public getAbsoluteData() {
1277-
return this.absoluteDataArray;
1262+
return this.relativeCoordsManager.getAbsoluteData();
12781263
}
12791264

12801265
/**
12811266
* 获取相对坐标原点
12821267
*/
12831268
public getRelativeOrigin() {
1284-
return this.relativeOrigin;
1269+
return this.relativeCoordsManager.getRelativeOrigin();
12851270
}
12861271

12871272
/**
12881273
* 获取原始数据范围
12891274
*/
12901275
public getOriginalExtent() {
1291-
return this.originalExtent;
1276+
return this.relativeCoordsManager.getOriginalExtent();
12921277
}
12931278

12941279
protected sourceEvent = () => {
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import type { IParseDataItem } from '@antv/l7-core';
2+
import { processRelativeCoordinates } from '@antv/l7-utils';
3+
import type BaseLayer from './BaseLayer';
4+
5+
/**
6+
* 相对坐标状态与转换 delegate(阶段 1.4)。
7+
*
8+
* 收口 BaseLayer 中相对坐标相关逻辑:
9+
* - 状态 `relativeOrigin` / `originalExtent` / `absoluteDataArray`(均原 protected
10+
* 字段,外部经 ILayer getter 访问、无一字段直读,已确认)
11+
* - 转换 `processRelativeCoordinates()`(原 protected,读 `getLayerConfig`
12+
* + 经公开 `getSource()` 读写 `source.data.dataArray`)
13+
* - getter `getAbsoluteData` / `getRelativeOrigin` / `getOriginalExtent`
14+
*
15+
* `processRelativeCoordinates` 在 BaseLayer 内部多处调用(init / setData 钩子),
16+
* 经 BaseLayer 保留 protected 薄转发桥接;逻辑字节级镜像原实现。
17+
* `layerSource`(protected)不跨类直访——经公开 `layer.getSource()` 返回同一
18+
* 引用后读写 `data.dataArray`,mutation 经引用生效。子类 override 路径不变
19+
* (全仓无子类 override 这一组,已确认)。
20+
*/
21+
export default class LayerRelativeCoords {
22+
private layer: BaseLayer;
23+
private relativeOrigin: [number, number] = [0, 0];
24+
private originalExtent: [number, number, number, number] = [0, 0, 0, 0];
25+
private absoluteDataArray: IParseDataItem[] = []; // 保存绝对坐标数据用于交互
26+
27+
constructor(layer: BaseLayer) {
28+
this.layer = layer;
29+
}
30+
31+
/**
32+
* 处理相对坐标转换
33+
*/
34+
public processRelativeCoordinates() {
35+
const layerConfig = this.layer.getLayerConfig();
36+
const enableRelativeCoordinates = (layerConfig as any)?.enableRelativeCoordinates;
37+
38+
const layerSource = this.layer.getSource();
39+
if (!enableRelativeCoordinates || !layerSource || !layerSource.data) {
40+
return;
41+
}
42+
43+
// 保存原始绝对坐标数据用于交互
44+
this.absoluteDataArray = [...layerSource.data.dataArray];
45+
46+
// 处理相对坐标转换
47+
const result = processRelativeCoordinates(layerSource.data.dataArray, {
48+
enableRelativeCoordinates: true,
49+
});
50+
51+
// 更新 source 数据为相对坐标
52+
layerSource.data.dataArray = result.dataArray;
53+
this.relativeOrigin = result.relativeOrigin;
54+
this.originalExtent = result.originalExtent;
55+
}
56+
57+
/**
58+
* 获取绝对坐标数据(用于交互计算)
59+
*/
60+
public getAbsoluteData() {
61+
return this.absoluteDataArray;
62+
}
63+
64+
/**
65+
* 获取相对坐标原点
66+
*/
67+
public getRelativeOrigin() {
68+
return this.relativeOrigin;
69+
}
70+
71+
/**
72+
* 获取原始数据范围
73+
*/
74+
public getOriginalExtent() {
75+
return this.originalExtent;
76+
}
77+
}

0 commit comments

Comments
 (0)