Ilmatieteen laitoksen avoimen datan hyödyntäminen

1043856_341402342659068_699743464_nIlmatieteen laitos on julkaissut avointa säädataa koneluettavassa INSPIRE-direktiivin mukaisessa XML-muodossa. Säädatan ulossaamiseen tarvitaan jonkin verran teknistä tietämystä. Tosin uusimmat versiot Excel-ohjelmasta saattavat osata avata INSPIRE-direktiivin mukaisen XML-tiedoston ja näyttää esimerkiksi aika-arvopareja.

Säädatan hyödyntämiseksi tulee ensin rekisteröityä. Rekisteröitymisen jälkeen saa tunnistevaimen (apikey), joka sijoitetaan säädatan latausosoitteisiin.

Avatut aineistot löytyvät täältä.

Dataa voi ladata niin kutsuttuja tallennettuja kyselyitä (stored queries) käyttämällä. Latausosoitteen voi etsiä osoitteesta http://catalog.fmi.fi tai muodostaa käsin, kunhan selvittää, mistä mikin data löytyy. Esimerkiksi auringon globaalin säteilyn (glob_1min) löytää seuraavasta tallennetusta kyselystä:

fmi::observations::radiation::timevaluepair

Ohjeita pläräilemällä selviää, että latauskysely tulee muodostaa seuraavasti:

http://data.fmi.fi/fmi-apikey/KORVAA_TÄMÄ_TEKSTI_OMALLA_APIKEYLLÄ/wfs?request=getFeature&storedquery_id=fmi::observations::radiation::timevaluepair

Tämä kysely näyttää kaikki havaintoasemat, jotka tallennettuun kyselyyn on liitetty. Lisäksi kyselyllä voi selvittää kaikki asemalla mitattavat parametrit. Huomaa, että kaikkia mittattavia suureita ei välttämättä jaeta eteen päin.

Jos haluaa tietää, mitä kukin meteorologinen parametri XML:ssä tarkoittaa, niin jokaisen parametrin yhteydessä on observedProperty-niminen tagi, jonka sisällä on linkki selitykseen. Esimerkiksi glob_1min-parametrin observedProperty kertoo:

<ObservableProperty xmlns="http://inspire.ec.europa.eu/schemas/omop/2.9"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:gml="http://www.opengis.net/gml/3.2"
  xmlns:xlink="http://www.w3.org/1999/xlink"
  gml:id="glob_1min"
  xsi:schemaLocation="http://inspire.ec.europa.eu/schemas/omop/2.9 http://inspire.ec.europa.eu/draft-schemas/omop/2.9/ObservableProperties.xsd">
        <label>Global radiation</label>
      	<basePhenomenon>Solar radiation</basePhenomenon>
      	<uom uom="W/m2"/>
      	<statisticalMeasure>     
          <StatisticalMeasure gml:id="stat-avg-PT1M-glob_1min---">
            <statisticalFunction>avg</statisticalFunction><aggregationTimePeriod>PT1M</aggregationTimePeriod>
          </StatisticalMeasure>
        </statisticalMeasure>  </ObservableProperty>

Selviää mm, että kyseessä on Global radiation, Solar radation, yksikkönä W/m2 ja mittausvälinä PT1M (=1 min). Lisäksi Ilmatieteen laitoksen sivuilta selviää, että

Globaalilla säteilyllä tarkoitetaan auringosta saapuvaa laajakaistaista lyhytaaltosäteilyä, joka tulee anturille koko taivaankannelta. Tätä suuretta mitataan pyranometrillä, joka tuottaa säteilyn voimakkuuteen verrannollisen matalajännitteen. Tämä analoginen jännite mitataan sääaseman keskusyksikössä, jossa saadaan numeerinen arvo säteilyn intensiteetille (W/m^2).

Lisäämme siis kyselyyn parametrin glob_1min:

http://data.fmi.fi/fmi-apikey/KORVAA_TÄMÄ_TEKSTI_OMALLA_APIKEYLLÄ/wfs?request=getFeature&storedquery_id=fmi::observations::radiation::timevaluepair&parameters=glob_1min

Nyt tulostuu enää kaikkien asemien globaalin säteilyn arvot (oletuksena viimeinen tunti).

Havaitsin aseman valinnan hieman haasteelliseksi. Rajapinta tukee esimerkiksi place-parametria, mutta en syystä tai toisesta saanut millään vain Kumpula-asemaa valittua (&place=Kumpula). Yritin myös &place=Helsinki,Kumpula ja &place=Kumpula,Helsinki. Nämä kaikki vaihtoehdot tulostavat kaikki asemat. Selvisi kuitenkin, että katselupalvelusta http://catalog.fmi.fi on mahdollista selvittää rajapinnassa tuettu fmisid-parametri. fmisid on Ilmatieteen laitoksen oma id säähavaintoasemalle. Selvittämistä ei kuitenkaan ole tehty erityisen helpoksi, tässä ohjeet:

  1. Mene katselupalveluun
  2. Kirjoita WHAT?-hakukenttään haluttu asema, esim. Kumpula
  3. Klikkaa auki halutun havaintodatan Metadata plusmerkistä, esim Säähavaintojen vuorokausiarvot: Helsinki Kumpula
  4. Etsi kohta Transfer Options ja sen alta OnLine Resource
  5. Vie hiiri linkin INSPIRE Download Service -palvelurajapinta (OGC WFS 2.0) päälle tai avaa linkki uuteen ikkunaan. Tässä linkissä on lopussa mukana havaintoaseman fmisid.

