# HG changeset patch # User Matti Hamalainen # Date 1401821814 -10800 # Node ID 3af8ea19a3e2b65e72b40eb0e142cee12d5919a2 # Parent 1487659d4f265c60098a5d03d3dcf2e20c24a2e4 Improved weather fetching. diff -r 1487659d4f26 -r 3af8ea19a3e2 fetch_weather.pl --- a/fetch_weather.pl Tue Jun 03 21:45:56 2014 +0300 +++ b/fetch_weather.pl Tue Jun 03 21:56:54 2014 +0300 @@ -18,6 +18,7 @@ use XML::Simple; use Text::Iconv; use Date::Parse; +use Date::Format; use Data::Dumper; @@ -62,6 +63,12 @@ } +sub gmt_time_fmt($) +{ + # 2012-02-27T00:00:00Z + return time2str("%Y-%m-%dT%TZ", $_[0], "UTC"); +} + sub str_trim($) { my $str = $_[0]; @@ -384,37 +391,64 @@ { die("FMI data scrape enabled, but no API key set.\n") unless opt_chk_valid("fmi_api_key", 10); - my $res = fetch_http("http://data.fmi.fi/fmi-apikey/".opt_get("fmi_api_key"). - "/wfs?request=getFeature&storedquery_id=fmi::observations::weather::cities::multipointcoverage". - "¶meters=temperature,humidity"); + my $uri = "http://data.fmi.fi/fmi-apikey/".opt_get("fmi_api_key"). + "/wfs?request=getFeature&storedquery_id=fmi::observations::weather::". + "multipointcoverage". +# "timevaluepair". + "&starttime=".gmt_time_fmt(time() - 10*60)."&endtime=".gmt_time_fmt(time()). + "¶meters=temperature,humidity&maxlocations=50&bbox=19,59,32,70"; + print STDERR "FMI URI: ".$uri."\n" if opt_chk_bool("debug"); + + my $res = fetch_http($uri); if ($res->code >= 200 && $res->code <= 201) { my $xml = XMLin($res->decoded_content); my $time_base = time(); + my $fdata = $xml->{"wfs:member"}{"omso:GridSeriesObservation"}; + + my $fshit = $fdata->{"om:result"}{"gmlcov:MultiPointCoverage"}; + my @farray = (); - foreach my $item (@{$xml->{"wfs:member"}}) + foreach my $fline (split(/\n/, $fshit->{"gml:domainSet"}{"gmlcov:SimpleMultiPoint"}{"gmlcov:positions"})) { - my $fitem = $item->{"omso:GridSeriesObservation"}; - if (defined($fitem->{"om:phenomenonTime"}{"gml:TimePeriod"})) + if ($fline =~ /^\s*([\+\-]?\d+\.\d*)\s+([\+\-]?\d+\.\d*)\s+(\d+)\s*$/) { - $time_base = str2time($fitem->{"om:phenomenonTime"}{"gml:TimePeriod"}{"gml:endPosition"}); + push(@farray, {"lat" => $1, "long" => $2, "time" => $3}); } - my $fname = $fitem->{"om:featureOfInterest"}{"sams:SF_SpatialSamplingFeature"}{"sams:shape"}{"gml:MultiPoint"}{"gml:pointMember"}{"gml:Point"}{"gml:name"}; - - my $fres = $fitem->{"om:result"}{"gmlcov:MultiPointCoverage"}{"gml:rangeSet"}{"gml:DataBlock"}{"gml:doubleOrNilReasonTupleList"}; + } - ### TODO XXX HALARM - ei ota viimeista arvoa, kuten pitais - if ($fres =~ /([\+\-]?\d+\.?\d*)\s+([\+\-]?\d+\.?\d*)/) + my $findex = 0; + foreach my $fline (split(/\n/, $fshit->{"gml:rangeSet"}{"gml:DataBlock"}{"gml:doubleOrNilReasonTupleList"})) + { + if ($fline =~ /^\s*([\+\-]?\d+\.\d*|NaN)\s+([\+\-]?\d+\.\d*|NaN)\s*$/) { - my ($ftemp, $fhumid) = ($1, $2); - $weatherdata->{$fname} = [ - $time_base, - $ftemp, - "", - "", - $fhumid, - ]; + $farray[$findex]{"temp"} = $1 if ($1 ne "NaN"); + $farray[$findex]{"humidity"} = $2 if ($2 ne "NaN"); + $findex++; + } + } + + my $fcrap = $fdata->{"om:featureOfInterest"}{"sams:SF_SpatialSamplingFeature"}{"sams:shape"}{"gml:MultiPoint"}{"gml:pointMember"}; + foreach my $fnode (@{$fcrap}) + { + my $floc = $fnode->{"gml:Point"}; + if ($floc->{"gml:pos"} =~ /^\s*([\+\-]?\d+\.\d*)\s+([\+\-]?\d+\.\d*)\s*$/) + { + my ($flat, $flong) = ($1, $2); + foreach my $flol (@farray) + { + if ($flol->{"lat"} == $flat && $flol->{"long"} == $flong) + { + $weatherdata->{$floc->{"gml:name"}} = [ + $flol->{"time"}, + $flol->{"temp"}, + "", + "", + defined($flol->{"humidity"}) ? $flol->{"humidity"} : "", + ]; + } + } } } }