guonan
2025-05-23 fef12378282c0a8cf44411b079ac20ad4f397817
src/components/menu/Location.vue
@@ -8,6 +8,7 @@
      <div style="margin-left: 5px">
        <span style="color: white">重点沟:</span>
        <el-select
          @change="handleChange"
          v-model="selectValue"
          placeholder="Select"
          size="large"
@@ -21,24 +22,48 @@
          />
        </el-select>
      </div>
      <div
        v-for="(item, key) in districtList"
        :key="key"
        class="district-item"
        @click="handleClick(item)"
      >
        <div class="district-item-icon"></div>
        <div class="district-item-text">{{ item.name }}</div>
      <!-- 滚动区域 -->
      <div style="overflow-y: auto; height: 95%">
        <!-- 加载遮罩层 -->
        <div v-if="loading" class="loading-overlay">
          <div class="spinner"></div>
        </div>
        <div
          v-else
          v-for="(item, key) in districtList"
          :key="key"
          class="district-item"
          @click="handleClick(item)"
        >
          <div class="district-item-icon"></div>
          <div class="district-item-text">{{ item.hdName }}</div>
        </div>
      </div>
    </div>
  </div>
</template>
<script setup>
import { ref, onMounted, onBeforeUnmount, reactive } from "vue";
import { getDistrictData } from "@/api/index";
import { ref, onMounted, watch, onBeforeUnmount } from "vue";
import { createPoint, removeEntities } from "@/utils/map";
import { useSimStore } from "@/store/simulation";
import { initeWaterPrimitiveView } from "@/utils/water"; //相机flyTo函数,后续options列表中有对应经纬度后弃用
import { useRoute, onBeforeRouteUpdate } from "vue-router";
const simStore = useSimStore();
// onBeforeRouteUpdate((to, from, next) => {
//   if (to.path !== "/yhgl") {
//     handleCleanup();
//   }
//   next();
// });
const route = useRoute();
onBeforeUnmount(() => {
  if (route.path !== "/yhgl") {
    handleCleanup();
  }
});
const selectValue = ref("孙胡沟");
const options = ref([
@@ -64,641 +89,11 @@
  },
]);
const districtList = ref([
  {
    activeStatus: "",
    areaCode: "",
    areaName: "",
    brookLength: 0,
    checkId: "",
    city: "北京市",
    codeProvince: "110116",
    county: "怀柔",
    dangerLevel: "",
    disasterStatus: "",
    drainageArea: "",
    elevation: 0,
    featureDes: "",
    groupMonitor: "李桂梅,孙桂和,范满田,秦建权,孙桂江,孙桂伟",
    hasPlan: "",
    id: "110116020058",
    latitude: 40.56652778,
    length: 0,
    district: "琉璃庙镇孙胡沟村尹家西沟尹建燕家屋后",
    longitude: 116.5803889,
    monitor: "",
    monitorAdvice: "",
    name: "尹家西沟尹建燕家屋后崩塌隐患点",
    number:
      "13716108909,13716029391,13716291714,13716191943,13716427398,13124792612",
    preventionDes: "",
    preventionLevel: "",
    preventionPlan: "定期巡查,预警转移,立警示牌",
    preventionUnit: "乡镇",
    principal: "",
    province: "北京市",
    qp: "",
    reason: "",
    responsibleUnit: "",
    riskLevel: "",
    scale: "小型",
    stableLevel: "",
    status: "",
    thickness: 0,
    threatenFamily: 2,
    threatenMoney: 0,
    threatenPopulation: "3",
    threatenType: "",
    town: "琉璃庙镇",
    trigger: "",
    type: "崩塌",
    village: "孙胡沟村",
    volume: "",
    volumePotential: "",
    width: 0,
  },
  {
    activeStatus: "",
    areaCode: "",
    areaName: "",
    brookLength: 0,
    checkId: "",
    city: "北京市",
    codeProvince: "110116",
    county: "怀柔",
    dangerLevel: "",
    disasterStatus: "",
    drainageArea: "",
    elevation: 0,
    featureDes: "",
    groupMonitor: "李桂梅,孙桂和,范满田,秦建权,孙桂江,孙桂伟",
    hasPlan: "",
    id: "110116020078",
    latitude: 40.56497222,
    length: 0,
    district: "琉璃庙镇孙胡沟村河西于凤英家屋后",
    longitude: 116.5955278,
    monitor: "",
    monitorAdvice: "",
    name: "河西于凤英家屋后崩塌隐患点",
    number:
      "13716108909,13716029391,13716291714,13716191943,13716427398,13124792612",
    preventionDes: "",
    preventionLevel: "",
    preventionPlan: "定期巡查,预警转移,立警示牌",
    preventionUnit: "乡镇",
    principal: "",
    province: "北京市",
    qp: "",
    reason: "",
    responsibleUnit: "",
    riskLevel: "",
    scale: "小型",
    stableLevel: "",
    status: "",
    thickness: 0,
    threatenFamily: 4,
    threatenMoney: 0,
    threatenPopulation: "6",
    threatenType: "",
    town: "琉璃庙镇",
    trigger: "",
    type: "崩塌",
    village: "孙胡沟村",
    volume: "",
    volumePotential: "",
    width: 0,
  },
  {
    activeStatus: "",
    areaCode: "",
    areaName: "",
    brookLength: 0,
    checkId: "",
    city: "北京市",
    codeProvince: "110116",
    county: "怀柔",
    dangerLevel: "",
    disasterStatus: "",
    drainageArea: "",
    elevation: 0,
    featureDes: "",
    groupMonitor: "李桂梅,孙桂和,范满田,秦建权,孙桂江,孙桂伟",
    hasPlan: "",
    id: "110116030041",
    latitude: 40.55369444,
    length: 0,
    district: "琉璃庙镇孙胡沟公路",
    longitude: 116.6002778,
    monitor: "",
    monitorAdvice: "",
    name: "南梁小东沟泥石流隐患点",
    number:
      "13716108909,13716029391,13716291714,13716191943,13716427398,13124792612",
    preventionDes: "",
    preventionLevel: "",
    preventionPlan: "定期巡查,立警示牌",
    preventionUnit: "乡镇",
    principal: "",
    province: "北京市",
    qp: "",
    reason: "",
    responsibleUnit: "",
    riskLevel: "",
    scale: "小型",
    stableLevel: "",
    status: "",
    thickness: 0,
    threatenFamily: 0,
    threatenMoney: 0,
    threatenPopulation: "",
    threatenType: "",
    town: "琉璃庙镇",
    trigger: "",
    type: "泥石流",
    village: "孙胡沟村",
    volume: "",
    volumePotential: "",
    width: 0,
  },
  {
    activeStatus: "",
    areaCode: "",
    areaName: "",
    brookLength: 0,
    checkId: "",
    city: "北京市",
    codeProvince: "110116",
    county: "怀柔",
    dangerLevel: "",
    disasterStatus: "",
    drainageArea: "",
    elevation: 0,
    featureDes: "",
    groupMonitor: "李桂梅,孙桂和,范满田,秦建权,孙桂江,孙桂伟",
    hasPlan: "",
    id: "110116030015",
    latitude: 40.55277778,
    length: 0,
    district: "琉璃庙镇孙胡沟村南梁村大窑沟",
    longitude: 116.5994722,
    monitor: "",
    monitorAdvice: "",
    name: "大窑沟泥石流隐患点",
    number:
      "13716108909,13716029391,13716291714,13716191943,13716427398,13124792612",
    preventionDes: "已监测、已治理",
    preventionLevel: "",
    preventionPlan: "定期巡查,预警转移,立警示牌",
    preventionUnit: "乡镇",
    principal: "",
    province: "北京市",
    qp: "",
    reason: "",
    responsibleUnit: "",
    riskLevel: "",
    scale: "中型",
    stableLevel: "",
    status: "",
    thickness: 0,
    threatenFamily: 5,
    threatenMoney: 0,
    threatenPopulation: "11",
    threatenType: "",
    town: "琉璃庙镇",
    trigger: "",
    type: "泥石流",
    village: "孙胡沟村",
    volume: "",
    volumePotential: "",
    width: 0,
  },
  {
    activeStatus: "",
    areaCode: "",
    areaName: "",
    brookLength: 0,
    checkId: "",
    city: "北京市",
    codeProvince: "110116",
    county: "怀柔",
    dangerLevel: "",
    disasterStatus: "",
    drainageArea: "",
    elevation: 0,
    featureDes: "",
    groupMonitor: "李桂梅,孙桂和,范满田,秦建权,孙桂江,孙桂伟",
    hasPlan: "",
    id: "110116030076",
    latitude: 40.55972222,
    length: 0,
    district: "琉璃庙镇孙胡沟村东坎大东沟",
    longitude: 116.5916667,
    monitor: "",
    monitorAdvice: "",
    name: "大东沟泥石流隐患点",
    number:
      "13716108909,13716029391,13716291714,13716191943,13716427398,13124792612",
    preventionDes: "已治理",
    preventionLevel: "",
    preventionPlan: "定期巡查,预警转移",
    preventionUnit: "乡镇",
    principal: "",
    province: "北京市",
    qp: "",
    reason: "",
    responsibleUnit: "",
    riskLevel: "",
    scale: "小型",
    stableLevel: "",
    status: "",
    thickness: 0,
    threatenFamily: 1,
    threatenMoney: 0,
    threatenPopulation: "2",
    threatenType: "",
    town: "琉璃庙镇",
    trigger: "",
    type: "泥石流",
    village: "孙胡沟村",
    volume: "",
    volumePotential: "",
    width: 0,
  },
  {
    activeStatus: "",
    areaCode: "",
    areaName: "",
    brookLength: 0,
    checkId: "",
    city: "北京市",
    codeProvince: "110116",
    county: "怀柔",
    dangerLevel: "",
    disasterStatus: "",
    drainageArea: "",
    elevation: 0,
    featureDes: "",
    groupMonitor: "李桂梅,孙桂和,范满田,秦建权,孙桂江,孙桂伟",
    hasPlan: "",
    id: "110116030074",
    latitude: 40.56580556,
    length: 0,
    district: "琉璃庙镇孙胡沟村尹家西沟",
    longitude: 116.59,
    monitor: "",
    monitorAdvice: "",
    name: "尹家西沟泥石流隐患点",
    number:
      "13716108909,13716029391,13716291714,13716191943,13716427398,13124792612",
    preventionDes:
      "已监测;灾害体变化:4处坡积物垮塌,堆积至坡脚,方量约20m³。",
    preventionLevel: "",
    preventionPlan: "定期巡查,预警转移",
    preventionUnit: "乡镇",
    principal: "",
    province: "北京市",
    qp: "",
    reason: "",
    responsibleUnit: "",
    riskLevel: "",
    scale: "中型",
    stableLevel: "",
    status: "",
    thickness: 0,
    threatenFamily: 7,
    threatenMoney: 0,
    threatenPopulation: "12",
    threatenType: "",
    town: "琉璃庙镇",
    trigger: "",
    type: "泥石流",
    village: "孙胡沟村",
    volume: "",
    volumePotential: "",
    width: 0,
  },
  {
    activeStatus: "",
    areaCode: "",
    areaName: "",
    brookLength: 0,
    checkId: "",
    city: "北京市",
    codeProvince: "110116",
    county: "怀柔",
    dangerLevel: "",
    disasterStatus: "",
    drainageArea: "",
    elevation: 0,
    featureDes: "",
    groupMonitor: "李桂梅,孙桂和,范满田,秦建权,孙桂江,孙桂伟",
    hasPlan: "",
    id: "110116030053",
    latitude: 40.57361111,
    length: 0,
    district: "琉璃庙镇孙胡沟村北大地西洼子沟",
    longitude: 116.5897222,
    monitor: "",
    monitorAdvice: "",
    name: "北大地西洼子沟泥石流隐患点",
    number:
      "13716108909,13716029391,13716291714,13716191943,13716427398,13124792612",
    preventionDes: "沟口正对房屋,降雨时出水量大,建议治理,汛期加强巡查",
    preventionLevel: "",
    preventionPlan: "定期巡查,预警转移,立警示牌",
    preventionUnit: "乡镇",
    principal: "",
    province: "北京市",
    qp: "",
    reason: "",
    responsibleUnit: "",
    riskLevel: "",
    scale: "中型",
    stableLevel: "",
    status: "",
    thickness: 0,
    threatenFamily: 6,
    threatenMoney: 0,
    threatenPopulation: "10",
    threatenType: "",
    town: "琉璃庙镇",
    trigger: "",
    type: "泥石流",
    village: "孙胡沟村",
    volume: "",
    volumePotential: "",
    width: 0,
  },
  {
    activeStatus: "",
    areaCode: "",
    areaName: "",
    brookLength: 0,
    checkId: "",
    city: "北京市",
    codeProvince: "110116",
    county: "怀柔",
    dangerLevel: "",
    disasterStatus: "",
    drainageArea: "",
    elevation: 0,
    featureDes: "",
    groupMonitor: "李桂梅,孙桂和,范满田,秦建权,孙桂江,孙桂伟",
    hasPlan: "",
    id: "110116020102",
    latitude: 40.55972222,
    length: 0,
    district: "琉璃庙镇孙胡沟村范家庄王秀莲家屋后",
    longitude: 116.5922222,
    monitor: "",
    monitorAdvice: "",
    name: "范家庄王秀莲家屋后崩塌隐患点",
    number:
      "13716108909,13716029391,13716291714,13716191943,13716427398,13124792612",
    preventionDes: "边坡较陡,顺向岩层,房屋靠近坡脚,建议尽快治理",
    preventionLevel: "",
    preventionPlan: "定期巡查,预警转移,立警示牌",
    preventionUnit: "乡镇",
    principal: "",
    province: "北京市",
    qp: "",
    reason: "",
    responsibleUnit: "",
    riskLevel: "",
    scale: "小型",
    stableLevel: "",
    status: "",
    thickness: 0,
    threatenFamily: 1,
    threatenMoney: 0,
    threatenPopulation: "3",
    threatenType: "",
    town: "琉璃庙镇",
    trigger: "",
    type: "崩塌",
    village: "孙胡沟村",
    volume: "",
    volumePotential: "",
    width: 0,
  },
  {
    activeStatus: "",
    areaCode: "",
    areaName: "",
    brookLength: 0,
    checkId: "",
    city: "北京市",
    codeProvince: "110116",
    county: "怀柔",
    dangerLevel: "",
    disasterStatus: "",
    drainageArea: "",
    elevation: 0,
    featureDes: "",
    groupMonitor: "李桂梅,孙桂和,范满田,秦建权,孙桂江,孙桂伟",
    hasPlan: "",
    id: "110116020742",
    latitude: 40.57680556,
    length: 0,
    district: "琉璃庙镇孙胡沟村三亩地范忠田家屋后",
    longitude: 116.5887222,
    monitor: "",
    monitorAdvice: "",
    name: "三亩地范忠田家屋后崩塌隐患点",
    number:
      "13716108909,13716029391,13716291714,13716191943,13716427398,13124792612",
    preventionDes: "",
    preventionLevel: "",
    preventionPlan: "定期巡查,预警转移,更换警示牌",
    preventionUnit: "乡镇",
    principal: "",
    province: "北京市",
    qp: "",
    reason: "",
    responsibleUnit: "",
    riskLevel: "",
    scale: "中型",
    stableLevel: "",
    status: "",
    thickness: 0,
    threatenFamily: 8,
    threatenMoney: 0,
    threatenPopulation: "23",
    threatenType: "",
    town: "琉璃庙镇",
    trigger: "",
    type: "崩塌",
    village: "孙胡沟村",
    volume: "",
    volumePotential: "",
    width: 0,
  },
  {
    activeStatus: "",
    areaCode: "",
    areaName: "",
    brookLength: 0,
    checkId: "",
    city: "北京市",
    codeProvince: "110116",
    county: "怀柔",
    dangerLevel: "",
    disasterStatus: "",
    drainageArea: "",
    elevation: 0,
    featureDes: "",
    groupMonitor: "李桂梅,孙桂和,范满田,秦建权,孙桂江,孙桂伟",
    hasPlan: "",
    id: "110116030040",
    latitude: 40.56344444,
    length: 0,
    district: "琉璃庙镇孙胡沟村河西于家西沟",
    longitude: 116.5953889,
    monitor: "",
    monitorAdvice: "",
    name: "于家西沟泥石流隐患点",
    number:
      "13716108909,13716029391,13716291714,13716191943,13716427398,13124792612",
    preventionDes:
      "已监测,2018村已治理;沟口堆积扇明显,正对房屋,建议汛期加强巡查",
    preventionLevel: "",
    preventionPlan: "定期巡查,预警转移",
    preventionUnit: "乡镇",
    principal: "",
    province: "北京市",
    qp: "",
    reason: "",
    responsibleUnit: "",
    riskLevel: "",
    scale: "中型",
    stableLevel: "",
    status: "",
    thickness: 0,
    threatenFamily: 18,
    threatenMoney: 0,
    threatenPopulation: "59",
    threatenType: "",
    town: "琉璃庙镇",
    trigger: "",
    type: "泥石流",
    village: "孙胡沟村",
    volume: "",
    volumePotential: "",
    width: 0,
  },
  {
    activeStatus: "",
    areaCode: "",
    areaName: "",
    brookLength: 0,
    checkId: "",
    city: "北京市",
    codeProvince: "110116",
    county: "怀柔",
    dangerLevel: "",
    disasterStatus: "",
    drainageArea: "",
    elevation: 0,
    featureDes: "",
    groupMonitor: "李桂梅,孙桂和,范满田,秦建权,孙桂江,孙桂伟",
    hasPlan: "",
    id: "110116030055",
    latitude: 40.55283333,
    length: 0,
    district: "琉璃庙镇孙胡沟村椴树底下东沟",
    longitude: 116.5999444,
    monitor: "",
    monitorAdvice: "",
    name: "椴树底下东沟泥石流隐患点",
    number:
      "13716108909,13716029391,13716291714,13716191943,13716427398,13124792612",
    preventionDes: "已治理:威胁对象重复:与110116030015重复5户11人",
    preventionLevel: "",
    preventionPlan: "定期巡查,预警转移,立警示牌",
    preventionUnit: "乡镇",
    principal: "",
    province: "北京市",
    qp: "",
    reason: "",
    responsibleUnit: "",
    riskLevel: "",
    scale: "中型",
    stableLevel: "",
    status: "",
    thickness: 0,
    threatenFamily: 5,
    threatenMoney: 0,
    threatenPopulation: "11",
    threatenType: "",
    town: "琉璃庙镇",
    trigger: "",
    type: "泥石流",
    village: "孙胡沟村",
    volume: "",
    volumePotential: "",
    width: 0,
  },
  {
    activeStatus: "",
    areaCode: "",
    areaName: "",
    brookLength: 0,
    checkId: "",
    city: "北京市",
    codeProvince: "110116",
    county: "怀柔",
    dangerLevel: "",
    disasterStatus: "",
    drainageArea: "",
    elevation: 0,
    featureDes: "",
    groupMonitor: "李桂梅,孙桂和,范满田,秦建权,孙桂江,孙桂伟",
    hasPlan: "",
    id: "110116030054",
    latitude: 40.56166667,
    length: 0,
    district: "琉璃庙镇孙胡沟村上台子河东南沟",
    longitude: 116.5997222,
    monitor: "",
    monitorAdvice: "",
    name: "河东南沟泥石流隐患点",
    number:
      "13716108909,13716029391,13716291714,13716191943,13716427398,13124792612",
    preventionDes: "已监测",
    preventionLevel: "",
    preventionPlan: "定期巡查,立警示牌",
    preventionUnit: "乡镇",
    principal: "",
    province: "北京市",
    qp: "",
    reason: "",
    responsibleUnit: "",
    riskLevel: "",
    scale: "小型",
    stableLevel: "",
    status: "",
    thickness: 0,
    threatenFamily: 0,
    threatenMoney: 0,
    threatenPopulation: "",
    threatenType: "",
    town: "琉璃庙镇",
    trigger: "",
    type: "泥石流",
    village: "孙胡沟村",
    volume: "",
    volumePotential: "",
    width: 0,
  },
]);
function getData() {
  getDistrictData().then((res) => {
    districtList.value = res.data;
  });
}
const districtList = ref([]);
const loading = ref(true); // 控制加载状态
function handleClick(district) {
  const entity = viewer.entities.getById(district.id);
  const entity = viewer.entities.getById(district.hdId);
  if (entity) {
    viewer.flyTo(entity, {
      offset: {
@@ -708,29 +103,131 @@
      },
    });
  }
  // if (entity) {
  //    viewer.flyTo(entity)
  // }
}
const handleCleanup = async () => {
  await Promise.all(
    districtList.value.map((item) => removeEntities(item.hdId))
  );
};
const initializeDevicePoints = async () => {
  await Promise.all(
    districtList.value.map(async (item, index) => {
      // 根据需求可增删
      item.id = item.hdId;
      item.name = item.hdName;
      item.latitude = item.lat;
      item.longitude = item.lon;
      item.showBillboard = true;
      item.type = item.disasterType;
      item.className = "district";
      await createPoint(item);
      // 打印每个设备的名称和设备类型
      // console.log(`设备名称: ${item.id}, 设备类型: ${item.name}`);
    })
  );
};
// 根据区域名称过滤数据
const filterDataByArea = async (areaName) => {
  handleCleanup();
  if (!areaName || !simStore.DangerPoint || simStore.DangerPoint.length === 0) {
    districtList.value = [];
    return;
  }
  const filteredData = simStore.DangerPoint.filter((item) =>
    item.position?.includes(areaName)
  );
function initDistrictPoint() {
  districtList.value.forEach((item) => {
    item.showBillboard = false;
    item.className = "district";
  if (JSON.stringify(districtList.value) !== JSON.stringify(filteredData)) {
    districtList.value = filteredData;
    await initializeDevicePoints();
  }
};
    createPoint(item);
  });
}
// 处理区域变化事件
const handleChange = (item) => {
  const areaName = item;
  if (!areaName) {
    ElMessage.warning("请选择一个区域");
    return;
  }
  filterDataByArea(areaName);
};
let isInitialized = false;
watch(
  () => simStore.DangerShowSwitch,
  async (newValue, oldValue) => {
    console.log("当前状态:", newValue);
    if (newValue) {
      if (!isInitialized) {
        await initializeDevicePoints();
        isInitialized = true;
      }
    } else {
      handleCleanup();
      isInitialized = false;
    }
  }
);
// 监听 simStore.DangerPoint 变化
watch(
  () => simStore.DangerPoint,
  (newVal) => {
    if (newVal && newVal.length > 0) {
      filterDataByArea(selectValue.value);
      loading.value = false; // 数据加载完成
    } else {
      handleCleanup();
      districtList.value = [];
      loading.value = true; // 数据未准备就绪
    }
  }
);
onMounted(() => {
  getData();
  // initDistrictPoint()
});
onBeforeUnmount(() => {
  // removeEntities()
  handleCleanup();
  initeWaterPrimitiveView();
  // 默认先检查一遍数据
  if (simStore.DangerPoint && simStore.DangerPoint.length > 0) {
    filterDataByArea("孙胡沟");
    loading.value = false;
  } else {
    loading.value = true;
  }
});
</script>
<style lang="less" scoped>
.loading-overlay {
  position: absolute;
  top: 120px;
  left: 0px;
  right: 0px;
  bottom: 10px;
  background-color: rgba(47, 44, 44, 0.5);
  /* 半透明遮罩 */
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 999;
}
.spinner {
  width: 40px;
  height: 40px;
  border: 4px solid #fff;
  border-top: 4px solid transparent;
  border-radius: 50%;
  animation: spin 1s linear infinite;
}
@keyframes spin {
  to {
    transform: rotate(360deg);
  }
}
.district {
  position: absolute;
  width: 345px;
@@ -745,9 +242,12 @@
  cursor: pointer;
  margin-top: 10px;
}
.district-content {
  padding: 10px;
  box-sizing: border-box;
}
.district-item-icon {
  background: url("@/assets/img/menu/locationicon.png") no-repeat;
  background-position: 5px 5px;
@@ -759,10 +259,22 @@
.district-item-text {
  color: white;
  line-height: 30px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.loading-text {
  color: white;
  font-size: 14px;
  text-align: center;
  margin-top: 20px;
}
/deep/ .el-select__placeholder {
  color: white;
}
/deep/ .el-select-dropdown__item.hover,
.el-select-dropdown__item:hover {
  color: white !important;