Steve Vissault
Chaire de recherche du Canada en biogéographie et écologie des métacommunautés
Stocker les sorties climatiques d'Ouranos (Fichier Matlab/HDF5) dans une base de données spatialisée pour l'Est de l'Amérique du Nord.
-Données mensuelles pour 3 variables climatiques: 570 240 grilles
-Données annuelles pour 19 biovariables climatiques: 300 960 grilles
Un Système de Gestion de Base de données (SGBD) gratuit et openSource depuis 1989, composé de:
Pour illustrer et comprendre, voici la base de données Ouranos:
C'est une cartouche spatiale qui permet de stocker et de manipuler des objets spatiaux à l'intérieur de PostgreSQL.
Deux types d'objets spatiaux:
Avantages:
L'importation se fait dans l'infrastructure de Colosse (Super-Calculateur de l'U-Laval).
Le programme raster2pgsql découpe chaque raster climatique en tuile de 38 x 20 pixels.
Les grilles ne sont pas stockées en multibandes.
Le programme et l'infrastructure permet de traiter jusqu'à 24 fichiers Matlab à la fois.
Vitesse de traitement d'un fichier HDF par le programme R/raster2pgsql:
Durée totale de l'importation:
Poids des indexes et tables:
Relation | Poids (data) |
---|---|
clim_rs.fut_clim_vars | 358 GB (58 GB data) |
clim_rs.fut_clim_biovars | 187 GB (30 GB data) |
clim_rs.idx_spatial_mth | 6226 MB (index) |
clim_rs.idx_mod_run_mth | 4983 MB (index) |
clim_rs.rs_pkey | 4696 MB (index) |
clim_rs.idx_spatial_bio | 3277 MB (index) |
clim_rs.idx_mod_run_bio | 2622 MB (index) |
Table annuel avec 54 821 232 de lignes et mensuel avec 104 175 072 lignes
On interroge une base de données en utilisant le language SQL (Stuctured Query Language).
Il permet la manipulation des données via des instructions (SELECT
, INSERT
, UPDATE
, DELETE
...).
Une requête simple:
SELECT rast, year_clim FROM clim_rs.past_clim_allbiovars
WHERE year_clim >= 1960 OR year_clim <=1970 AND biovar = 'annual_mean_temp';
Aggregation temporelle:
SELECT ST_Union(rast,'MEAN') as tavg_6070, biovar FROM clim_rs.past_clim_allbiovars
WHERE year_clim >= 1960 OR year_clim <= 1970
GROUP BY biovar;
Liste des fonctions sur raster disponible sur postgis.net
require(RPostgreSQL)
dbname <- "quicc_for_dev"
dbhost <- "localhost"
dbuser <- 'postgres'
dbport <- 5433
drv <- dbDriver("PostgreSQL")
# Connection à la base de données
con <- dbConnect(drv, host=dbhost, port=dbport, dbname=dbname,user=dbuser)
# Écriture de la requête
query_tmax_60 <- "
SELECT * FROM clim_rs.past_clim_allbiovars
WHERE biovar = 'annual_maximum_temp' AND year_clim = 1960"
# Éxécution de la requête
res <- dbGetQuery(con,query_tmax_60)
str(res)
## 'data.frame': 696 obs. of 5 variables:
## $ rs_id : int 2120847 2120870 2120878 2121336 2121307 2121308 2121309 2121310 2121311 2121312 ...
## $ filename : chr "1960_sg300_14.asc" "1960_sg300_14.asc" "1960_sg300_14.asc" "1960_sg300_14.asc" ...
## $ year_clim: int 1960 1960 1960 1960 1960 1960 1960 1960 1960 1960 ...
## $ biovar : chr "annual_maximum_temp" "annual_maximum_temp" "annual_maximum_temp" "annual_maximum_temp" ...
## $ rast : chr "01000001001975ADBD4F55B53F1975ADBD4F55B5BF33A5F5B7040058C09DA223B9FCBF524000000000000000000000000000000000AD10000030001E004A003"| __truncated__ "01000001001975ADBD4F55B53F1975ADBD4F55B5BF226E4E2503005EC0AF0D15E3FC1F524000000000000000000000000000000000AD10000030001E004A003"| __truncated__ "01000001001975ADBD4F55B53F1975ADBD4F55B5BF39622D3E050056C0AF0D15E3FC1F524000000000000000000000000000000000AD10000030001E004A003"| __truncated__ "01000001001975ADBD4F55B53F1975ADBD4F55B5BF282B86AB03005CC0967D5704FF3F404000000000000000000000000000000000AD10000030001E004A003"| __truncated__ ...
C'est un service (généralement) web fourni par un serveur et permettant à un client d'extraire des données spatialisées via les protocoles HTTP.
Il en éxiste trois sortes:
Selon le livre, Postgis in Action (Obe et Hsu, 2011), ce qui est recommandé pour vos besoins (soit 1. Visualisation et 2. Extraction) est MapServer, car il supporte toutes les extensions de PostGIS.
require(rCharts)
require(knitr)
map1 = Leaflet$new()
map1$setView(c(52.731631, -70.156347), 4)
map1$tileLayer("http://{s}.tile.openstreetmap.se/hydda/base/{z}/{x}/{y}.png")
map1$set(width = 800, height = 550)
map1$save('maps/map1.html', cdn = TRUE)
Un exemple avec le Bas-Saint-Laurent...
query_climBSL <- "SELECT (ST_Intersection(rast,bsl.geom)).*, rs_id
FROM clim_rs.past_clim_allbiovars,
(SELECT geom FROM map_qc.regio_s WHERE res_nm_reg = 'Bas-Saint-Laurent') as bsl
WHERE year_clim=2010 AND biovar = 'annual_mean_temp'
AND ST_Intersects(rast,bsl.geom);"
(Bas-Saint-Laurent, interpolation par ANUSPLIN)