如何在JavaScript中计算一段时间内的平均风速与风向?
如何计算一段时间内的平均风速与风向?
一、平均风速计算
平均风速的计算很直接,取所有风速值的算术平均值即可:平均风速 = 所有风速之和 / 数据点数量
二、平均风向计算(加权矢量平均法)
风向是圆周型数据,不能直接对字符串取平均,必须通过矢量加权平均的方式计算:
- 风向转角度:先将方位字符串(如S、NE)映射为对应的角度(标准16方位,每个间隔22.5°)
- 计算矢量分量:对每个数据点,结合风速计算东向(x)和北向(y)的矢量分量
- 求分量平均值:计算所有x、y分量的平均值
- 合成平均角度:通过反正切函数得到合成角度,再转换为0-360°范围
- 角度转风向:将合成角度映射回对应的方位字符串
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
相关产品推荐
相关产品推荐

