Вычислить среднее значение направления ветра в MySQL

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