changeset 412:e0d86ccef873

fetch_weather: Change to using JSON static weather station metadata from digitraffic instead of the "old" API's CSV format data.
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 07 Jan 2017 22:34:52 +0200
parents fe47617e7251
children b63525aed190
files fetch_weather.pl
diffstat 1 files changed, 19 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/fetch_weather.pl	Sat Jan 07 22:30:32 2017 +0200
+++ b/fetch_weather.pl	Sat Jan 07 22:34:52 2017 +0200
@@ -27,8 +27,8 @@
 use Date::Format;
 use Date::Parse;
 use Data::Dumper;
-use File::Slurper qw(read_text write_text);
-use Text::CSV;
+use File::Slurper qw(read_text write_binary);
+use JSON;
 
 
 ###
@@ -355,14 +355,13 @@
       my $meta_str;
       if ($fetch_meta || $force_update)
       {
-        my $uri = "https://raw.githubusercontent.com/finnishtransportagency/metadata/master/csv/meta_rws_stations.csv";
+        my $uri = "http://tie.digitraffic.fi/api/v1/metadata/weather-stations";
         print STDERR "Fetching Tiehallinto static meta data from $uri\n" if (opt_get_int("debug") > 1);
         my $res = fetch_http($uri);
         die("Failed to fetch $uri data.\n") unless ($res->code <= 200 && $res->code <= 201);
 
-        print STDERR "Storing to cache '$meta_file'.\n" if (opt_get_int("debug") > 0);
         $meta_str = $res->decoded_content;
-        write_text($meta_file, $meta_str, "utf8");
+        $fetch_meta = 1;
       }
       else
       {
@@ -372,19 +371,22 @@
 
       # Parse the data ..
       my $meta_data = {};
-#      my $csv = Text::CSV->new({blank_is_undef => 1, decode_utf8 => 1, sep_char => ";"});
-      my $csv = Text::CSV->new({blank_is_undef => 1, sep_char => ";"});
-      die("Failed to instantiate Text::CSV object?\n") unless defined($csv);
+      my $json = JSON->new->decode($meta_str);
 
-      foreach my $line (split(/\s*\n\s*/, $meta_str))
+      if ($fetch_meta)
       {
-        if (defined($line) && $csv->parse($line))
+        # Save new cache, in more optimal form, if needed.
+        print STDERR "Storing to cache '$meta_file'.\n" if (opt_get_int("debug") > 0);
+        write_binary($meta_file, JSON->new->encode($json));
+      }
+
+      foreach my $ms (@{$json->{"features"}})
+      {
+        if (defined($ms->{"properties"}) &&
+            defined($ms->{"geometry"}{"coordinates"}) &&
+            defined($ms->{"properties"}{"names"}{"fi"}))
         {
-          my @fields = $csv->fields();
-          if (scalar(@fields) > 1)
-          {
-            $$meta_data{$fields[0]} = \@fields;
-          }
+          $meta_data->{$ms->{"id"}} = $ms;
         }
       }
 
@@ -395,10 +397,10 @@
         foreach my $wdata (@{$data->{"roadweatherdata"}{"roadweather"}})
         {
           my $wid = $wdata->{"stationid"};
-          if (defined($meta_data->{$wid}) && defined($meta_data->{$wid}[2]) && $meta_data->{$wid}[2] ne "")
+          if (defined($meta_data->{$wid}))
           {
             $nrecords++;
-            $weatherdata->{$meta_data->{$wid}[2]} =
+            $weatherdata->{$meta_data->{$wid}{"properties"}{"names"}{"fi"}} =
             [
               1,
               str2time(plonk_data($wdata->{"measurementtime"}{"utc"})),