У меня есть таблица с направлением ветра (среди других значений погоды) каждые 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