Weather stations

Among many others, MeteoSwchweiz (the Swiss national weather service) is one of the data providers providing weather and climate related data.

(collections <- sg_collections("meteoschweiz"))
# A tibble: 33 × 11
   id          title description license created             updated            
   <chr>       <chr> <chr>       <chr>   <dttm>              <dttm>             
 1 ch.meteosc… Hail… The hail h… propri… 2023-02-09 13:50:42 2026-03-19 09:45:42
 2 ch.meteosc… Hail… The hail h… propri… 2023-02-09 13:50:43 2026-03-19 09:45:43
 3 ch.meteosc… Hail… The hail h… propri… 2023-02-09 13:50:45 2026-03-19 09:45:43
 4 ch.meteosc… Hail… The hail h… propri… 2023-02-09 13:50:47 2026-03-19 09:45:44
 5 ch.meteosc… Clim… Spatial an… propri… 2023-02-09 13:50:48 2026-03-16 21:00:01
 6 ch.meteosc… Clim… Spatial an… propri… 2023-02-09 13:51:00 2026-03-16 21:00:02
 7 ch.meteosc… Clim… Spatial an… propri… 2023-02-09 13:51:10 2026-03-16 21:00:03
 8 ch.meteosc… Clim… Spatial an… propri… 2023-02-09 13:51:20 2026-03-16 21:00:04
 9 ch.meteosc… Clim… Spatial an… propri… 2023-02-09 13:51:31 2026-03-16 21:00:04
10 ch.meteosc… Clim… Spatial an… propri… 2023-02-09 13:51:42 2026-03-16 21:00:05
# ℹ 23 more rows
# ℹ 5 more variables: itemType <chr>, crs <int>, extent <list>,
#   data_from <dttm>, data_to <dttm>

Stations and towers

This guide focuses on the "ch.meteoschweiz.ogd-smn*" collections whereof three exist. One covers the network of automated weather stations, one the network of automated precipitation measurement sites, and one data from measurement towers.

ms <- subset(collections, grepl("ch.meteoschweiz.ogd-smn", id))
writeLines(paste0(ms$id, ":\n  - ", ms$title))
ch.meteoschweiz.ogd-smn:
  - Automatic weather stations - Measurement values
ch.meteoschweiz.ogd-smn-precip:
  - Automatic precipitation stations - Measurement values
ch.meteoschweiz.ogd-smn-tower:
  - Automatic tower stations - Measurement values
## Automated weather stations
aws    <- sg_items("ch.meteoschweiz.ogd-smn")
## Automated precipitation stations
precip <- sg_items("ch.meteoschweiz.ogd-smn-precip")
## Automated towers
tower  <- sg_items("ch.meteoschweiz.ogd-smn-tower")

Plotting the geographical location for a quick overview.

plot(st_geometry(aws),    pch = 19, col = "gray",      cex = 1.5)
plot(st_geometry(precip), pch = 19, col = "steelblue", cex = 1, add = TRUE)
plot(st_geometry(tower),  pch = 19, col = "red",       cex = 1, add = TRUE)

The objects not only contain the location of the different stations but also some additional information such as the stations name.

head(aws, n = 2)
Simple feature collection with 2 features and 9 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 7.560703 ymin: 46.4917 xmax: 8.608206 ymax: 47.13364
Geodetic CRS:  WGS 84
   id              collection    type stac_version            datetime
1 abo ch.meteoschweiz.ogd-smn Feature        1.0.0 2026-07-09 04:00:33
2 aeg ch.meteoschweiz.ogd-smn Feature        1.0.0 2026-07-09 04:00:33
            title             created             updated     assets
1 Adelboden (ABO) 2025-03-28 09:59:46 2026-07-09 14:28:41 assets: 16
2 Oberägeri (AEG) 2025-03-28 09:59:47 2026-07-09 14:28:49 assets: 15
                   geometry
1  POINT (7.560703 46.4917)
2 POINT (8.608206 47.13364)
head(precip, n = 2)
Simple feature collection with 2 features and 9 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 7.28535 ymin: 47.05797 xmax: 8.670289 ymax: 47.60467
Geodetic CRS:  WGS 84
   id                     collection    type stac_version            datetime
