Utiliser des flux WFS dans PostGIS avec l’extension ogr_fdw

Il est possible de visualiser des flux WFS sur un serveur PostGreSQL/PostGIS en utilisant l’extension ogr_fdw qui conjugue les fonctionnalités de la librairie OGR et de l’extension Foreign Data Wrapper (postgres_fdw).

Installation des extensions nécessaires

Via pgAdmin, par exemple :

CREATE EXTENSION postgis;
CREATE EXTENSION ogr_fdw;

Interrogation du flux WFS avec ogr_fdw_info

Ou utilise ensuite l’utilitaire ogr_fdw_info pour connaître la liste des couches servies par le flux (avec un serveur PostGreSQL 9.6 sur Windows).

Pour connaître le fonctionnement d’ogr_fdw_info, on utilise la commande :

cd "C:\Program Files\PostgreSQL\9.6\bin"
ogr_fdw_info -help

Elle renvoie les usages suivants :

usage: ogr_fdw_info -s <ogr datasource> -l <ogr layer>
ogr_fdw_info -s <ogr datasource>
ogr_fdw_info -f

L’option -f permet de connaître les différents formats supportés :

ogr_fdw_info -f

On retrouve dans la liste l’item « WFS » (read only) qui permet avec l’option -s de paramétrer l’interrogation du serveur.

Dans cet exemple, on cherche à récupérer la couche des obstacles à l’écoulement en Métropole du SANDRE. L’adresse du flux provient de la fiche de métadonnées du lot de données :

ogr_fdw_info -s "WFS:http://services.sandre.eaufrance.fr/geo/obs_FXX"

La commande renvoie le résultat suivant :

Layers:
  sa:ObstEcoul

On peut donc interroger le serveur pour connaître la structure de cette couche :

ogr_fdw_info -s "WFS:http://services.sandre.eaufrance.fr/geo/obs_FXX" -l sa:ObstEcoul

Création du serveur distant

La commande précédente génère automatiquement la requête SQL (à exécuter dans pg Admin, par exemple) pour créer le serveur :

CREATE SERVER myserver
  FOREIGN DATA WRAPPER ogr_fdw
  OPTIONS (
    datasource 'WFS:http://services.sandre.eaufrance.fr/geo/obs_FXX',
    format 'WFS' );

Création de la table distante

On peut ensuite créer la table distante :

CREATE FOREIGN TABLE sa_obstecoul (
  fid bigint,
  msgeometry Geometry(Geometry,4326),
  gml_id varchar,
  cdobstecoul varchar,
  stobstecoul varchar,
  cdmodevalidobstecoul varchar,
  lbmodevalidobstecoul varchar,
  cdetouvrage varchar,
  lbetouvrage varchar,
  nomprincipalobstecoul varchar,
  nomsecondaireobstecoul varchar,
  cdtypeouvrage varchar,
  lbtypeouvrage varchar,
  coordxpointcarouvrage real,
  coordypointcarouvrage real,
  typecoordpointcarouvrage varchar,
  cdtypedispfranchpiscicole1 varchar,
  lbtypedispfranchpiscicole1 varchar,
  cdtypedispfranchpiscicole2 varchar,
  lbtypedispfranchpiscicole2 varchar,
  cdtypedispfranchpiscicole3 varchar,
  lbtypedispfranchpiscicole3 varchar,
  cdtypedispfranchpiscicole4 varchar,
  lbtypedispfranchpiscicole4 varchar,
  cdtypedispfranchpiscicole5 varchar,
  lbtypedispfranchpiscicole5 varchar,
  cdtypeelmobseuil1 varchar,
  lbtypeelmobseuil1 varchar,
  cdtypeelmobseuil2 varchar,
  lbtypeelmobseuil2 varchar,
  cdtypeelmobseuil3 varchar,
  lbtypeelmobseuil3 varchar,
  cdtypedispfranchnavig1 varchar,
  lbtypedispfranchnavig1 varchar,
  cdtypedispfranchnavig2 varchar,
  lbtypedispfranchnavig2 varchar,
  cdtypedispfranchnavig3 varchar,
  lbtypedispfranchnavig3 varchar,
  cdusageobstecoul1 varchar,
  lbusageobstecoul1 varchar,
  cdusageobstecoul2 varchar,
  lbusageobstecoul2 varchar,
  cdusageobstecoul3 varchar,
  lbusageobstecoul3 varchar,
  cdusageobstecoul4 varchar,
  lbusageobstecoul4 varchar,
  hautmaxter varchar,
  hautchutetobstecoul varchar,
  cdhautchutclobstecoul varchar,
  lbhautchutclobstecoul varchar,
  datemajobstecoul varchar,
  datevalidobstecoul varchar,
  grenobstecoul varchar,
  ouvragelie varchar,
  idtronconhydrograelt varchar,
  nomentitehydrographique varchar,
  cdtronconhydrographique varchar,
  cdentitehydrographique varchar,
  cdzonehydro varchar,
  idtronconhydrobdtopo varchar,
  cddepartement varchar,
  lbdepartement varchar,
  cdcommune varchar,
  lbcommune varchar,
  numcircadminbassin varchar,
  nomcircadminbassin varchar,
  cdeumassedeau varchar,
  altipointcarouvrage real,
  nomlimitehydrographique varchar,
  denmaxouvrage real,
  pkobstecoul real
) SERVER myserver
OPTIONS (layer 'sa:ObstEcoul');

Si le serveur et la table ne sont pas visibles dans pgAdmin, il faut vérifier dans Fichier > Préférences > Affichage que les cases pour les options « Wrappers de serveurs distants » et « Tables distantes » sont bien cochées.

Sources :