changeset 189:3af8ea19a3e2

Improved weather fetching.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 03 Jun 2014 21:56:54 +0300
parents 1487659d4f26
children 15c49bb1ce05
files fetch_weather.pl
diffstat 1 files changed, 54 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- 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".
-    "&parameters=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()).
+    "&parameters=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"} : "",
+            ];
+          }
+        }
       }
     }
   }