forked from drone/command-center-dashboard

罗广辉
2025-04-03 867d40310ee35d618dfd94a64dfb3df01106ce5e
src/views/Home/useMapAggregation/useMapAggregation.js
@@ -46,13 +46,10 @@
  const store = useStore();
  const userAreaCode = computed(() => store.state.user.userInfo.detail.areaCode);
  const selectedAreaCode = computed(() => store.state.user.selectedAreaCode);
  const listenerHeight = () => {
    determineScaling();
    viewer.camera.moveEnd.addEventListener(determineScaling);
  };
  // 确定缩放比例
  const determineScaling = index => {
  const determineScaling = () => {
    console.log('确定缩放比例');
    if (!viewer) return;
    let height = viewer.camera.positionCartographic.height;
@@ -64,6 +61,7 @@
        active = item.name;
        removeEntities();
        removeLabel();
        if (!item.gJson && !item.splashedList?.length) return;
        item.gJson ? aggregation(item) : splashed(item);
        renderOutline(item);
        break;
@@ -71,6 +69,7 @@
    }
  };
  // 转换为目录结构, 返回数组,
  function convertToHierarchy(code) {
    const codeStr = code.toString();
    const provinceCode = codeStr.slice(0, 2) + '0000';
@@ -83,18 +82,20 @@
    return [provinceCode, cityCode, code];
  }
  // 获取设备聚合
  function getDeviceCount(areaCode) {
    return getDeviceRegionCount({ areaCode }).then(res => {
      return (res?.data?.data || []).map(i=>({...i,type:'deviceAggregation'}));
      return (res?.data?.data || [])
    });
  }
  // 获取设备散点
  function getDeviceList(areaCode) {
    return getDeviceRegion({ areaCode }).then(res => {
      return (res?.data?.data || []).map(i =>({...i,type}));
    });
  }
  // 事件散点
  let eventList = []
  function processChildren(childrens) {
    return (childrens || []).map(item => {
@@ -106,7 +107,6 @@
        total_device_count: item.number,
        region_code: item.id,
        region_name: item.name,
        type:'eventAggregation'
      };
      if (arr.length !== 0) {
        returnObj.childrens = arr;
@@ -115,6 +115,7 @@
    });
  }
  // 获取事件聚合
  function getMapEventCount(areaCode) {
    return getMapEvents({ areaCode }).then(res => {
      const resData= res?.data?.data
@@ -131,8 +132,8 @@
  const defaultDir =  `${VITE_APP_BASE}${VITE_APP_ENV === 'development' ? 'public/' : ''}geoJson/100000/`;
  const getFiler = async url => {
    const gJson = await import(/* @vite-ignore */ url);
    return JSON.parse(JSON.stringify(gJson));
    const res = await fetch(url);
    return  await res.json()
  };
  const getOutLine = async (jsonPathPre, hierarchy) => {
    const parentGJson = await getFiler(`${defaultDir}${jsonPathPre}/index.json`);
@@ -145,7 +146,10 @@
  const injectData = (gJson, dataList) => {
    return {
      ...gJson,
      features: gJson.features.map(item => ({ ...item, data: dataList.find(item1 => findFun(item1, item)) })),
      features: gJson.features.map(item => {
        const findData = dataList.find(item1 => findFun(item1, item))
        return { ...item, data: {...findData,type: type + 'Aggregation'} }
      }),
    };
  };
@@ -172,13 +176,15 @@
    if (hierarchy.length === 1) {
      const gJson1 = await getFiler(`${defaultDir}${jsonPath}/indexDistrict.json`);
      const gJson2 = await getFiler(`${defaultDir}${jsonPath}/index.json`);
      scalingJudgment[1].gJson = {
        ...gJson1,
        features: gJson1.features.map(item => ({
          ...item,
          data: list.flatMap(item => item.childrens || []).find(item1 => findFun(item1, item)),
        })),
        features: gJson1.features.map(item => {
          const findData = list.flatMap(item => item.childrens || []).find(item1 => findFun(item1, item))
          return { ...item, data: {...findData,type: type + 'Aggregation'} }
        }),
      };
      console.log(injectData(gJson2, list));
      scalingJudgment[2].gJson = injectData(gJson2, list);
      const { lng, lat } = getCenterPoint(gJson2.features.map(item => item.properties.center));
      flyTo({ longitude: lng, latitude: lat }, 0, scalingJudgment[2].height);
@@ -208,7 +214,11 @@
  watch(
    selectedAreaCode,
    async (newValue, oldValue) => {
      initMapData(newValue);
      if (!viewer) return
      viewer.scene.postRender.removeEventListener(determineScaling)
      initMapData(newValue).then(()=>{
        viewer.scene.postRender.addEventListener(determineScaling)
      })
    },
    { deep: true }
  );
@@ -273,12 +283,15 @@
  // 聚合机巢
  const aggregation = (item, flyTo) => {
    if (!item.gJson) return;
    const featuresList = item.gJson.features.map(item => ({
      name: item.properties.name,
      position: item.properties.center,
      data: item.data,
      id: item.region_code,
    }));
    const featuresList = item.gJson.features.map(item1 => {
      // const {lng,lat} = getCenterPoint(item1.geometry.coordinates[0][0])
      return {
        name: item1.properties.name,
        position: item1.properties.center,
        data: item1.data,
        id: item1.region_code,
      }
    });
    // 遍历特征并添加实体
    featuresList.forEach(feature => {
      if (!feature.position) return;
@@ -382,7 +395,7 @@
      if (!positionC3) return;
      removeLabel();
      const customData = entity.properties.customData._value.data;
      console.log('customData', customData);
      switch (customData.type) {
        case 'deviceAggregation':
          viewer.scene.postRender.addEventListener(labelBoxRender);
@@ -423,7 +436,8 @@
  const removeAll = () => {
    removeEntities();
    removeLabel();
    viewer.camera.moveEnd.removeEventListener(determineScaling);
    // viewer.camera.moveEnd.removeEventListener(determineScaling);
    viewer.scene.postRender.removeEventListener(determineScaling)
    handler?.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
    handler?.destroy();
    viewer = null;
@@ -433,11 +447,14 @@
    currentEntity = null;
  };
  const init = () => {
    initMapData(selectedAreaCode.value || userAreaCode.value);
    viewer = window.$viewer;
    viewer.scene.postRender.removeEventListener(determineScaling)
    initMapData(selectedAreaCode.value || userAreaCode.value).then(()=>{
      viewer.scene.postRender.addEventListener(determineScaling)
    })
    handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
    handler.setInputAction(singleMachineEvent, Cesium.ScreenSpaceEventType.LEFT_CLICK);
    listenerHeight();
  };
  onBeforeUnmount(() => {});
  // onMounted(() => {
@@ -445,7 +462,6 @@
  //     viewer = window.$viewer;
  //     handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
  //     handler.setInputAction(singleMachineEvent, Cesium.ScreenSpaceEventType.LEFT_CLICK);
  //     listenerHeight();
  //   });
  // });