我每 10 秒在新行上有一张风向表(以及其他天气值)。方向存储为度数:0 - 360。
目的
这个平均值是什么意思?数据库每 10 秒存储一行信息。对于性能问题,我想将 5 天之前的数据汇总到每小时一条(平均)行。
使用温度很容易实现: avg(temp) 可以解决问题,因为温度不会在不同的值之间跳跃。
在盛行的风中,要获得这个“平均值”要困难得多。
以度为单位计算平均风向并不像使用聚合函数 avg() 那样简单,因为它是一个圆,例如:
dir1 = 10; dir2 = 350;
avg() = (10+350)/2 = 180;
哪个不准确;它应该是:0 或 360。
因此,我在大学里的三角学课程在我的脑后想,如果我将它转换为弧度,并计算 x 和 y 分量,我将能够重新计算平均方向。
在 php 中,$w['w'] 是存储在数据库中的方向。
while($w = $stmt->fetch()){
$x += cos(deg2rad($w['w']));
$y += sin(deg2rad($w['w']));
}
$angle = atan2($y, $x);
$angle = 360 + round(rad2deg($angle));
这个公式正确吗?
如果这个公式是正确的;理想情况下,我想获得 MySQL 的完整功能。我用它做了这个;但我发现很多()的......
(360 + degrees(atan2(sum(sin(radians(W))), sum(cos(radians(W))))))) AS angle