1 abe ch.meteoschweiz.ogd-smn-precip Feature        1.0.0 2026-07-09 04:00:33
2 afi ch.meteoschweiz.ogd-smn-precip Feature        1.0.0 2026-07-09 04:00:33
              title             created             updated     assets
1     Aarberg (ABE) 2025-03-28 09:59:46 2026-07-09 14:27:06 assets: 10
2 Andelfingen (AFI) 2025-03-28 09:59:47 2026-07-09 14:27:04 assets: 10
                   geometry
1  POINT (7.28535 47.05797)
2 POINT (8.670289 47.60467)
head(tower, n = 2)
Simple feature collection with 2 features and 9 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 7.528667 ymin: 46.97781 xmax: 8.226944 ymax: 47.53648
Geodetic CRS:  WGS 84
   id                    collection    type stac_version            datetime
1 ban ch.meteoschweiz.ogd-smn-tower Feature        1.0.0 2026-07-09 04:00:34
2 psi ch.meteoschweiz.ogd-smn-tower Feature        1.0.0 2026-07-09 04:00:34
                    title             created             updated     assets
1          Bantiger (BAN) 2025-03-28 09:59:46 2026-07-09 14:28:40 assets: 15
2 Würenlingen / PSI (PSI) 2025-03-28 09:59:46 2026-07-09 14:28:40 assets: 15
                   geometry
1 POINT (7.528667 46.97781)
2 POINT (8.226944 47.53648)

Additional assets

These three data sets also come with additional assets with additional information.

(tower_assets  <- sg_assets("ch.meteoschweiz.ogd-smn-tower"))
# A tibble: 3 × 7
  id             type  href  description created             updated            
  <chr>          <chr> <chr> <chr>       <dttm>              <dttm>             
1 ogd-smn-tower… text… http… This a col… 2025-03-28 12:19:10 2026-06-30 04:22:20
2 ogd-smn-tower… text… http… This a col… 2025-03-28 12:19:10 2026-04-23 04:29:33
3 ogd-smn-tower… text… http… This a col… 2025-03-28 12:19:10 2026-02-06 09:55:39
# ℹ 1 more variable: `file:checksum` <chr>
writeLines(paste0(tower_assets$id, ":\n - ", tower_assets$description))
ogd-smn-tower_meta_datainventory.csv:
 - This a collection asset for ogd-smn-tower_meta_datainventory.csv
ogd-smn-tower_meta_parameters.csv:
 - This a collection asset for ogd-smn-tower_meta_parameters.csv
ogd-smn-tower_meta_stations.csv:
 - This a collection asset for ogd-smn-tower_meta_stations.csv
head(read.csv2(tower_assets$href[1]))
  station_abbr parameter_shortname meas_cat_nr       data_since data_till
1          BAN            dk1towh0           1 17.12.1992 09:00          
2          BAN            dv1towz0           1 01.02.2004 00:00          
3          BAN            fk1towd0           1 17.12.1992 00:00          
4          BAN            fk1towd1           1 17.12.1992 00:00          
5          BAN            fk1towh0           1 17.12.1992 00:00          
6          BAN            fk1towh1           1 17.12.1992 00:00          
         owner
1 MeteoSchweiz
2 MeteoSchweiz
3 MeteoSchweiz
4 MeteoSchweiz
5 MeteoSchweiz
6 MeteoSchweiz
head(read.csv2(tower_assets$href[3]), n = 2)
  station_abbr         station_name station_canton station_wigos_id
1          BAN             Bantiger             BE  0-20000-0-06634
2          PSI W\xfcrenlingen / PSI             AG  0-20000-0-06647
                         station_type_de
1 Automatische Turmstationen - Messwerte
2 Automatische Turmstationen - Messwerte
                                      station_type_fr
1 Stations de tour automatiques - Valeurs mesur\xe9es
2 Stations de tour automatiques - Valeurs mesur\xe9es
                               station_type_it
1 Stazioni torre automatiche - Valori misurati
2 Stazioni torre automatiche - Valori misurati
                                station_type_en station_dataowner
1 Automatic tower stations - Measurement values      MeteoSchweiz
2 Automatic tower stations - Measurement values      MeteoSchweiz
  station_data_since station_height_masl station_height_barometer_masl
1         16.12.1992               942.0                              
2         14.01.1992               334.0                         336.0
  station_coordinates_lv95_east station_coordinates_lv95_north
