wangjuncheng
2025-07-01 df0edc253bd3e38994ca0abd871d18abd0b4040f
实时模拟更新下雨情况
已修改1个文件
92 ■■■■ 文件已修改
src/components/menu/TimeLine.vue 92 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/menu/TimeLine.vue
@@ -302,7 +302,17 @@
      // 如果需要触发某些更新函数,也可以保留
      updateWaterColorByTime();
      updateWeatherByProgress();
      // updateWeatherByProgress();
      // 修改为固定阶段,缓慢下雨的状态
      const rainParams = {
        rainSize: 0.5,
        rainSpeed: 20,
        rainDensity: 15,
        rainColor: "#ADD8E6",
      };
      console.log("实时模拟开始下雨");
      // 调用工具方法更新雨效
      mapUtils.toggleRain(rainParams, true);
    }, 5000); // 每 5 秒执行一次
  } else {
    // 这里面还是你的播放代码,上面的if中是五秒钟跳动一次的实时模拟
@@ -344,9 +354,10 @@
    console.warn("selectedScheme 或 data 不存在");
    return;
  }
  // 注意:有时 data 可能是一个字符串(例如 JSON 字符串)
  let data = selectedScheme.value.data;
  // 如果是字符串,则尝试解析成对象
  // 如果是字符串,则尝试解析为对象
  if (typeof data === "string") {
    try {
      data = JSON.parse(data);
@@ -356,28 +367,69 @@
      return;
    }
  }
  // 打印降雨强度的单位
  console.log("降雨强度的单位是:", data.intensityUnit);
  // 根据 intensityUnit 调整 rainfalls 中的 intensity 值
  // if (data.intensityUnit === "mm/min") {
  //   data.rainfalls.forEach((r) => (r.intensity *= 60));
  //   console.log("将 mm/min 转换为 mm/h 后的 rainfalls:", data.rainfalls);
  // } else if (data.intensityUnit === "mm/5min") {
  //   data.rainfalls.forEach((r) => (r.intensity *= 12));
  //   console.log("将 mm/5min 转换为 mm/h 后的 rainfalls:", data.rainfalls);
  // } else if (data.intensityUnit !== "mm/h") {
  //   console.warn("未知的 intensity 单位,无法进行转换");
  // }
  const rainfallList = data.rainfalls;
  console.log("最终的 rainfallList:", rainfallList);
  rainTotalInfo.value = rainfallList;
  calculateTimeStep(rainTotalInfo.value);
  // 使用示例
  // 判断 rainfalls 是否为对象,如果是则转成数组
  let rainfalls = data.rainfalls;
  if (typeof rainfalls === "object" && !Array.isArray(rainfalls)) {
    rainfalls = Object.values(rainfalls);
    console.warn("⚠️ rainfalls 是对象,已转换为数组");
  }
  // 按小时聚合降雨数据
  const hourlyRainfallMap = {};
  rainfalls.forEach((record) => {
    const originalTime = new Date(record.time);
    if (isNaN(originalTime.getTime())) {
      console.warn("无效的时间格式:", record.time);
      return;
    }
    // 构造“小时”级别的时间键,比如:2024-08-25 20:00:00
    const hourKey = new Date(
      originalTime.getFullYear(),
      originalTime.getMonth(),
      originalTime.getDate(),
      originalTime.getHours()
    );
    const hourStr = hourKey.toISOString().slice(0, 16).replace("T", " ");
    if (!hourlyRainfallMap[hourStr]) {
      hourlyRainfallMap[hourStr] = {
        intensity: 0,
        time: hourStr,
        total: record.total, // 默认用第一个记录的 total
      };
    }
    hourlyRainfallMap[hourStr].intensity += record.intensity;
    // 取最大的 total(因为是累积值)
    if (record.total > hourlyRainfallMap[hourStr].total) {
      hourlyRainfallMap[hourStr].total = record.total;
    }
  });
  // 转换 map 成数组并排序
  const hourlyRainfallList = Object.values(hourlyRainfallMap).sort((a, b) =>
    a.time.localeCompare(b.time)
  );
  console.log("✅ 按小时聚合后的降雨数据:", hourlyRainfallList);
  // 设置全局变量
  rainTotalInfo.value = hourlyRainfallList;
  // 计算时间步长
  timeStepInfo = calculateTimeStep(rainTotalInfo.value);
  // 提取 intensity 值
  rainFallValues.value = rainfallList.map((r) => r.intensity);
  rainFallValues.value = hourlyRainfallList.map((r) => r.intensity);
  minRainValue.value = Math.min(...rainFallValues.value);
  maxRainValue.value = Math.max(...rainFallValues.value);
  console.log(
    "当前方案下最小雨量和最大雨量:",
    minRainValue.value,