Terve,
Ilmatieteen laitos on näköjään avannut datansa: https://ilmatieteenlaitos.fi/avoin-data.
Onko kukaan käyttänyt tuota dataa php:llä? Data tulee mielestäni aika sekavassa xml-muodossa, enkä ainakaan itse keksinyt äkkiseltään miten tuota olisi kohtuullisen helppoa käsitellä. Jos sen saisi parsittua johonkin taulukkoon, niin siitä varmaan saisi helpoiten tietoja irti...
Esimerkki Helsingin sääennusteesta:
(http://data.fmi.fi/fmi-apikey/OMA-API-AVAIN/wfs?request=getFeature&storedquery_id=fmi::forecast::hirlam::surface::point::timevaluepair&place=helsinki)
<?xml version="1.0" encoding="UTF-8"?> <wfs:FeatureCollection timeStamp="2014-02-19T21:36:57Z" numberMatched="23" numberReturned="23" xmlns:wfs="http://www.opengis.net/wfs/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:om="http://www.opengis.net/om/2.0" xmlns:omso="http://inspire.ec.europa.eu/schemas/omso/2.0rc3" xmlns:ompr="http://inspire.ec.europa.eu/schemas/ompr/2.0rc3" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:swe="http://www.opengis.net/swe/2.0" xmlns:gmlcov="http://www.opengis.net/gmlcov/1.0" xmlns:sam="http://www.opengis.net/sampling/2.0" xmlns:sams="http://www.opengis.net/samplingSpatial/2.0" xmlns:wml2="http://www.opengis.net/waterml/2.0" xmlns:target="http://xml.fmi.fi/namespace/om/atmosphericfeatures/0.95" xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd http://www.opengis.net/gmlcov/1.0 http://schemas.opengis.net/gmlcov/1.0/gmlcovAll.xsd http://www.opengis.net/sampling/2.0 http://schemas.opengis.net/sampling/2.0/samplingFeature.xsd http://www.opengis.net/samplingSpatial/2.0 http://schemas.opengis.net/samplingSpatial/2.0/spatialSamplingFeature.xsd http://www.opengis.net/swe/2.0 http://schemas.opengis.net/sweCommon/2.0/swe.xsd http://inspire.ec.europa.eu/schemas/omso/2.0rc3 http://inspire.ec.europa.eu/draft-schemas/omso/2.0rc3/SpecialisedObservations.xsd http://inspire.ec.europa.eu/schemas/ompr/2.0rc3 http://inspire.ec.europa.eu/draft-schemas/ompr/2.0rc3/Processes.xsd http://www.opengis.net/waterml/2.0 http://inspire.ec.europa.eu/draft-schemas/waterml/2.0rfc/waterml2.xsd http://xml.fmi.fi/namespace/om/atmosphericfeatures/0.95 http://xml.fmi.fi/schema/om/atmosphericfeatures/0.95/atmosphericfeatures.xsd"> <wfs:member> <omso:PointTimeSeriesObservation gml:id="WFS-oZdjKUKXhbQN0niaF6ujwpqxOf2JTowtIWbbpdOs2_llx4efR060aeWzDtdOufXlmw48rp1w36d3R066aduXth2dcvDDp5QtLFlz6d1TTty2vvoUTN5_riMbHy51qRaFOO6dNGTVwzsu7JU07ctr76FE1eeYYTgzad2Sdlw8svPpWw7NOSQzM.Xfpyc6zGzVwyZNWlsy9suyp54ZamZs348OzLWpm0340ld16ZnDW24fETTz6Yd2PLStXQgNbbp589O7PUy.OlY07DOZW3fky7KzNGnlsw7WVww8sO2tTPl38NGXTn0dG5z6b.WXJx65eXm_pyV0hZtul06zb.WXHh59HTrRp5bMO10659eWbDjyunXDfp3dHTrpp25e2HZ1y8MOnk0Omnblp9MvCfkJodNO3La37stY1WpDAA---geopheight"> <om:phenomenonTime> <gml:TimePeriod gml:id="time-interval-1-1"> <gml:beginPosition>2014-02-19T22:00:00Z</gml:beginPosition> <gml:endPosition>2014-02-21T09:00:00Z</gml:endPosition> </gml:TimePeriod> </om:phenomenonTime> <om:resultTime> <gml:TimeInstant gml:id="time-1-1"> <gml:timePosition>2014-02-19T12:00:00Z</gml:timePosition> </gml:TimeInstant> </om:resultTime> <om:procedure xlink:href="http://xml.fmi.fi/inspire/process/hirlam"/> <om:parameter> <om:NamedValue> <om:name xlink:href="http://inspire.ec.europa.eu/codeList/ProcessParameterValue/value/numericalModel/analysisTime"/> <om:value> <gml:TimeInstant gml:id="analysis-time-1-1-geopheight--"> <gml:timePosition>2014-02-19T12:00:00Z</gml:timePosition> </gml:TimeInstant> </om:value> </om:NamedValue> </om:parameter> <om:observedProperty xlink:href="http://data.fmi.fi/fmi-apikey/OMA-API-AVAIN/meta?observableProperty=forecast&param=geopheight&language=eng"/> <om:featureOfInterest> <sams:SF_SpatialSamplingFeature gml:id="enn-s-1-1-geopheight"> <sam:sampledFeature> <target:LocationCollection gml:id="sampled-target-1-1-geopheight"> <target:member> <target:Location gml:id="forloc-geoid-658225-pos-geopheight"> <gml:identifier codeSpace="http://xml.fmi.fi/namespace/stationcode/geoid">658225</gml:identifier> <gml:name codeSpace="http://xml.fmi.fi/namespace/locationcode/name">Helsinki</gml:name> <gml:name codeSpace="http://xml.fmi.fi/namespace/locationcode/geoid">658225</gml:name> <target:representativePoint xlink:href="#point-658225-geopheight"/> <target:country codeSpace="http://xml.fmi.fi/namespace/location/country">Finland</target:country> <target:timezone>Europe/Helsinki</target:timezone> <target:region codeSpace="http://xml.fmi.fi/namespace/location/region">Helsinki</target:region> </target:Location></target:member> </target:LocationCollection> </sam:sampledFeature> <sams:shape> <gml:MultiPoint gml:id="foi-multipoint-1-1-geopheight"> <gml:pointMembers> <gml:Point gml:id="point-658225-geopheight" srsName="http://www.opengis.net/def/crs/EPSG/0/4258" srsDimension="2"> <gml:name>Helsinki</gml:name> <gml:pos>60.16952 24.93545 </gml:pos> </gml:Point> </gml:pointMembers> </gml:MultiPoint> </sams:shape> </sams:SF_SpatialSamplingFeature> </om:featureOfInterest> <om:result> <wml2:MeasurementTimeseries gml:id="mts-1-1-geopheight"> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-19T22:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-19T23:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-20T00:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-20T01:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-20T02:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-20T03:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-20T04:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-20T05:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-20T06:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-20T07:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-20T08:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-20T09:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-20T10:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-20T11:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-20T12:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-20T13:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-20T14:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-20T15:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-20T16:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-20T17:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-20T18:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-20T19:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-20T20:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-20T21:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-20T22:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-20T23:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-21T00:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-21T01:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-21T02:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-21T03:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-21T04:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-21T05:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-21T06:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-21T07:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-21T08:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> <wml2:point> <wml2:MeasurementTVP> <wml2:time>2014-02-21T09:00:00Z</wml2:time> <wml2:value>7.03</wml2:value> </wml2:MeasurementTVP> </wml2:point> </wml2:MeasurementTimeseries> </om:result> </omso:PointTimeSeriesObservation> </wfs:member> <!-- paljon <wfs:member>-osia lisää --> </wfs:FeatureCollection>
No ihan xml-parserillahan sitä käsitellään. Oliko sulla nyt jotain oikeaakin kysyttävää?
Yksi helppo tapa on muodostaa säännöllinen lauseke, joka erottelee datasta kiinnostavat osat välittämättä sen enempää XML:n rakenteesta. Esimerkiksi seuraava koodi poimii kaikki wfs:member-osan alkukohdat sekä ajat ja arvot järjestyksessä.
<?php $data = file_get_contents("data.xml"); $osa1 = "<wfs:member>"; $osa2 = "<wml2:time>(.*?)<\/wml2:time>"; $osa3 = "<wml2:value>(.*?)<\/wml2:value>"; preg_match_all("/$osa1|$osa2|$osa3/", $data, $tulos); for ($i = 0; $i < count($tulos[0]); $i++) { if ($tulos[1][$i] == "" && $tulos[2][$i] == "") { echo "<li> uusi mittaus alkaa"; } else if ($tulos[1][$i] != "") { echo "<li> aika: {$tulos[1][$i]}"; } else if ($tulos[2][$i] != "") { echo "<li> arvo: {$tulos[2][$i]}"; } } ?>
Samalla vaivalla onnistuu datan parsiminen xml-parserilla.
<?php $dom = new DomDocument(); $dom->loadXML(file_get_contents("data.xml")); $mittaukset = $dom->getElementsByTagNameNS("http://www.opengis.net/wfs/2.0", "member"); foreach ($mittaukset as $m) { echo "<li> uusi mittaus alkaa"; $pisteet = $m->getElementsByTagNameNS("http://www.opengis.net/waterml/2.0", "point"); foreach ($pisteet as $p) { echo "<li> aika: " . $p->getElementsByTagName("time")->item(0)->nodeValue; echo "<li> arvo: " . $p->getElementsByTagName("value")->item(0)->nodeValue; } }
Totta, en tajunnut että se onnistuisi noin lyhyellä koodilla.
Aihe on jo aika vanha, joten et voi enää vastata siihen.