poniedziałek, 2 listopada 2020

Prognoza falowania Bałtyku


Oryginalny plik prognozy

Wycięty fragment

`Podglądówka' całej prognozy

Są na stronie http://www.meteo.pl/ udostępnione 120h prognozy falowania Bałtyku w postaci rysunków. Na tych rysunkach wysokość fal jest odwzorowana kolorem od czerwonego do jasno niebieskiego (najmniejsze). Kierunek fal jest odwzorowany strzałkami. Są też dostępne dane historyczne.

Wszystko jest łatwe do pobrania, bo nazwa pliku historycznego to na przykład wavehgt_0W_2015122200_015-00.png czyli wavehgt_0W_YYYYMMDD00_0HH-00.png (gdzie HH to 03/09/15/21). Pliki prognoz mają też nazwy wg schematu: wavehgt_0W_YYYYMMDD00_HHH-00.png, tyle że HHH się zmienia w zakresie 12--120 co trzy (godziny).

Pobieram wgetem 8 plików 12--120. Teraz trzeba ustalić jakie są kolory na obrazku i wysłać komunikat (analiza strzałek to beznadzieja sprawa, nawet się nie zabieram.)

Zaczynam od wycięcia interesującego mnie fragmentu Bałtyku:

## 8 plików 12--120
convert wavehgt_0W_YYYYMMDD00_HHH-00.png-00.png -crop 65x86+280+575 \
 wavehgt_0W_YYYYMMDD00_HHH-00.png-00D.png
## Wypisz kolory z rysunku:
convert wavehgt_0W_YYYYMMDD00_HHH-00.png-00D.png \
  -define histogram:unique-colors=true -format %c histogram:info:- | \
  getMaxFala.pl 
## Łączę w jeden:
montage PLIKI... -tile 2x4 -border 4 -geometry 480  S_YYYMMDD.png

Plik getMaxFala.pl zwraca kolor odpowiadający za najwyższą falę. Szczęśliwie tych kolorów za dużo nie jest, więc sprawdzanie jest enumeratywne

Mając najwyższe fale w horyzoncie 12--120 ustalamy max z tych 8 liczb i wypisujemy komunikat (Perl):

print "Max: $maxFF expected (in 120h time window)\n";
print "Details: ";
for $f (sort keys %faleMax) { print "$f = $faleMax{$f} /" }
print "\nAmber likelihood: ";
if ($maxFF < 3) { print "NONE\n" } 
elsif ($maxFF < 4) { print "VERY SMALL\n" }
elsif ($maxFF < 5) { print "SMALL\n" }
elsif ($maxFF < 5) { print "MEDIUM\n" }
elsif ($maxFF < 6) { print "LARGE\n" }
else  { print "Amber: HUGE"}
print "http://pinkaccordions.homelinux.org/fale/forecast/S_${yyyymmdd}.png\n";
print "Bye...\n";

Prawdę powiedziawszy polecenia convert/mogrify/wget też są `wbudowane' w skrypt Perla. Całe zadanie realizuje jeden skrypt, który w efekcie wypisuje na ekran powyższy komunikat:

  ## Fragment skryptu
  $GETMAXFALA='/home/pi/bin/getMaxFala.pl';
  ## ... ##
for $h (@Hours) {
    $hrNo = sprintf "%03.3i", $h;
    $url= "$URL/${yyyymmdd}00/wavehgt_0W_${yyyymmdd}00_${hrNo}-00.png";
    ###print STDERR "$url\n";
    system ("wget $url -O W_${yyyymmdd}00_${hrNo}-00.png");
    system ("convert W_${yyyymmdd}00_${hrNo}-00.png -crop 280x330+125+350 -fill red" .
        " -annotate +140+360 '$monthNo/${dayNo}+${hrNo}' -pointsize 24 -fill blue" .
        " W_${yyyymmdd}00_${hrNo}-00_C.png");
    #### Miniatura zatoki
    system ("convert W_${yyyymmdd}00_${hrNo}-00.png -crop 65x86+280+575 W_${yyyymmdd}00_${hrNo}-00_D.png");
    $maxFala = `convert "W_${yyyymmdd}00_${hrNo}-00_D.png" -define histogram:unique-colors=true
       -format %c histogram:info:- | $GETMAXFALA`;
    chomp($maxFala); 
    $files .= "W_${yyyymmdd}00_${hrNo}-00_C.png ";
    $files_S .= "W_${yyyymmdd}00_${hrNo}-00_D.png ";
    $faleMax{"+${hrNo}"}=$maxFala;
}

system ("montage $files -tile 2x4 -border 4 -geometry 480  W_${yyyymmdd}.png" );
system ("montage $files_S -tile 2x4 -border 4 -geometry 480  S_${yyyymmdd}.png" );
$maxFF = max(values(%faleMax)); chomp($maxFF);
  ## .. ##

Ten komunikat (w potoku) czyta inny skrypt i wysyła listy do zainteresowanych.

1 komentarz: