@hzab/map-combine 0.4.2-alpha.7 → 0.4.2-alpha.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -145,8 +145,25 @@ export class CesiumMap extends MapCombine {
145
145
  map.center = center;
146
146
  map.zoom = zoom;
147
147
 
148
+ // 目标层级范围
149
+ const { minZoom = 4, maxZoom = 18 } = opt || {};
150
+
151
+ // 限制相机距离
152
+ const controller = viewer.scene.screenSpaceCameraController;
153
+ controller.maximumZoomDistance = this.levelToDistance(minZoom);
154
+ controller.minimumZoomDistance = this.levelToDistance(maxZoom);
155
+
148
156
  return map;
149
157
  }
158
+ /**
159
+ * 层级转距离的近似公式 (基于地球周长)
160
+ * @param level
161
+ * @returns
162
+ */
163
+ levelToDistance(level) {
164
+ const earthRadius = 6378137; // 地球半径,单位米
165
+ return (earthRadius * 2 * Math.PI) / Math.pow(2, level);
166
+ }
150
167
 
151
168
  private _initParamsEvent(viewer) {
152
169
  if (!viewer) {
@@ -1,225 +1,225 @@
1
- import { fill } from "lodash";
2
-
3
- import { Tile3D } from "../basic/Tile3D";
4
- import { CesiumMap } from "./CesiumMap";
5
-
6
- import { arrayFillByLen } from "../utils";
7
-
8
- function create3DTile(tile3d: Tile3D) {
9
- const tileset = new Cesium.Cesium3DTileset({
10
- show: tile3d.show,
11
- url: tile3d.src,
12
- });
13
- tileset.maximumScreenSpaceError = 18 * (1 - tile3d.quality);
14
- tileset.readyPromise;
15
- return tileset;
16
- }
17
-
18
- function updateMatrix(tileset: any, tile3d: Tile3D, origin: any) {
19
- const options = tile3d._option;
20
- // 中心点移动到指定经纬度
21
- if (tile3d.coordinates) {
22
- const target = Cesium.Cartesian3.fromDegrees(...tile3d.coordinates);
23
- tileset.modelMatrix = Cesium.Matrix4.fromTranslation(Cesium.Cartesian3.subtract(target, origin, target));
24
- } else {
25
- tileset.modelMatrix = Cesium.Matrix4.IDENTITY;
26
- }
27
- // 旋转
28
- if (Array.isArray(options.rotates)) {
29
- const rotates: [number, number, number] = arrayFillByLen([...options.rotates], 3, 0);
30
- rotate(...rotates, tileset);
31
- }
32
- // 平移
33
- if (options.translates) {
34
- const translates: [number, number, number] = arrayFillByLen([...options.translates], 3, 0);
35
- translate(...translates, tileset);
36
- }
37
- // 缩放
38
- if (options.scales) {
39
- const scales: [number, number, number] = arrayFillByLen([...options.scales], 3, 1);
40
- scale(...scales, tileset);
41
- }
42
- }
43
-
44
- export function drawTile3D(map: CesiumMap, tile3d: Tile3D) {
45
- const { viewer } = map;
46
- let tileset = create3DTile(tile3d);
47
- let origin;
48
-
49
- viewer.scene.primitives.add(tileset).readyPromise.then(() => {
50
- const cartographic = Cesium.Cartographic.fromCartesian(tileset.boundingSphere.center);
51
- origin = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude);
52
- updateMatrix(tileset, tile3d, origin);
53
- tile3d.event.trigger("ready");
54
-
55
- // (window as any).getCenter = () => {
56
- // const center = tileset.boundingSphere.center
57
- // const cartographic = Cesium.Cartographic.fromCartesian(center)
58
- // console.info(Cesium.Math.toDegrees(cartographic.longitude), Cesium.Math.toDegrees(cartographic.latitude), cartographic.height);
59
- // }
60
- });
61
-
62
- const onUpdate = (e: Set<string>) => {
63
- e.forEach((key) => {
64
- switch (key) {
65
- case "show":
66
- tileset.show = tile3d.show;
67
- break;
68
- case "src":
69
- viewer.scene.primitives.remove(tileset);
70
- tileset = create3DTile(tile3d);
71
- viewer.scene.primitives.add(tileset).readyPromise.then(() => {
72
- const cartographic = Cesium.Cartographic.fromCartesian(tileset.boundingSphere.center);
73
- origin = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude);
74
- updateMatrix(tileset, tile3d, origin);
75
- tile3d.event.trigger("ready");
76
- });
77
- break;
78
- case "coordinates":
79
- if (!e.has("src")) {
80
- updateMatrix(tileset, tile3d, origin);
81
- }
82
- break;
83
-
84
- case "quality":
85
- tileset.maximumScreenSpaceError = 18 * (1 - tile3d.quality);
86
- break;
87
- default:
88
- throw new Error(`${key} 还不支持修改`);
89
- }
90
- });
91
- };
92
- const onFocus = () => {
93
- viewer.flyTo(tileset);
94
- };
95
-
96
- const onDestroy = () => {
97
- viewer.scene.primitives.remove(tileset);
98
- tile3d.event.off("update", onUpdate);
99
- tile3d.event.off("focus", onFocus);
100
- tile3d.event.off("destroy", onDestroy);
101
- };
102
-
103
- tile3d.tileset = tileset;
104
- tile3d.translate = function (x: number, y: number, z: number, _tileset) {
105
- return tileset.readyPromise.then((argument) => {
106
- test();
107
- translate(x, y, z, _tileset || tileset);
108
- });
109
- };
110
- tile3d.rotate = function (x: number, y: number, z: number, _tileset) {
111
- return tileset.readyPromise.then((argument) => {
112
- rotate(x, y, z, _tileset || tileset);
113
- });
114
- };
115
- tile3d.scale = function (x: number, y: number, z: number, _tileset) {
116
- return tileset.readyPromise.then((argument) => {
117
- scale(x, y, z, _tileset || tileset);
118
- });
119
- };
120
-
121
- tile3d.event.on("update", onUpdate);
122
- tile3d.event.on("focus", onFocus);
123
- tile3d.event.on("destroy", onDestroy);
124
- }
125
-
126
- function test() {
127
- console.info("debug test");
128
- }
129
-
130
- /** 基于本地的 ENU 坐标系的偏移,也就是垂直于地表向上为 Z,东为 X,北为 Y
131
- * @param dx x轴偏移量。单位:米
132
- * @param dy y轴偏移量。单位:米
133
- * @param dz z轴偏移量。单位:米
134
- * @param tileset Cesium3DTileset
135
- */
136
- function translate(dx: number, dy: number, dz: number, tileset) {
137
- if (dx === 0 && dy === 0 && dz === 0) return;
138
-
139
- try {
140
- const { Cartesian3, Matrix4, Transforms } = Cesium;
141
- // 对于3DTileset,我们需要的结果是一个模型矩阵,那么平移就是计算一个世界坐标下的平移矩阵。
142
- // 获取中心点
143
- const origin = tileset.boundingSphere.center;
144
- // 以该点建立ENU坐标系
145
- const toWorldMatrix = Transforms.eastNorthUpToFixedFrame(origin);
146
- // 该坐标系下平移后的位置
147
- const translatePosition = new Cartesian3(dx, dy, dz);
148
- // 获取平移后位置的世界坐标
149
- const worldPosition = Matrix4.multiplyByPoint(toWorldMatrix, translatePosition, new Cartesian3());
150
- // 计算世界坐标下的各个平移量
151
- const offset = Cartesian3.subtract(worldPosition, origin, new Cartesian3());
152
- // 从世界坐标下的平移量计算世界坐标的平移矩阵
153
- const translateMatrix = Matrix4.fromTranslation(offset);
154
- // 应用平移矩阵。这里应该与原本的模型矩阵点乘,而不是直接赋值
155
- tileset.modelMatrix = Matrix4.multiply(translateMatrix, tileset.modelMatrix, new Matrix4());
156
- } catch (error) {
157
- console.error(error);
158
- }
159
- }
160
-
161
- /** 基于本地的 ENU 坐标系的旋转,也就是垂直于地表向上为 Z,东为 X,北为 Y
162
- * https://blog.csdn.net/weixin_70945905/article/details/142419968
163
- * @param rx 绕X轴旋转的角度。单位:度
164
- * @param ry 绕Y轴旋转的角度。单位:度
165
- * @param rz 绕Z轴旋转的角度。单位:度
166
- * @param tileset Cesium3DTileset
167
- */
168
- function rotate(rx: number, ry: number, rz: number, tileset) {
169
- if (rx === 0 && ry === 0 && rz === 0) return;
170
- const { Matrix3, Matrix4, Transforms, Math: CesiumMath } = Cesium;
171
- // 获取中心点。
172
- const origin = tileset.boundingSphere.center;
173
- // 以该点建立 ENU 坐标系
174
- const toWorldMatrix = Transforms.eastNorthUpToFixedFrame(origin);
175
- // 获取 ENU 矩阵的逆矩阵。也就是可以将世界坐标重新转为 ENU 坐标系的矩阵
176
- const toLocalMatrix = Matrix4.inverse(toWorldMatrix, new Matrix4());
177
- // 计算旋转矩阵
178
- const rotateMatrix = Matrix4.clone(Matrix4.IDENTITY);
179
- if (rx !== 0) {
180
- const rotateXMatrix = Matrix4.fromRotationTranslation(Matrix3.fromRotationX(CesiumMath.toRadians(rx)));
181
- Matrix4.multiply(rotateXMatrix, rotateMatrix, rotateMatrix);
182
- }
183
- if (ry !== 0) {
184
- const rotateYMatrix = Matrix4.fromRotationTranslation(Matrix3.fromRotationY(CesiumMath.toRadians(ry)));
185
- Matrix4.multiply(rotateYMatrix, rotateMatrix, rotateMatrix);
186
- }
187
- if (rz !== 0) {
188
- const rotateZMatrix = Matrix4.fromRotationTranslation(Matrix3.fromRotationZ(CesiumMath.toRadians(rz)));
189
- Matrix4.multiply(rotateZMatrix, rotateMatrix, rotateMatrix);
190
- }
191
- // ENU 坐标系下的结果矩阵
192
- const localResultMatrix = Matrix4.multiply(rotateMatrix, toLocalMatrix, new Matrix4());
193
- // 世界坐标系下的结果矩阵
194
- const worldResultMatrix = Matrix4.multiply(toWorldMatrix, localResultMatrix, new Matrix4());
195
- // 应用结果
196
- tileset.modelMatrix = Matrix4.multiply(worldResultMatrix, tileset.modelMatrix, new Matrix4());
197
- }
198
-
199
- /** 基于本地的 ENU 坐标系的缩放,也就是垂直于地表向上为 Z,东为 X,北为 Y
200
- * @param sx x 轴缩放倍数
201
- * @param sy y 轴缩放倍数
202
- * @param sz z 轴缩放倍数
203
- * @param tileset Cesium3DTileset
204
- */
205
- function scale(sx: number, sy: number, sz: number, tileset) {
206
- if (sx <= 0 || sy <= 0 || sz <= 0) throw Error("缩放倍数必须大于0");
207
- if (sx === 1 && sy === 1 && sz === 1) return;
208
- const { Cartesian3, Matrix4, Transforms } = Cesium;
209
- // 具体步骤是将 3DTileset 先转为 ENU 坐标系,再在 ENU 坐标系下计算缩放后的结果,再转回世界坐标系。一个步骤代表一个矩阵
210
-
211
- // 获取中心点。
212
- const origin = tileset.boundingSphere.center;
213
- // 以该点建立 ENU 坐标系
214
- const toWorldMatrix = Transforms.eastNorthUpToFixedFrame(origin);
215
- // 获取ENU矩阵的逆矩阵。也就是可以将世界坐标重新转为 ENU 坐标系的矩阵
216
- const toLocalMatrix = Matrix4.inverse(toWorldMatrix, new Matrix4());
217
- // 计算缩放矩阵
218
- const scaleMatrix = Matrix4.fromScale(new Cartesian3(sx, sy, sz));
219
- // ENU 坐标系下的结果矩阵
220
- const localResultMatrix = Matrix4.multiply(scaleMatrix, toLocalMatrix, new Matrix4());
221
- // 世界坐标系下的结果矩阵
222
- const worldResultMatrix = Matrix4.multiply(toWorldMatrix, localResultMatrix, new Matrix4());
223
- // 应用结果
224
- tileset.modelMatrix = Matrix4.multiply(worldResultMatrix, tileset.modelMatrix, new Matrix4());
225
- }
1
+ import { fill } from "lodash";
2
+
3
+ import { Tile3D } from "../basic/Tile3D";
4
+ import { CesiumMap } from "./CesiumMap";
5
+
6
+ import { arrayFillByLen } from "../utils";
7
+
8
+ function create3DTile(tile3d: Tile3D) {
9
+ const tileset = new Cesium.Cesium3DTileset({
10
+ show: tile3d.show,
11
+ url: tile3d.src,
12
+ });
13
+ tileset.maximumScreenSpaceError = 18 * (1 - tile3d.quality);
14
+ tileset.readyPromise;
15
+ return tileset;
16
+ }
17
+
18
+ function updateMatrix(tileset: any, tile3d: Tile3D, origin: any) {
19
+ const options = tile3d._option;
20
+ // 中心点移动到指定经纬度
21
+ if (tile3d.coordinates) {
22
+ const target = Cesium.Cartesian3.fromDegrees(...tile3d.coordinates);
23
+ tileset.modelMatrix = Cesium.Matrix4.fromTranslation(Cesium.Cartesian3.subtract(target, origin, target));
24
+ } else {
25
+ tileset.modelMatrix = Cesium.Matrix4.IDENTITY;
26
+ }
27
+ // 旋转
28
+ if (Array.isArray(options.rotates)) {
29
+ const rotates: [number, number, number] = arrayFillByLen([...options.rotates], 3, 0);
30
+ rotate(...rotates, tileset);
31
+ }
32
+ // 平移
33
+ if (options.translates) {
34
+ const translates: [number, number, number] = arrayFillByLen([...options.translates], 3, 0);
35
+ translate(...translates, tileset);
36
+ }
37
+ // 缩放
38
+ if (options.scales) {
39
+ const scales: [number, number, number] = arrayFillByLen([...options.scales], 3, 1);
40
+ scale(...scales, tileset);
41
+ }
42
+ }
43
+
44
+ export function drawTile3D(map: CesiumMap, tile3d: Tile3D) {
45
+ const { viewer } = map;
46
+ let tileset = create3DTile(tile3d);
47
+ let origin;
48
+
49
+ viewer.scene.primitives.add(tileset).readyPromise.then(() => {
50
+ const cartographic = Cesium.Cartographic.fromCartesian(tileset.boundingSphere.center);
51
+ origin = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude);
52
+ updateMatrix(tileset, tile3d, origin);
53
+ tile3d.event.trigger("ready");
54
+
55
+ // (window as any).getCenter = () => {
56
+ // const center = tileset.boundingSphere.center
57
+ // const cartographic = Cesium.Cartographic.fromCartesian(center)
58
+ // console.info(Cesium.Math.toDegrees(cartographic.longitude), Cesium.Math.toDegrees(cartographic.latitude), cartographic.height);
59
+ // }
60
+ });
61
+
62
+ const onUpdate = (e: Set<string>) => {
63
+ e.forEach((key) => {
64
+ switch (key) {
65
+ case "show":
66
+ tileset.show = tile3d.show;
67
+ break;
68
+ case "src":
69
+ viewer.scene.primitives.remove(tileset);
70
+ tileset = create3DTile(tile3d);
71
+ viewer.scene.primitives.add(tileset).readyPromise.then(() => {
72
+ const cartographic = Cesium.Cartographic.fromCartesian(tileset.boundingSphere.center);
73
+ origin = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude);
74
+ updateMatrix(tileset, tile3d, origin);
75
+ tile3d.event.trigger("ready");
76
+ });
77
+ break;
78
+ case "coordinates":
79
+ if (!e.has("src")) {
80
+ updateMatrix(tileset, tile3d, origin);
81
+ }
82
+ break;
83
+
84
+ case "quality":
85
+ tileset.maximumScreenSpaceError = 18 * (1 - tile3d.quality);
86
+ break;
87
+ default:
88
+ throw new Error(`${key} 还不支持修改`);
89
+ }
90
+ });
91
+ };
92
+ const onFocus = () => {
93
+ viewer.flyTo(tileset);
94
+ };
95
+
96
+ const onDestroy = () => {
97
+ viewer.scene.primitives.remove(tileset);
98
+ tile3d.event.off("update", onUpdate);
99
+ tile3d.event.off("focus", onFocus);
100
+ tile3d.event.off("destroy", onDestroy);
101
+ };
102
+
103
+ tile3d.tileset = tileset;
104
+ tile3d.translate = function (x: number, y: number, z: number, _tileset) {
105
+ return tileset.readyPromise.then((argument) => {
106
+ test();
107
+ translate(x, y, z, _tileset || tileset);
108
+ });
109
+ };
110
+ tile3d.rotate = function (x: number, y: number, z: number, _tileset) {
111
+ return tileset.readyPromise.then((argument) => {
112
+ rotate(x, y, z, _tileset || tileset);
113
+ });
114
+ };
115
+ tile3d.scale = function (x: number, y: number, z: number, _tileset) {
116
+ return tileset.readyPromise.then((argument) => {
117
+ scale(x, y, z, _tileset || tileset);
118
+ });
119
+ };
120
+
121
+ tile3d.event.on("update", onUpdate);
122
+ tile3d.event.on("focus", onFocus);
123
+ tile3d.event.on("destroy", onDestroy);
124
+ }
125
+
126
+ function test() {
127
+ console.info("debug test");
128
+ }
129
+
130
+ /** 基于本地的 ENU 坐标系的偏移,也就是垂直于地表向上为 Z,东为 X,北为 Y
131
+ * @param dx x轴偏移量。单位:米
132
+ * @param dy y轴偏移量。单位:米
133
+ * @param dz z轴偏移量。单位:米
134
+ * @param tileset Cesium3DTileset
135
+ */
136
+ function translate(dx: number, dy: number, dz: number, tileset) {
137
+ if (dx === 0 && dy === 0 && dz === 0) return;
138
+
139
+ try {
140
+ const { Cartesian3, Matrix4, Transforms } = Cesium;
141
+ // 对于3DTileset,我们需要的结果是一个模型矩阵,那么平移就是计算一个世界坐标下的平移矩阵。
142
+ // 获取中心点
143
+ const origin = tileset.boundingSphere.center;
144
+ // 以该点建立ENU坐标系
145
+ const toWorldMatrix = Transforms.eastNorthUpToFixedFrame(origin);
146
+ // 该坐标系下平移后的位置
147
+ const translatePosition = new Cartesian3(dx, dy, dz);
148
+ // 获取平移后位置的世界坐标
149
+ const worldPosition = Matrix4.multiplyByPoint(toWorldMatrix, translatePosition, new Cartesian3());
150
+ // 计算世界坐标下的各个平移量
151
+ const offset = Cartesian3.subtract(worldPosition, origin, new Cartesian3());
152
+ // 从世界坐标下的平移量计算世界坐标的平移矩阵
153
+ const translateMatrix = Matrix4.fromTranslation(offset);
154
+ // 应用平移矩阵。这里应该与原本的模型矩阵点乘,而不是直接赋值
155
+ tileset.modelMatrix = Matrix4.multiply(translateMatrix, tileset.modelMatrix, new Matrix4());
156
+ } catch (error) {
157
+ console.error(error);
158
+ }
159
+ }
160
+
161
+ /** 基于本地的 ENU 坐标系的旋转,也就是垂直于地表向上为 Z,东为 X,北为 Y
162
+ * https://blog.csdn.net/weixin_70945905/article/details/142419968
163
+ * @param rx 绕X轴旋转的角度。单位:度
164
+ * @param ry 绕Y轴旋转的角度。单位:度
165
+ * @param rz 绕Z轴旋转的角度。单位:度
166
+ * @param tileset Cesium3DTileset
167
+ */
168
+ function rotate(rx: number, ry: number, rz: number, tileset) {
169
+ if (rx === 0 && ry === 0 && rz === 0) return;
170
+ const { Matrix3, Matrix4, Transforms, Math: CesiumMath } = Cesium;
171
+ // 获取中心点。
172
+ const origin = tileset.boundingSphere.center;
173
+ // 以该点建立 ENU 坐标系
174
+ const toWorldMatrix = Transforms.eastNorthUpToFixedFrame(origin);
175
+ // 获取 ENU 矩阵的逆矩阵。也就是可以将世界坐标重新转为 ENU 坐标系的矩阵
176
+ const toLocalMatrix = Matrix4.inverse(toWorldMatrix, new Matrix4());
177
+ // 计算旋转矩阵
178
+ const rotateMatrix = Matrix4.clone(Matrix4.IDENTITY);
179
+ if (rx !== 0) {
180
+ const rotateXMatrix = Matrix4.fromRotationTranslation(Matrix3.fromRotationX(CesiumMath.toRadians(rx)));
181
+ Matrix4.multiply(rotateXMatrix, rotateMatrix, rotateMatrix);
182
+ }
183
+ if (ry !== 0) {
184
+ const rotateYMatrix = Matrix4.fromRotationTranslation(Matrix3.fromRotationY(CesiumMath.toRadians(ry)));
185
+ Matrix4.multiply(rotateYMatrix, rotateMatrix, rotateMatrix);
186
+ }
187
+ if (rz !== 0) {
188
+ const rotateZMatrix = Matrix4.fromRotationTranslation(Matrix3.fromRotationZ(CesiumMath.toRadians(rz)));
189
+ Matrix4.multiply(rotateZMatrix, rotateMatrix, rotateMatrix);
190
+ }
191
+ // ENU 坐标系下的结果矩阵
192
+ const localResultMatrix = Matrix4.multiply(rotateMatrix, toLocalMatrix, new Matrix4());
193
+ // 世界坐标系下的结果矩阵
194
+ const worldResultMatrix = Matrix4.multiply(toWorldMatrix, localResultMatrix, new Matrix4());
195
+ // 应用结果
196
+ tileset.modelMatrix = Matrix4.multiply(worldResultMatrix, tileset.modelMatrix, new Matrix4());
197
+ }
198
+
199
+ /** 基于本地的 ENU 坐标系的缩放,也就是垂直于地表向上为 Z,东为 X,北为 Y
200
+ * @param sx x 轴缩放倍数
201
+ * @param sy y 轴缩放倍数
202
+ * @param sz z 轴缩放倍数
203
+ * @param tileset Cesium3DTileset
204
+ */
205
+ function scale(sx: number, sy: number, sz: number, tileset) {
206
+ if (sx <= 0 || sy <= 0 || sz <= 0) throw Error("缩放倍数必须大于0");
207
+ if (sx === 1 && sy === 1 && sz === 1) return;
208
+ const { Cartesian3, Matrix4, Transforms } = Cesium;
209
+ // 具体步骤是将 3DTileset 先转为 ENU 坐标系,再在 ENU 坐标系下计算缩放后的结果,再转回世界坐标系。一个步骤代表一个矩阵
210
+
211
+ // 获取中心点。
212
+ const origin = tileset.boundingSphere.center;
213
+ // 以该点建立 ENU 坐标系
214
+ const toWorldMatrix = Transforms.eastNorthUpToFixedFrame(origin);
215
+ // 获取ENU矩阵的逆矩阵。也就是可以将世界坐标重新转为 ENU 坐标系的矩阵
216
+ const toLocalMatrix = Matrix4.inverse(toWorldMatrix, new Matrix4());
217
+ // 计算缩放矩阵
218
+ const scaleMatrix = Matrix4.fromScale(new Cartesian3(sx, sy, sz));
219
+ // ENU 坐标系下的结果矩阵
220
+ const localResultMatrix = Matrix4.multiply(scaleMatrix, toLocalMatrix, new Matrix4());
221
+ // 世界坐标系下的结果矩阵
222
+ const worldResultMatrix = Matrix4.multiply(toWorldMatrix, localResultMatrix, new Matrix4());
223
+ // 应用结果
224
+ tileset.modelMatrix = Matrix4.multiply(worldResultMatrix, tileset.modelMatrix, new Matrix4());
225
+ }
@@ -45,8 +45,23 @@ export function bindEvent(map: MineMap) {
45
45
  viewer.on("mousedown", () => {
46
46
  event.trigger("pointer-down");
47
47
  });
48
- viewer.on("click", () => {
48
+ viewer.on("click", (e) => {
49
49
  event.trigger("left-click");
50
+
51
+ // "drill-pick"
52
+ // 获取点击位置的屏幕坐标
53
+ const point = [e.point.x, e.point.y];
54
+ // 执行拾取查询
55
+ var pickedObjects = viewer.queryRenderedFeatures(point);
56
+ // 处理查询结果
57
+ if (pickedObjects && pickedObjects.length > 0 && pickedObjects[0].properties) {
58
+ event.trigger("drill-pick", {
59
+ event: e,
60
+ pickedTargets: pickedObjects.map((it) => map.elements.get(it.properties?.id)),
61
+ sourceObjects: pickedObjects,
62
+ position: [e.lngLat.lng, e.lngLat.lat],
63
+ });
64
+ }
50
65
  });
51
66
 
52
67
  event.on("destroy", () => {