Eli Helsingin Kumpulan globaalin säteilyn saamiseksi tulee kyselyyn liittää perään vielä &fmisid=101004. Katselupalvelu on muuten tarkoitettu latausosoitteiden hankintaan ja metatietojen katseluun, mutta on toisinaan hieman haastava käyttää.

Nyt kysely antaa Kumpulan edellisen tunnin globaalin säteilyn aika-arvo-pareina, tosin aika kryptisenä XML:nä:

http://data.fmi.fi/fmi-apikey/KORVAA_TÄMÄ_TEKSTI_OMALLA_APIKEYLLÄ/wfs?request=getFeature&storedquery_id=fmi::observations::radiation::timevaluepair&parameters=glob_1min&fmisid=101004

Itse jatkokehittelin tästä aineistosta Flot-graafikirjastoa apuna käyttäen seuraavat kaksi graafia…

Lisäsin myös Kumpulan lämpötilakäyrän sekä hyödynsin Ilmanlaatuportaalin avointa dataa Mikko Heikkisen kehittelemän rajapinnan avulla.

Ilmatieteen laitoksen säädatan hain ja muokkasin Flotille sopivaksi php:llä (huom. Ilmatieteen laitos on julkaissut myös MetOLib-nimisen javascript-kirjaston datan hakua varten):

$options["apikey"] = "KORVAA_TÄMÄ_TEKSTI_OMALLA_APIKEYLLÄ";
$options["fmisid"] = "101004";
 
// Global Radiation for last 36 hours
$options["param"] = "GLOB_1MIN";
$options["stored_query_id"] = "fmi::observations::radiation::timevaluepair";
$options["timestep"] = 5; // 5 min
$options["starttime"] = date("YmdHi", mktime(date("H") - 36, 0, 0, date("m"), date("d"), date("Y")));
$array = fetchFmiOpenData($options);
$glob1min = createCoordinates($array, "time", $options["param"]);
 
function fetchFmiOpenData($options)
{
    $url = "http://data.fmi.fi/fmi-apikey/".$options["apikey"]."/wfs?request=getFeature&storedquery_id=".$options["stored_query_id"]."&crs=EPSG::3067&timestep=".$options["timestep"]."&fmisid=".$options["fmisid"]."&parameters=".$options["param"]."&starttime=".$options["starttime"];
    $response_xml_data = file_get_contents ($url);
    $result = simplexml_load_string($response_xml_data);
 
    // This is the trick to get what you want from the XML with SimpleXML, for explanation see http://www.php.net/manual/en/simplexmlelement.children.php
    $data = $result->children("wfs", true)->member->children("omso", true)->PointTimeSeriesObservation->children("om", true)->result->children("wml2", true)->MeasurementTimeseries;
 
    $array = array();
    $i = 0;
    foreach($data->point as $key => $value)
    {
        $array[$i]["time"] = strtotime($value->MeasurementTVP->time);
        $array[$i]["timestamp"] = (string)$value->MeasurementTVP->time;
        $array[$i][$options["param"]] = (string)$value->MeasurementTVP->value;
 
        $i++;
    }
    return $array;
}
 
function createCoordinates($array, $xindex, $yindex)
{
    $coordinates = "";
    $i = 1;
    $daylight = 3;
    if(date("I") == 0) // Winter time
    {
        $daylight = 2;
    }
    $localtime = $daylight * 3600000;
    foreach($array as $index => $value)
    {
        // Multiply by 1000 because Javascript uses milliseconds instead of seconds
        if($xindex == "time")
        {
            $value[$xindex] = 1000 * $value[$xindex] + $localtime;
        }
        $coordinates .= "[".$value[$xindex].",".$value[$yindex]."]";
        if(isset($array[$index + 1]))
        {
            $coordinates .= ",";
        }
    }
    $coordinates = "[".$coordinates."]";
 
    return $coordinates; // This string returned is ready to be used in Flot.
}

Pieni varoituksen sana, että rajapinta ei tykkää jos &-merkki muuntuu & amp;-yhdistelmäksi.

Kannattaa huomioida, että palveluissa on API-avainkohtaisia hakumäärärajoitteita. Yhdellä API-avaimella saa tehdä latauspalveluun enintään 20 000 kyselyä vuorokaudessa. Katselupalveluun saa tehdä enintään 10 000 kyselyä vuorokaudessa. Yhdellä API-avaimella saa tehdä molempiin palveluihin yhteensä enintään 600 kyselyä viidessä minuutissa. Eli suurempia palveluita pystytettäessä kannattaa data tallentaa omiin järjestelmiin ja huolehtia cachetukset kuntoon.

Tietolähteinä käytetty:  Kunnat, HSY, teollisuus ja Ilmatieteen laitos

Julkaistu kohteessa Uncategorized
4 kommenttia kohteessa “Ilmatieteen laitoksen avoimen datan hyödyntäminen
  1. Juuso Heinisuo sanoo:

    Hei,

    Olen yrittänyt myös saada ilmatieteenlaitoksen dataa parsittua kasaan php:n avulla. En ole vielä onnistunut, mutta tästä mallista on apua. Kiitos!

    T:Juuso

  2. Jari Poutanen sanoo:

    Hei

    Jos haluan tuoda tiedot suoraan Exceliin, niin miten se tapahtuu. Olen yrittänyt vaikka mitä, enkä saa sitä onnistumaan. Voisitko kertoa rautalankaohjeet tähän?

  3. Toni sanoo:

    Täältä muuten löytyy nykyään haivaintoasemat kätevästi http://ilmatieteenlaitos.fi/havaintoasemat

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *

*