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.