forked from drone/command-center-dashboard

罗广辉
2025-03-28 405a84e3e45c51d2a255d901e79c26b6f100cb48
feat: 封装聚合功能
2 files modified
1 files deleted
1 files added
311 ■■■■■ changed files
src/layout/Header.vue 8 ●●●● patch | view | raw | blame | history
src/views/Home/Home.vue 117 ●●●●● patch | view | raw | blame | history
src/views/Home/aggregation.js 53 ●●●●● patch | view | raw | blame | history
src/views/Home/useAggregation.js 133 ●●●●● patch | view | raw | blame | history
src/layout/Header.vue
@@ -53,12 +53,12 @@
  if (!['首页', '任务管理'].includes(name)) return ElMessage.warning('正在开发中');
  // 更新 leftList 的 active 状态
  leftList.value.forEach(item => {
    item.active = item.router === path;
    item.active = item.path === path;
  });
  // 更新 rightList 的 active 状态
  rightList.value.forEach(item => {
    item.active = item.router === path;
    item.active = item.path === path;
  });
  console.log(path);
  // 跳转到指定页面
@@ -69,12 +69,12 @@
  // 初始化 leftList 的 active 状态
  const currentPath = route.path;
  leftList.value.forEach(item => {
    item.active = item.router === currentPath;
    item.active = item.path === currentPath;
  });
  // 初始化 rightList 的 active 状态
  rightList.value.forEach(item => {
    item.active = item.router === currentPath;
    item.active = item.path === currentPath;
  });
});
</script>
src/views/Home/Home.vue
@@ -9,120 +9,7 @@
import HomeRight from './components/HomeRight/HomeRight.vue';
import HomeLeft from '@/views/Home/components/HomeLeft/HomeLeft.vue';
import SearchBox from '@/views/Home/SearchBox.vue';
import jiangxi from '@/assets/geojson/jiangxi.json';
import jiangxishi from '@/assets/geojson/jiangxishi.json';
import zg from '@/assets/geojson/zg.json';
import * as Cesium from 'cesium';
import data1 from '@/assets/images/home/homeRight/data1.png';
import data2 from '@/assets/images/home/homeRight/data2.png';
import { useAggregation } from '@/views/Home/useAggregation';
const list = [
  { name: '县', value: [0,48651], gJson: null },
  { name: '市', value: [48651,314863], gJson: jiangxishi },
  { name: '省', value: [314863,1169651], gJson: jiangxi },
  { name: '国', value: [1169651,37962800], gJson: zg },
];
let viewer = null;
const active = ref('');
const init = () => {
  determineScaling();
  viewer.camera.moveEnd.addEventListener(() => {
    determineScaling();
  });
};
const determineScaling = () => {
  let height = viewer.camera.positionCartographic.height;
  // 根据高度展示对应的 gJson
  for (let item of list) {
    // if (height < item.value) {
    if (height > item.value[0] && height <= item.value[1]) {
      if (active.value !== item.name) {
        viewer.dataSources.removeAll(true);
        viewer.entities.removeAll();
        active.value = item.name;
        if (item.gJson) {
          aggregation(item);
        }else{
          for (let i = 0; i < 50; i++) {
            viewer.entities.add({
              position: Cesium.Cartesian3.fromDegrees(
                115.89 + Math.random() * 0.2,
                28.68 + Math.random() * 0.2
              ),
              label: {
                // 随机整数
                text: Math.floor(Math.random() * 100)+'号机巢',
                font: '14pt monospace',
                fillColor: Cesium.Color.WHITE,
                outlineColor: Cesium.Color.BLACK,
                outlineWidth: 2,
                style: Cesium.LabelStyle.FILL_AND_OUTLINE,
                verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
                pixelOffset: new Cesium.Cartesian2(0, -9),
              },
              billboard: {
                image: data1,
                width: 24,
                height: 24,
              },
            });
          }
        }
      }
      break;
    }
  }
};
const aggregation = item => {
  const featuresList = item.gJson.features.map(item => ({
    name: item.properties.name,
    position: item.properties.center,
  }));
  // 遍历特征并添加实体
  featuresList.forEach(feature => {
    if (!feature.position) return;
    const position = Cesium.Cartesian3.fromDegrees(feature.position[0], feature.position[1]);
    viewer.entities.add({
      position: position,
      label: {
        // 随机整数
        text: feature.name + Math.floor(Math.random() * 100),
        font: '14pt monospace',
        fillColor: Cesium.Color.WHITE,
        outlineColor: Cesium.Color.BLACK,
        outlineWidth: 2,
        style: Cesium.LabelStyle.FILL_AND_OUTLINE,
        verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
        pixelOffset: new Cesium.Cartesian2(0, -9),
      },
      billboard: {
        image: data2,
        width: 24,
        height: 24,
      },
    });
  });
  // 加载新的 GeoJSON 数据
  Cesium.GeoJsonDataSource.load(item.gJson).then(dataSource => {
    viewer.dataSources.add(dataSource);
    item.dataSource = dataSource; // 保存数据源以便后续删除
    // 获取数据源中的实体
    const entities = dataSource.entities.values;
    entities.forEach(entity => {
      entity.polygon.material = new Cesium.ColorMaterialProperty(
        Cesium.Color.YELLOW.withAlpha(0) // 透明填充
      );
      entity.polygon.outline = new Cesium.ConstantProperty(true); // 显示边框
      entity.polygon.outlineColor = new Cesium.ConstantProperty(Cesium.Color.YELLOW); // 黑色边框
    });
  });
};
onMounted(() => {
  nextTick(() => {
    viewer = window.$viewer;
    init();
  });
});
useAggregation()
</script>
src/views/Home/aggregation.js
File was deleted
src/views/Home/useAggregation.js
New file
@@ -0,0 +1,133 @@
import * as Cesium from 'cesium';
import data2 from '@/assets/images/home/homeRight/data2.png';
import data1 from '@/assets/images/home/homeRight/data1.png';
import jiangxishi from '@/assets/geojson/jiangxishi.json';
import jiangxi from '@/assets/geojson/jiangxi.json';
import zg from '@/assets/geojson/zg.json';
/**
 * 机巢聚合功能
 */
export const useAggregation = () => {
  let viewer = null;
  const scalingJudgment = [
    { name: '县', value: [0, 48651], gJson: null },
    { name: '市', value: [48651, 314863], gJson: jiangxishi },
    { name: '省', value: [314863, 1169651], gJson: jiangxi },
    { name: '国', value: [1169651, 37962800], gJson: zg },
  ];
  const active = ref('');
  const init = () => {
    determineScaling();
    viewer.camera.moveEnd.addEventListener(() => {
      determineScaling();
    });
  };
  const removeFun = () => {
    viewer.dataSources.removeAll(true);
    viewer.entities.removeAll();
  };
  const determineScaling = () => {
    let height = viewer.camera.positionCartographic.height;
    // 根据高度展示对应的 gJson
    for (let item of scalingJudgment) {
      if (height > item.value[0] && height <= item.value[1]) {
        if (active.value !== item.name) {
          removeFun();
          active.value = item.name;
          item.gJson ? aggregation(item) : splashed();
        }
        break;
      }
    }
  };
  //散点机巢
  function splashed() {
    for (let i = 0; i < 50; i++) {
      viewer.entities.add({
        position: Cesium.Cartesian3.fromDegrees(
          115.89 + Math.random() * 0.2,
          28.68 + Math.random() * 0.2
        ),
        label: {
          // 随机整数
          text: Math.floor(Math.random() * 100) + '号机巢',
          font: '14pt monospace',
          fillColor: Cesium.Color.WHITE,
          outlineColor: Cesium.Color.BLACK,
          outlineWidth: 2,
          style: Cesium.LabelStyle.FILL_AND_OUTLINE,
          verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
          pixelOffset: new Cesium.Cartesian2(0, -9),
        },
        billboard: {
          image: new Cesium.ConstantProperty(data1),
          width: 24,
          height: 24,
        },
      });
    }
  }
  // 聚合机巢
  const aggregation = item => {
    const featuresList = item.gJson.features.map(item => ({
      name: item.properties.name,
      position: item.properties.center,
    }));
    // 遍历特征并添加实体
    featuresList.forEach(feature => {
      if (!feature.position) return;
      const position = Cesium.Cartesian3.fromDegrees(feature.position[0], feature.position[1]);
      viewer.entities.add({
        position: position,
        label: {
          // 随机整数
          text: feature.name + Math.floor(Math.random() * 100),
          font: '14pt monospace',
          fillColor: Cesium.Color.WHITE,
          outlineColor: Cesium.Color.BLACK,
          outlineWidth: 2,
          style: Cesium.LabelStyle.FILL_AND_OUTLINE,
          verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
          pixelOffset: new Cesium.Cartesian2(0, -9),
        },
        billboard: {
          image: new Cesium.ConstantProperty(data2),
          width: 24,
          height: 24,
        },
      });
    });
    // 加载新的 GeoJSON 数据
    Cesium.GeoJsonDataSource.load(item.gJson).then(dataSource => {
      viewer.dataSources.add(dataSource);
      item.dataSource = dataSource; // 保存数据源以便后续删除
      // 获取数据源中的实体
      const entities = dataSource.entities.values;
      entities.forEach(entity => {
        entity.polygon.material = new Cesium.ColorMaterialProperty(
          Cesium.Color.YELLOW.withAlpha(0) // 透明填充
        );
        entity.polygon.outline = new Cesium.ConstantProperty(true); // 显示边框
        entity.polygon.outlineColor = new Cesium.ConstantProperty(Cesium.Color.YELLOW); // 黑色边框
      });
    });
  };
  onUnmounted(() => {
    console.log('xiezai');
    removeFun();
  });
  onMounted(() => {
    console.log('触发');
    nextTick(() => {
      viewer = window.$viewer;
      init();
    });
  });
};