library(meteospain)
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(ggplot2)
library(ggforce)
library(units)
#> udunits database from /usr/share/xml/udunits/udunits2.xml
library(sf)
#> Linking to GEOS 3.12.1, GDAL 3.8.4, PROJ 9.4.0; sf_use_s2() is TRUE
library(keyring)

MeteoCat service

MeteoCat is the Catalonian meteorologic service. It offers access to different meteorological data and information, being one of their main missions to curate and circulate data from meteorological stations. meteospain only access to the automatic meteorological stations network data.

MeteoCat options

Temporal resolution

meteospain offers access to the MeteoCat API at different temporal resolutions:

  • “instant”, returning the latest 4 hours of measures for all or selected stations.
  • “hourly”, returning all measures (some stations has timesteps of 30 min, others 60 min, others more) for all or selected stations.
  • “daily”, returning daily aggregates for the month in the date provided, i.e. if ‘2020-04-10’ is provided as start_date, all daily values for April 2020 will be returned.
  • “monthly”, returning monthly aggregates for the year in the date provided, i.e. if ‘2020-04-10’ is provided as start_date, all monthly values for 2020 will be returned.
  • “yearly”, returning yearly aggregates for all years available. In this case date provided is ignored.

In “daily” and “monthly”, a start_date argument must be provided, indicating the date from which retrieve the data as explained earlier. For more info see vignette('api_limits', package = 'meteospain').

Stations

meteospain access the data in the MeteoCat API collecting all stations. If a character vector of stations codes is supplied in the stations argument, a filter step is done before returning the data to maintain only the stations supplied.

MeteoCat API Key

MeteoCat API only allow access to the data with a personal API Key. This token must be included in the api_key argument of meteocat_options function.
To obtain the API Key, please visit https://apidocs.meteocat.gencat.cat/ and follow the instructions there.

It is not advisable to use the keys directly in any script shared or publicly available (github…), neither store them in plain text files. One option is using the keyring package for managing and accessing keys:

install.packages('keyring')
library(keyring)
key_set('meteocat') # A prompt asking for the secret (the API Key) will appear.

Examples

# current day, all stations
api_options <- meteocat_options(
  resolution = 'instant',
  api_key = key_get('meteocat')
)
api_options
#> $resolution
#> [1] "instant"
#> 
#> $start_date
#> [1] "2024-10-16"
#> 
#> $stations
#> NULL
#> 
#> $api_key
#> [1] "my_api_key"
# daily, all stations
api_options <- meteocat_options(
  resolution = 'daily',
  start_date = as.Date('2020-04-10'),
  api_key = key_get('meteocat')
)
api_options
#> $resolution
#> [1] "daily"
#> 
#> $start_date
#> [1] "2020-04-25"
#> 
#> $stations
#> NULL
#> 
#> $api_key
#> [1] "my_api_key"

MeteoCat stations info

Accessing station metadata for MeteoCat is simple:

get_stations_info_from('meteocat', api_options)
#> Simple feature collection with 240 features and 5 fields
#> Geometry type: POINT
#> Dimension:     XY
#> Bounding box:  xmin: 0.30565 ymin: 40.55219 xmax: 3.18165 ymax: 42.77011
#> Geodetic CRS:  WGS 84
#> # A tibble: 240 × 6
#>    service  station_id station_name                   station_province altitude
#>  * <chr>    <chr>      <chr>                          <chr>                 [m]
#>  1 meteocat AN         Barcelona - Av. Lluís Companys Barcelona             7.5
#>  2 meteocat CA         Clariana de Cardener           Lleida              693  
#>  3 meteocat CB         les Llosses                    Girona              700  
#>  4 meteocat CC         Orís                           Barcelona           626  
#>  5 meteocat CD         la Seu d'Urgell - Bellestar    Lleida              849  
#>  6 meteocat CE         els Hostalets de Pierola       Barcelona           316  
#>  7 meteocat CF         Lloret de Mar                  Girona               63.3
#>  8 meteocat CG         Molló - Fabert                 Girona             1405  
#>  9 meteocat CH         Falset - Escola                Tarragona           350  
#> 10 meteocat CI         Sant Pau de Segúries           Girona              852  
#> # ℹ 230 more rows
#> # ℹ 1 more variable: geometry <POINT [°]>

MeteoCat data

api_options <- meteocat_options(
  resolution = 'monthly',
  start_date = as.Date('2020-04-01'),
  api_key = key_get('meteocat')
)
catalunya_2020 <- get_meteo_from('meteocat', options = api_options)
#>  Data provided by meteo.cat © Servei Meteorològic de Catalunya
#> https://www.meteo.cat/wpweb/avis-legal/#info
catalunya_2020
#> Simple feature collection with 2255 features and 20 fields (with 12 geometries empty)
#> Geometry type: POINT
#> Dimension:     XY
#> Bounding box:  xmin: 0.30565 ymin: 40.55786 xmax: 3.18165 ymax: 42.77011
#> Geodetic CRS:  WGS 84
#> # A tibble: 2,255 × 21
#>    timestamp           service station_id station_name station_province altitude
#>    <dttm>              <chr>   <chr>      <chr>        <chr>                 [m]
#>  1 2020-01-01 00:00:00 meteoc… C6         Castellnou … Lleida               264 
#>  2 2020-01-01 00:00:00 meteoc… C7         Tàrrega      Lleida               427 
#>  3 2020-01-01 00:00:00 meteoc… C8         Cervera      Lleida               554 
#>  4 2020-01-01 00:00:00 meteoc… C9         Mas de Barb… Tarragona            240 
#>  5 2020-01-01 00:00:00 meteoc… CC         Orís         Barcelona            626 
#>  6 2020-01-01 00:00:00 meteoc… CD         la Seu d'Ur… Lleida               849 
#>  7 2020-01-01 00:00:00 meteoc… CE         els Hostale… Barcelona            316 
#>  8 2020-01-01 00:00:00 meteoc… CG         Molló - Fab… Girona              1405 
#>  9 2020-01-01 00:00:00 meteoc… CI         Sant Pau de… Girona               852 
#> 10 2020-01-01 00:00:00 meteoc… CJ         Organyà      Lleida               566.
#> # ℹ 2,245 more rows
#> # ℹ 15 more variables: mean_temperature [°C], min_temperature_absolute [°C],
#> #   min_temperature_mean [°C], max_temperature_absolute [°C],
#> #   max_temperature_mean [°C], mean_relative_humidity [%],
#> #   min_relative_humidity_absolute [%], min_relative_humidity_mean [%],
#> #   max_relative_humidity_absolute [%], max_relative_humidity_mean [%],
#> #   precipitation [L/m^2], mean_wind_direction [°], mean_wind_speed [m/s], …

Visually:

catalunya_2020 |>
  units::drop_units() |>
  mutate(month = lubridate::month(timestamp, label = TRUE)) |>
  ggplot() +
  geom_sf(aes(colour = mean_temperature)) +
  facet_wrap(vars(month), ncol = 4) +
  scale_colour_viridis_c()


catalunya_2020 |>
  mutate(month = lubridate::month(timestamp, label = TRUE)) |>
  ggplot() +
  geom_histogram(aes(x = precipitation)) +
  facet_wrap(vars(month), ncol = 4)
#> Warning: The `scale_name` argument of `continuous_scale()` is deprecated as of ggplot2
#> 3.5.0.
#> This warning is displayed once every 8 hours.
#> Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
#> generated.
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
#> Warning: Removed 25 rows containing non-finite outside the scale range
#> (`stat_bin()`).