forked from drone/command-center-dashboard

chenyao
2025-03-28 55dc742fb4ee17be13ce57bc78cf3eee9ee90f9f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import * as Cesium from 'cesium';
import data2 from '@/assets/images/home/homeRight/data2.png';
import data1 from '@/assets/images/home/homeRight/data1.png';
import { win } from 'codemirror/src/util/dom';
 
export const getAggregation = () => {
  // 1️⃣ 创建数据源
  const dataSource = new Cesium.CustomDataSource('clusteredData');
  // 2️⃣ 启用聚合
  dataSource.clustering.enabled = true;
  dataSource.clustering.pixelRange = 50; // 多少像素范围内的点进行聚合
  dataSource.clustering.minimumClusterSize = 3; // 至少 3 个点才聚合
 
  // 3️⃣ 监听聚合事件
  dataSource.clustering.clusterEvent.addEventListener((clusteredEntities, cluster) => {
    if (clusteredEntities.length > 1) {
      // 这是聚合点
      cluster.label.show = true;
      cluster.label.text = clusteredEntities.length.toString(); // 显示聚合点数量
      cluster.billboard.show = true;
      cluster.billboard.image = data2; // 自定义聚合图标
      cluster.billboard.scale = 1.5;
    } else {
      // 这是单个点
      cluster.label.show = false;
      cluster.billboard.show = false;
    }
  });
 
  // 4️⃣ 添加点数据
  for (let i = 0; i < 20; i++) {
    dataSource.entities.add({
      position: Cesium.Cartesian3.fromDegrees(
        115.89 + Math.random() * 0.1,
        28.68 + Math.random() * 0.1
      ),
      billboard: {
        image: data1,
        width: 24,
        height: 24,
      },
    });
  }
  const viewer = window.$viewer;
  // 5️⃣ 加载数据源
  viewer.dataSources.add(dataSource);
 
  viewer.screenSpaceEventHandler.setInputAction(movement => {
    const pickedObject = viewer.scene.pick(movement.position);
    if (pickedObject && pickedObject.id) {
      console.log('点击聚合点,包含以下数据:', pickedObject.id);
    }
  }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
};