wangjuncheng
2025-05-19 f5688d9765782bbb97b3abb8ee99fe7b9834a149
src/components/menu/Location.vue
@@ -7,19 +7,8 @@
    <div class="left-content district-content">
      <div style="margin-left: 5px">
        <span style="color: white">重点沟:</span>
        <el-select
          @change="handleChange"
          v-model="selectValue"
          placeholder="Select"
          size="large"
          style="width: 240px"
        >
          <el-option
            v-for="item in options"
            :key="item.value"
            :label="item.label"
            :value="item.value"
          />
        <el-select @change="handleChange" v-model="selectValue" placeholder="Select" size="large" style="width: 240px">
          <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
        </el-select>
      </div>
@@ -29,13 +18,7 @@
        <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 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>
@@ -45,12 +28,25 @@
</template>
<script setup>
import { ref, onMounted, watch } from "vue";
import { createPoint } from "@/utils/map";
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([
@@ -91,9 +87,27 @@
    });
  }
}
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 = (areaName) => {
const filterDataByArea = async (areaName) => {
  handleCleanup();
  if (!areaName || !simStore.DangerPoint || simStore.DangerPoint.length === 0) {
    districtList.value = [];
    return;
@@ -102,6 +116,7 @@
  districtList.value = simStore.DangerPoint.filter((item) =>
    item.position?.includes(areaName)
  );
  await initializeDevicePoints();
};
// 处理区域变化事件
@@ -111,10 +126,15 @@
    ElMessage.warning("请选择一个区域");
    return;
  }
  filterDataByArea(areaName);
};
watch(() => simStore.DangerShowSwitch, (newValue, oldValue) => {
  if (newValue) {
    initializeDevicePoints();
  } else {
    handleCleanup()
  }
});
// 监听 simStore.DangerPoint 变化
watch(
  () => simStore.DangerPoint,
@@ -123,6 +143,7 @@
      filterDataByArea(selectValue.value);
      loading.value = false; // 数据加载完成
    } else {
      handleCleanup();
      districtList.value = [];
      loading.value = true; // 数据未准备就绪
    }
@@ -131,6 +152,8 @@
);
onMounted(() => {
  handleCleanup()
  initeWaterPrimitiveView()
  // 默认先检查一遍数据
  if (simStore.DangerPoint && simStore.DangerPoint.length > 0) {
    filterDataByArea("孙胡沟");
@@ -148,7 +171,8 @@
  left: 0px;
  right: 0px;
  bottom: 10px;
  background-color: rgba(236, 233, 233, 0.5); /* 半透明遮罩 */
  background-color: rgba(236, 233, 233, 0.5);
  /* 半透明遮罩 */
  display: flex;
  align-items: center;
  justify-content: center;
@@ -169,6 +193,7 @@
    transform: rotate(360deg);
  }
}
.district {
  position: absolute;
  width: 345px;
@@ -183,10 +208,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;
@@ -213,6 +240,7 @@
/deep/ .el-select__placeholder {
  color: white;
}
/deep/ .el-select-dropdown__item.hover,
.el-select-dropdown__item:hover {
  color: white !important;