1                     2606850.0                      1202975.0
2                     2659356.0                      1265381.0
  station_coordinates_wgs84_lat station_coordinates_wgs84_lon
1                     46.977806                      7.528667
2                     47.536475                      8.226944
  station_exposition_de station_exposition_fr station_exposition_it
1            Gipfellage                Sommet                 Vetta
2                 Ebene                Plaine               Pianura
  station_exposition_en
1                 crest
2                 plain
                                                                                                                                 station_url_de
1 https://www.meteoschweiz.admin.ch/service-und-publikationen/applikationen/messwerte-und-messnetze.html#param=messnetz-automatisch&station=BAN
2 https://www.meteoschweiz.admin.ch/service-und-publikationen/applikationen/messwerte-und-messnetze.html#param=messnetz-automatisch&station=PSI
                                                                                                                                            station_url_fr
1 https://www.meteosuisse.admin.ch/services-et-publications/applications/valeurs-mesurees-et-reseaux-de-mesure.html#param=messnetz-automatisch&station=BAN
2 https://www.meteosuisse.admin.ch/services-et-publications/applications/valeurs-mesurees-et-reseaux-de-mesure.html#param=messnetz-automatisch&station=PSI
                                                                                                                                       station_url_it
1 https://www.meteosvizzera.admin.ch/servizi-e-pubblicazioni/applicazioni/valori-attuali-e-reti-di-misura.html#param=messnetz-automatisch&station=BAN
2 https://www.meteosvizzera.admin.ch/servizi-e-pubblicazioni/applicazioni/valori-attuali-e-reti-di-misura.html#param=messnetz-automatisch&station=PSI
                                                                                                                                                station_url_en
1 https://www.meteoswiss.admin.ch/services-and-publications/applications/measurement-values-and-measuring-networks.html#param=messnetz-automatisch&station=BAN
2 https://www.meteoswiss.admin.ch/services-and-publications/applications/measurement-values-and-measuring-networks.html#param=messnetz-automatisch&station=PSI
head(read.csv2(file(tower_assets$href[2], encoding = "latin1")), n = 2)
  parameter_shortname                        parameter_description_de
1            dk1towh0                Windrichtung Turm; Stundenmittel
2            dv1towz0 Windrichtung vektoriell Turm; Zehnminutenmittel
                                    parameter_description_fr
1                    Direction du vent tour; moyenne horaire
2 Direction du vent vectorielle tour; moyenne sur 10 minutes
                            parameter_description_it
1            Direzione del vento torre; media oraria
2 Direzione del vento vettoriale torre; media su 10'
                          parameter_description_en parameter_group_de
1                Wind direction tower; hourly mean               Wind
2 Wind direction vectorial tower; ten minutes mean               Wind
  parameter_group_fr parameter_group_it parameter_group_en
1               Vent              Vento               Wind
2               Vent              Vento               Wind
  parameter_granularity parameter_decimals parameter_datatype parameter_unit
1                     H                  0            Integer              °
2                     T                  0            Integer              °

The data

The information about the assets containing the actual data are already included in the items, the objects returned by sg_items(). As an example we are looking at the items for one specific automated weather station, namely the one located in Zermatt.

## Searching for station
zermatt <- subset(aws, grepl("Zermatt", title))

## Assets
zermatt$assets
[1] Assets: 16
      [text/csv] ogd-smn_zer_d_historical.csv
      [text/csv] ogd-smn_zer_d_recent.csv
      [text/csv] ogd-smn_zer_h_historical_1980-1989.csv
      [text/csv] ogd-smn_zer_h_historical_1990-1999.csv
      [text/csv] ogd-smn_zer_h_historical_2000-2009.csv
      [text/csv] ogd-smn_zer_h_historical_2010-2019.csv
      [text/csv] ogd-smn_zer_h_historical_2020-2029.csv
      [text/csv] ogd-smn_zer_h_now.csv
      [text/csv] ogd-smn_zer_h_recent.csv
      [text/csv] ogd-smn_zer_m.csv
      [text/csv] ogd-smn_zer_t_historical_2000-2009.csv
      [text/csv] ogd-smn_zer_t_historical_2010-2019.csv
      [text/csv] ogd-smn_zer_t_historical_2020-2029.csv
      [text/csv] ogd-smn_zer_t_now.csv
      [text/csv] ogd-smn_zer_t_recent.csv
      [text/csv] ogd-smn_zer_y.csv
