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.
Przyznam ze ciekawie to wygląda
OdpowiedzUsuń