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:
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 talletus

Ensimmä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 tulkitsemaan

METAR-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

© 2007 nyytti.com - kaikki oikeudet pidätetään - Sisällön, datan ja kuvien kopiointi ehdottomasti kielletty ilman ylläpidon erillistä lupaa. Ylläpidon yhteystiedot löytyvät kiinnostuneille etusivulta. PS: Tämä sivu, kuten kaikki hyvät sivut ovat, on XHTML 1.0 ja CSS 2.1 validi ;).