## Underlying data frame
subset(zermatt$assets[[1L]], select = c(name, type, created, updated))
                                     name     type             created
1            ogd-smn_zer_d_historical.csv text/csv 2025-04-30 13:13:59
2                ogd-smn_zer_d_recent.csv text/csv 2025-03-28 10:23:25
3  ogd-smn_zer_h_historical_1980-1989.csv text/csv 2025-04-30 13:14:01
4  ogd-smn_zer_h_historical_1990-1999.csv text/csv 2025-04-30 13:14:01
5  ogd-smn_zer_h_historical_2000-2009.csv text/csv 2025-04-30 13:14:02
6  ogd-smn_zer_h_historical_2010-2019.csv text/csv 2025-04-30 13:15:32
7  ogd-smn_zer_h_historical_2020-2029.csv text/csv 2025-04-30 13:14:00
8                   ogd-smn_zer_h_now.csv text/csv 2025-03-28 10:28:31
9                ogd-smn_zer_h_recent.csv text/csv 2025-03-28 10:24:56
10                      ogd-smn_zer_m.csv text/csv 2025-04-01 11:08:33
11 ogd-smn_zer_t_historical_2000-2009.csv text/csv 2025-04-30 13:15:30
12 ogd-smn_zer_t_historical_2010-2019.csv text/csv 2025-04-30 13:17:46
13 ogd-smn_zer_t_historical_2020-2029.csv text/csv 2025-04-30 13:17:45
14                  ogd-smn_zer_t_now.csv text/csv 2025-03-28 10:31:49
15               ogd-smn_zer_t_recent.csv text/csv 2025-03-28 10:25:08
16                      ogd-smn_zer_y.csv text/csv 2025-04-02 08:28:59
               updated
1  2026-02-18 17:59:43
2  2026-07-09 11:00:25
3  2026-02-18 17:59:43
4  2026-02-18 17:59:43
5  2026-02-18 18:01:42
6  2026-02-18 17:59:43
7  2026-02-18 18:01:42
8  2026-07-09 14:30:43
9  2026-07-09 01:59:54
10 2026-07-05 05:02:06
11 2026-02-18 18:01:42
12 2026-02-18 18:03:57
13 2026-02-18 18:03:56
14 2026-07-09 14:30:40
15 2026-07-09 01:59:55
16 2026-06-25 04:31:42

As shown there are multiple CSV files covering different periods. While some are archives, others provide quick access to the latest observations and the data come in different temporal resolution.

  • _h_: Hourly data
  • _t_: 10-minute data
  • _m: Monthly data

Just as a quick example:

tmp    <- subset(zermatt$assets[[1L]], grepl("_h_now", name))
hrly   <- read.csv2(tmp$href)
head(hrly[, 1:6])
  station_abbr reference_timestamp tre200h0 tre200hn tre200hx tre005h0
1          ZER    09.07.2026 00:00     14.2     13.4     14.6      9.4
2          ZER    09.07.2026 01:00     13.5     13.3     13.8      8.6
3          ZER    09.07.2026 02:00     12.8     12.4     13.3        8
4          ZER    09.07.2026 03:00     12.1     11.5     12.8      7.3
5          ZER    09.07.2026 04:00     11.5     11.1     11.8      7.1
6          ZER    09.07.2026 05:00     11.8     11.4     12.4      7.3
tmp    <- subset(zermatt$assets[[1L]], grepl("_t_now", name))
tenmin <- read.csv2(tmp$href)
head(tenmin[, 1:6])
  station_abbr reference_timestamp tre200s0 tre005s0 tresurs0 xchills0
1          ZER    09.07.2026 00:00     14.2      9.1      7.8     14.2
2          ZER    09.07.2026 00:10     13.7      8.8      7.3     13.7
3          ZER    09.07.2026 00:20     13.8      8.7        7     13.8
4          ZER    09.07.2026 00:30     13.3      8.4        7     13.3
5          ZER    09.07.2026 00:40     13.3      8.3      6.6     13.3
6          ZER    09.07.2026 00:50     13.4      8.9      7.5     13.4