Pod koniec 2013 roku wpadłem na pomysł, aby regularnie zapisywać sobie obrazek (mapę) przedstawiający aktualne lokalizacje wyładowań atmosferycznych. Korzystałem wtedy ze strony blide.de. Oczywiście nie miałem na myśli robienia tego ręcznie, więc uruchomiłem na serwerze skrypt, który równo co 15 minut zapisywał aktualny obrazek. Skrypt działa do dziś i cały czas zapisuje aktualne mapy. Przypomniałem sobie o nim, gdy na serwerze zaczęło brakować miejsca na dane. Pobrałem obrazki na swój komputer i zacząłem zabawę. Na pierwszy ogień poszedł pierwszy pełny rok – 2014.
Teoretycznie w ciągu 365 dni powinienem zapisać 365*24*4 = 35040 obrazków. Faktycznie zapisałem 34999, czyli całkiem nieźle. Pierwsza, oczywista myśl to animacja. Połączyłem wszystkie obrazki w filmik:
W kolejnym korku chciałem podejść do tematu bardziej kompleksowo. Jak oszacować ilość wyładowań dla każdej z map. Oczywiście ilości się nie da, ale da się oszacować obszar objęty burzą. Na mapach kolorem czerwonym oznaczone są miejsca, gdzie wystąpiło co najmniej jedno wyładowanie w przeciągu ostatnich 15 minut. Niestety pliki są zapisane w mocno skompresowanym jpg, ale wyraźnie widać co czerwone a co nie. Napisałem na kolanie szybki skrypt w Matlabie:
clear;clc files=dir('2014/blids/*.png'); S = zeros(length(files), 2); for a = 1:length(files) name = ['2014/blids/' files(a).name]; C = strsplit(name, '/'); C2 = strsplit(C{end},'.'); date = C2{1}; time = C2{2}; I = imread(name); idx = (I(:,:,1)>100 & I(:,:,2)<100 & I(:,:,3)<100); S(a,1) = sum(sum(idx)); S(a,2) = datenum(str2double(date(1:4)), str2double(date(5:6)), str2double(date(7:8)), str2double(time(1:2)), str2double(time(3:4)), 0); fprintf('%d\t%d\n',a,S(a,1)); end
Dla każdej mapy skrypt obliczył i zapisał ilość pikseli, w których miały miejsca wyładowania. Teraz wystarczy to ładnie nanieść na wykres: np. sumarycznie dla każdego dnia.
clf days = datenum(2014,01,01):datenum(2014,12,31); storm = zeros(size(days)); for d = 1:length(days) storm(d) = sum(S(S(:,2)>=days(d)&S(:,2)0)=log10(storm(storm>0)); stairs(days-datenum(2014,01,01),storm, 'LineWidth',2) axis([0 365 0 2.5e5]) hold on for month = 1:12 plot(ones(1,2)*datenum(2014,month,1)-datenum(2014,01,01),[0 2.5e5], 'k--') end
A oto efekt:
Pionowe linie oddzielają kolejne miesiące. Widać wzmożoną aktywność burzową od kwietnia do września. Maksimum przypada na początku sierpnia, co widać na filmie.
Jak wykorzystalibyście takie dane? W wolnej chwili zrobię animację i wykres dla 2015 roku.
adres |