You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaScript中计算一段时间内的平均风速与风向?

如何计算一段时间内的平均风速与风向?

一、平均风速计算

平均风速的计算很直接,取所有风速值的算术平均值即可:
平均风速 = 所有风速之和 / 数据点数量

二、平均风向计算(加权矢量平均法)

风向是圆周型数据,不能直接对字符串取平均,必须通过矢量加权平均的方式计算:

  1. 风向转角度:先将方位字符串(如S、NE)映射为对应的角度(标准16方位,每个间隔22.5°)
  2. 计算矢量分量:对每个数据点,结合风速计算东向(x)和北向(y)的矢量分量
  3. 求分量平均值:计算所有x、y分量的平均值
  4. 合成平均角度:通过反正切函数得到合成角度,再转换为0-360°范围
  5. 角度转风向:将合成角度映射回对应的方位字符串

JavaScript 实现代码

// 标准16风向与角度的映射关系
const directionToDegree = {
  N: 0,
  NNE: 22.5,
  NE: 45,
  ENE: 67.5,
  E: 90,
  ESE: 112.5,
  SE: 135,
  SSE: 157.5,
  S: 180,
  SSW: 202.5,
  SW: 225,
  WSW: 247.5,
  W: 270,
  WNW: 292.5,
  NW: 315,
  NNW: 337.5
};

// 将角度转换为对应风向字符串的辅助函数
function degreeToDirection(degree) {
  // 确保角度在0-360°范围内
  const normalizedDegree = (degree % 360 + 360) % 360;
  // 计算对应16风向的索引
  const directionIndex = Math.round(normalizedDegree / 22.5) % 16;
  const directionList = ["N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"];
  return directionList[directionIndex];
}

// 计算平均风速与风向的核心函数
function calculateWindStats(directions, speeds) {
  // 校验输入数据长度一致
  if (directions.length !== speeds.length) {
    throw new Error("风向列表与风速列表长度必须匹配");
  }

  // 计算平均风速
  const totalSpeed = speeds.reduce((sum, speed) => sum + speed, 0);
  const averageSpeed = totalSpeed / speeds.length;

  // 计算矢量分量总和
  let totalX = 0;
  let totalY = 0;
  for (let i = 0; i < directions.length; i++) {
    const currentDir = directions[i];
    const currentSpeed = speeds[i];
    const degree = directionToDegree[currentDir];
    
    if (degree === undefined) {
      throw new Error(`不支持的风向类型:${currentDir}`);
    }

    // 角度转弧度
    const radian = (degree * Math.PI) / 180;
    // 计算东向(x)和北向(y)分量
    totalX += currentSpeed * Math.cos(radian);
    totalY += currentSpeed * Math.sin(radian);
  }

  // 计算平均分量
  const averageX = totalX / directions.length;
  const averageY = totalY / directions.length;

  // 计算合成角度并转换为0-360°
  let averageDegree = (Math.atan2(averageY, averageX) * 180) / Math.PI;
  averageDegree = (averageDegree + 360) % 360;

  // 转换为风向字符串
  const averageDirection = degreeToDirection(averageDegree);

  return {
    averageSpeed: averageSpeed.toFixed(2), // 保留两位小数
    averageDirection: averageDirection
  };
}

// 示例数据
const directions = ["S","S","NE","SW","NNE","N"];
const speeds     = [11,9,9,7,18,10];

// 执行计算并输出结果
const windStats = calculateWindStats(directions, speeds);
console.log(`平均风速:${windStats.averageSpeed}`);
console.log(`平均风向:${windStats.averageDirection}`);

代码说明

  • 采用加权矢量平均:风速越大,对整体风向的权重越高,计算结果更贴合实际风的趋势
  • 兼容标准16方位:覆盖常见的风向表示,转换逻辑准确
  • 加入输入校验:避免因数据不匹配导致的错误
  • 结果格式化:平均风速保留两位小数,风向转换为标准字符串

内容的提问来源于stack exchange,提问作者Kevin Potgieter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 08:01:55