gpt4 book ai didi

mysql - 在MySQL中计算风向的平均值

转载 作者:可可西里 更新时间:2023-11-01 07:05:31 25 4
gpt4 key购买 nike

我有一个表格,每 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

最佳答案

最初建议的问题是它总是添加 360,而实际上您只想在 atan2 给出否定结果时添加 360。这可以用 IF 语句排序,但它比原来的更笨重!

IF( degrees (atan2( sum(sin(radians(WindDirection))) , sum(cos(radians(WindDirection))) ) )<0,
360+degrees ( atan2( sum(sin(radians(WindDirection))), sum(cos(radians(WindDirection))) )),
degrees(atan2(sum(sin(radians(WindDirection))), sum(cos(radians(MastDirection))) )) ) AS angle

第二种解决方案不能用于时间平均,因为它不是聚合函数。

我管理过的最佳解决方案实际上使用了一个存储函数,如果您对数据库具有如下权限,则可以创建该函数:

CREATE FUNCTION Vavg (sumsindir FLOAT,sumcosdir FLOAT) 
RETURNS FLOAT DETERMINISTIC
RETURN IF( DEGREES(ATAN2(sumsindir,sumcosdir))<0,360+DEGREES(ATAN2(sumsindir,sumcosdir)) , DEGREES(ATAN2(sumsindir,sumcosdir)))

然后您可以通过在查询中调用该函数来计算平均值:

SELECT VavgTest( sum(sin(radians(WindDirection))),sum(cos(radians(WindDirection))) ) AS vectorAverage FROM table GROUP BY HOUR(MyTimestamp),DAYOFYEAR(MyTimestamp),YEAR(MyTimestamp)
ORDER BY MyTimestamp;

我将分组依据包括在内,以表明平均过程适用于任何平均周期。

我怀疑实际的最佳答案是使用用户定义的函数,但我没有做到这一点,因为它必须用 C 或 C++ 完成,而且我没有这些语言的任何背景。

关于mysql - 在MySQL中计算风向的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10832287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com