Oman sääsivuston rakentaminen
Meitä sääharrastajia on suomenmaassa enemmän ja vähemmän, mutta vain osalla meistä mahdollisuus investoida tai rakentaa omia säähavaintolaitteita. Oman toimivan melko reaaliaikaisen sääsivun rakentaminen nettiin tai vaikka pelkästään omaksi huviksi ei ole kuitenkaan niitä vaikeimpia - Se vaatii vain vähän viitsimystä.
Tämä artikkeli antaa ohjeita miten saat rakennettua oman METAR-pohjaisen sääsivun joka hakee säätietonsa lähilentokenttien, koko suomen tai vaikkapa koko maailman lentokenttien sääjärjestelmistä. En todellakaan väitä olevani METAR-järjestelmän asiantuntija, mutta itse näitä periaatteita seuraten olen saanut rakennettua tämän sääsivun.
Huom: Jos et halua nähdä vaivaa tai et vain viitsi, netti tarjoaa sekä valmiita sääpalikoita sivuille kuin myös valmiita ohjelmointi-luokkia METAR-tietojen hakemiseen ilman että sinun tarvitsee nähdä suurta vaivaa. Alla oleva artikkeli onkin lähinnä tarkoitettu meille jotka haluamme nähdä hieman enemmän vaivaa sääsivujemme eteen ;) en tietenkään sano että näiden tekniikoiden käyttäjät olisivat mitenkään laiskoja -- mutta he ovat kuitenkin.Suunnitteluvaihe
Oma METAR-pohjaisen sääsivun tekeminen tarvitsee:
- Webbitilaa
- Josta voi ottaa ulospäin yhteyden
- Joka sisältää jonkintapaisen serveripohjaisen ohjelmointirajapinnan (PHP, JSP, ASP, PERL)
- Ajastusjärjestelmän (kuten crontab)
- Tallettustavan (tiedosto- tai tietokanta) johon METAR-tiedot tallennetaan
- Otathan huomioon että mikäli haluat arkistoida säätietoja, varaudu siihen että sinulla on tallennustilaa tiedolle. METAR tiedot päivittyvät tunnin välein ja pitkällä aikavälillä näistä tiedoista voi syntyä hyvinkin suuri määrä tavaraa.
- Hivenen aikaa ja omaa mielenkiintoa
- Ihmisresursseja
- Ohjelmointitaitoja
- Tutkimustyötä METAR-järjestelmän sanarakenteesta (hyvä artikkeli löytyy mm. Wikipediasta)
- Mahdollisti yleisen sääinformaation hankkimista sääsivuille
Mikäli sinulta löytyy yllämainitut webtilat ulospäin pääsevälä yhteydellä sekä ohjelmointirajapinnalla, olet jo puolivälissä. Seuraavaksi on hyvä ymmärtää muutamia periaatteita mistä METAR tieto haetaan ja miten.
Paras paikka METAR tietojen hakemiseen on NOAA eli
Yhdysvaltain liittovaltion sää- ja valtamerentutkimusorganisaatio jonka sivuilta saat koko maailman METAR tiedot heidän WWW palvelunsa kautta. Tietojen hakeminen on täysin ilmaista ja helppoa, sillä kyseiset tiedot ovat tekstitiedostomuodossa.
Tarkka osoite METAR tietopalveluun on
weather.noaa.gov/weather/metar.shtml josta varsinaisen datan säilytyspaikka on
täällä.
NOAA päivittää tietonsa tunnin välein, ja heidän arkistonsa kattaa 24 tuntia taaksepäin. On hyvä ottaa huomioon että heidän metar-päivitys syklinsä ei ole absoluuttinen tuntia kohden, joka tarkoittaa sitä että kaikki lentoasemien säätiedot eivät päivity samalla kellonlyömällä vaan säätietojen päivitysprosessi voi ottaa jopa puolituntia riippuen lentoasemien tarjoamasta määrästä. Tämä on toisaalta ihan ymmärrettävää jos mietimme kuinka monta lentokenttää maailmassa. Uskokaa pois. Niitä on monta.
Tämän vuoksi turvallisin tapa tarkkojen säätietojen hakemiseen on tehdä se tasatunnista noin 30-45 viiveellä jolloin suurin osa METAR tiedoista on varmasti päivittynyt heidän palveimelleen.
Toteutusvaihe
Tietojen hakeminen ja talletusEnsimmäinen vaihe on tietenkin ajastettu tietojen hakeminen. Koska tapoja ja tekniikoita on monia, esittelen tässä ainoastaan minulle tutun tavan eli miten METAR tieto haetaan ja käsitellään PHP:n avulla. Vastuuta en tosin ota koodista sillä tämä on nopeasti kirjoitettu lennossa vain esimerkiksi sen enempää testaamatta.
Yksinkertaisuudessaan sinun on ensiksi tehtävä ohjelmakoodi joka hakee tiedot metar-tiedot.
<?php
//
// METAR-Tiedon hakeminen esimerkki
// huom: Tätä koodia ei ole testattu toiminnassa eikä se ole nyytti.com palvelun omaa koodia vaan
// esimerkiksi tehty koodi. Älä koskaan käytä koodia suoraan ellet tiedä mitä teet.
//
// Janne,
// nyytti.com
//
// PS: Jos käytät koodeja tai niistä on sinulle jollain tavalla apua niin pieni linkki nyytti.comin
// johonkin nurkkaan ei olisi ollenkaan ikävää mutta ei pakollista :)
//
// Koska METAR tieto on UTC muodossa, on meidän myös ensin otettava huomioon kunika paljon
// meidän kellomme on UTC ajassa mitattuna.
$utcAika = time() - (3600*3);
// Haettavan tiedoston nimi on aina hhZ.TXT NOAA:n palvelimella, jossa hh on 24 tuntinen
// UTC aika, joten muutamme ajan oikeaan muotoon
$utcHour = date("H",$utcAika);
// Haemme METAR-tiedoston $metarData muuttujaan. Huomaa @ merkit komentojen edessä
// poistavat mahdolliset virheilmoitukset. Jos tämä ei toimi, poista @ merkit nähdäksesi
// virheet.
$osoite = "http://weather.noaa.gov/pub/data/observations/metar/cycles/{$utcHour}Z.TXT";
$metarData = @file($osoite);
// Seuraava vaihe onkin sitten $metarData tekstimuotoisen sisällön käsittely. Etsi
// tarvitsemasi METAR tiedot ICAO tunnuksen perusteella. ICAO tunnus on aina 4 ensimmäistä
// kirjainta METAR - koodissa.
?>
Seuraava vaihe on haetun tiedoston sisällän läpikäyminen ja tietojen tallettaminen ylös.
<?php
//
// METAR-Rivien lajittelun esimerkki
// huom: Tätä koodia ei ole testattu toiminnassa eikä se ole nyytti.com palvelun omaa koodia vaan
// esimerkiksi tehty koodi. Älä koskaan käytä koodia suoraan ellet tiedä mitä teet.
//
// Janne,
// nyytti.com
//
// PS: Jos käytät koodeja tai niistä on sinulle jollain tavalla apua niin pieni linkki nyytti.comin
// johonkin nurkkaan ei olisi ollenkaan ikävää mutta ei pakollista :)
//
//
// Tämä koodi olettaa että sinulla on saasivu niminen tietokanta jossa metardata niminen table
// tablen rakenne olisi seuraava:
//
// md_id Int, Key, Auto-increment
// md_icao Text
// md_aika Text
// md_metar Text
//
//
// Tässä esimerkissä tiedot säilötään tietokantaa, joten se yhteys sinne hyvä avata ensiksi
//
$db = mysql_connect("localhost","sql-käyttjänimi","sql-salasana",true);
mysql_select_db("saasivu",$db);
//
// Lähtötilanteessa meillä on koko NOAA:n koostama metar-paketti tallennettuna $metarData
// nimiseen muuttujaan
//
// NOAA:n tekstitiedostojen rakenne on aina seuraava:
//
// Rivi 1: Kellonaika jenkkimuodossa
// Rivi 2: METAR - tietorivi
// Rivi 3: Tyhjä väli
//
// Jonka jälkeen toistuvuus alkaa alusta riviltä 1. Tällä tavalla käydään lävitse kaikkien
// lentoasemien säät.
//
// Hyvänä esimerkkinä: http://weather.noaa.gov/pub/data/observations/metar/cycles/12Z.TXT
//
// Yksi tapa napata tiedot on tehdä pieni for looppi-laskuri joka käy sisällön läpi
// ja flip-flop lajittelee ne eri muuttujiin. Tapa on ruma ja hidas, mutta ajaa asiansa.
// Nollataan lajittelija
$lajittelija = 0;
// Tehdään FOR looppi joka käy koko tiedoston sisällön lävitse
for ($rivi = 0; $rivi <= count($metarData)-1; $rivi++)
{
// Lisätään joka rivi lajittelijaan 1
$lajittelija++;
// Jos lajittelijan arvo 1, eli rivi 1 metar-kasoista, se on kello ja päiväys
if ($lajittelija == 1) $metarAika = $metarData[$rivi];
// Jos lajittelijan arvo 2, eli rivi 2 metar-kasoista, se on itse metar-tieto
if ($lajittelija == 2) $metarTieto = $metarData[$rivi];
// Otetaan ICAO tunnus erilliseen metar-tiedosta datan lajittelun helppottamiseksi jatkossa
$xpld = explode(" ",$metarTieto);
$metarIcao = $xpld[0];
// Jos lajittelijan arvo 3, eli tyhjä rivi 3 metar-kasoista, nollataan lajittelija
// ja homma alkaa alusta
if ($lajittelija == 3) $lajittelija = 0;
// Tallettaan tieto MySQL tietokantaan rivilisäyksellä
mysql_query("INSERT INTO metardata SET md_icao='{$metarIcao}',md_metar='{$metarTieto}'",$db);
// Koska yhdessä syklissä on rivejä yleensä lähes kahden megan edestä, pieni USLEEP
// ei ole pahitteeksi serverin kuormituksen estämiseksi (0.1 sekunnin tarkoituksenmukainen
// hidastus)
usleep(100000);
}
// Lopuksi huokaistaan helpotuksesta ja suljetaan tietokantayhteys
mysql_close($db);
?>
Haastetta kehiin ja metaria tulkitsemaanMETAR-koodin selvittäminen on yksi tämän tehtävän antoisimmista tapauksista. Se on helppoa ja hauskaa
oikeilla työkaluilla ja tekniikolla. Paras tapa METAR rivin lajitteluun onkin Regular Expression ja työkaluja RegEx Buddy jota suosittelen hyvin paljon.
Mitä ihmettä ovat Regular Expressionit? .. Perinteisen IF-AND-OR lausevertailusta hieman edistyneempi tapa on käyttää RegEx - vertailuja, jossa itse vertailulause sisältää tietyt ehdot ja tavat joilla etsittävä tieto pitää esiintyä siinä tekstissä jota käydään läpi. RegEx:n avulla on mahdollista luoda hyvin monipuolisia hakuja kuten "etsi tekstinpätkää joka on 7 merkkiä pitkä, jossa on keskellä V ja kummallakin puolella 3 numeroa" noin esimerkkinä.Alla muutama esimerkki RegExp:n käytöstä PHP:llä nimenomaisesti METAR:n selvittämisesä.
<?php
//
// METAR-Rivien lajittelun esimerkki
// huom: Tätä koodia ei ole testattu toiminnassa eikä se ole nyytti.com palvelun omaa koodia vaan
// esimerkiksi tehty koodi. Älä koskaan käytä koodia suoraan ellet tiedä mitä teet.
//
// Janne,
// nyytti.com
//
// PS: Jos käytät koodeja tai niistä on sinulle jollain tavalla apua niin pieni linkki nyytti.comin
// johonkin nurkkaan ei olisi ollenkaan ikävää mutta ei pakollista :)
//
//
// Tämä esimerkki EI sisällä kaikkea hajontaa vaan ainoastaan pari esimerkkiä. Loput saat selvittää
// itse. Siitä se varsinainen hauskuus alkaa.
//
// Tätä tilannetta edeltävästi on $metarTeksti muuttujaan haettu rivi, joka sisältää METAR tiedon
// eli siis esimerkiksi:
//
// $metarTeksti = "EFSI 291420Z AUTO 15015KT 130V190 CAVOK 07/M05 Q1014";
//
// Käytössä muuttujan sisältöhän haetaan vaikkapa MySQL tietokannasta. Tähän en kuitenkaan
// laita sen esimerkkiä koska tieto voidaan hakea periaatteessa mistä tahansa.
$metarTeksti = "EFSI 291420Z AUTO 15015KT 130V190 CAVOK 07/M05 Q1014";
// Hajoitetaan ensin METAR data paloiksi
$palikat = explode(" ",$metarTeksti);
reset($palikat);
while (list($metarAvain, $metarKoodi) = each($palikat))
{
// Erotellaan päivä ja kellonaika kohta METAR-datasta
if (preg_match('/([0-9][0-9])([0-9][0-9])([0-9][0-9])Z/', $metarKoodi, $eroteltu))
{
$päivä = $eroteltu[1];
$tunti = $eroteltu[2];
$minuutti = $eroteltu[3];
$metarAika = date("H:i d.m.Y",mktime($tunti,$minuutti,0,date("m"),$päivä,date("y"));
print "Seuraavien säätiedot ovat rakennettu {$metarAika}";
}
// Erotellaan automaattiaseman ilmoitus sääkoodista
if ($metarKoodi == "AUTO")
{
print "Säätiedon on rakentanut automaattinen sääasema.";
}
}
?>
Palaa tilastojen valintaan