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 :

Publicités

Correction automatique des erreurs de géométrie avec PostGIS

Ces opérations sont réalisées pour des tables comportant un champs de type géométrie, stockées dans un SGBD PostGreSQL avec l’extension PostGIS installée.

1. Comptage des erreurs GEOS, des géométries nulles et des collections

SELECT 'invalid' AS nb, count(*) FROM my_table WHERE NOT ST_IsValid(the_geom)
UNION
SELECT 'geonul' AS nb, count(*) FROM my_table WHERE the_geom is null
UNION
SELECT 'collection' AS nb, count(*) FROM ma_table WHERE not ST_IsValid(the_geom)
AND ST_GeometryType(ST_MakeValid(the_geom))='ST_GeometryCollection';

Afficher les causes des erreurs

SELECT id, ST_IsValidReason(the_geom) FROM my_table WHERE NOT ST_IsValid(the_geom);

2. Correction des géométries invalides, des collections et des nœuds doubles (sur des couches de polygones)

2.1 Requête globale

UPDATE my_table
SET the_geom =
ST_Multi(ST_Simplify(ST_Multi(ST_CollectionExtract(ST_ForceCollection(ST_MakeVa
lid(the_geom)),3)),0))
WHERE ST_GeometryType(the_geom) = 'ST_MultiPolygon';

2.2 Correction seule de la géométrie de type GEOS

UPDATE my_table SET the_geom = ST_MakeValid(the_geom) WHERE NOT ST_IsValid(the_geom);

2.3 Suppression seule des géométries nulles

DELETE FROM my_table WHERE the_geom IS NULL;

A n’effectuer que si le nombre n’est pas nul à l’étape 1.

2.4 Correction seule des nœuds doubles

UPDATE my_table SET the_geom = ST_Multi(ST_Simplify(the_geom,0));

A n’effectuer que si la liste des erreurs indique la présence de nœuds double et que l’étape 2 n’est pas réalisée.

2.5 Vérifier de nouveau le nombre d’erreurs de type GEOS

Trier les données attributaires d’un fichier Shape dans QGIS

Il n’est pas possible nativement dans QGIS d’effectuer un tri sur un champs de la table attributaire d’une couche et d’enregistrer cette même couche triée.

Pour parvenir à ce résultat, il faut installer le plugin MMQGIS développé par Michael Minn (via le menu Extensions > Installer/gérer les extensions)  et utiliser la fonctionnalité Sort Attributes dans le menu Modify :

sort_attributes

Sources :

Requêtage avancé avec le formulaire de QGIS

1. Contexte

Un projet QGIS comportant des relations entre des tables et dans lequel on souhaite faire de la saisie de données attributaires via un formulaire dans une table b à partir d’une table a.

L’affichage de la liste des valeurs saisies dans la table a renvoie par défaut l’identifiant de l’objet, souvent peu compréhensible en soi.

Exemple :

liste_sites

2. Paramétrage

2.1 Relations entre les tables

Les relations sont créées via le menu Projet > Propriétés du projet > Relations > Ajouter une relation

On créé le lien entre les deux tables a et b en complétant les champs dans la fenêtre suivante :

relations

2.3 Installation des extensions de requêtage avancé

Dans l’onglet « Paramètres » du gestionnaire d’extension, cocher la case « Afficher les extensions expérimentales ».

Installer les extensions suivantes :

  • Expression Plus FR
  • refFunctions

3. Expressions avancées

3.1 Accès au paramétrage de l’expression

Dans le formulaire de la table a, en cliquant sur le bouton « Expression », il est possible d’accéder à la fois à la fenêtre de paramétrage de l’expression ou à la sélection d’un champs de la table b pour l’affichage par défaut :

expression

Les extensions installées auparavant ajoutent les blocs « Expressions FR + » et « Reference » à la liste des fonctions.

3.2 Fonction format_date()

  • Usage : formatage de dates
  • Accès : Chaîne > format_date
  • Syntaxe :

format_date(date_enregistrement, ‘dd/MM/yyyy’)

3.3 Fonction dbvaluebyid()

  • Usage : affichage d’un champs d’une autre table par jointure
  • Accès : Reference > dbvaluebyid
  • Syntaxe :

dbvaluebyid(‘Alias de la table cible’, ‘champs_cible’, cle_etrangere)

4. Sources

Installation de l’extension GIS dans dans Pentaho Data Integration 5.4

Extension GIS développée par Atol CD

Maven

Ajouter une clé primaire auto-incrémentée à une table avec GeoKettle

Dans une transformation, il faut utiliser le step « Ajouter séquence » en indiquant le nom du champ à ajouter dans la zone de texte « Nom de la valeur » et en laissant les paramètres par défaut pour l’utilisation du compteur.

add_sequence

Fenêtre de paramétrage du step

Cela donne en sortie un entier qui s’incrémente de 1 à chaque ligne.

Source :

Supprimer les scories à l’intérieur d’un polygon avec PostGIS

L’union de polygones contigus peut parfois générés des scories (lignes résiduelles, trous…) dans le polygone ou le multipolygone assemblé. L’utilisation des fonctions de PostGIS permet de résoudre ces problèmes en quelques étapes.

Dans le cas de polygones simples, les étapes 2 et 3 sont suffisantes.

L’utilisation des fonctions est décomposée en plusieurs étapes mais il est bien sûr possible de les combiner. De même, des tables ou des vues sont créées à chaque étape afin de vérifier visuellement les résultats dans un outil SIG bureautique.

1. Exploser un multipolygone

Si la géométrie à traiter est un multipolygone, il est nécessaire de l’exploser au préalable en plusieurs polygones à l’aide de la fonction ST_Dump :

CREATE TABLE tablename_st_dump AS
SELECT fieldname, (ST_Dump(the_geom)).geom AS the_geom 
FROM tablename;

2. Récupérer la polyligne extérieure d’un polygone

On utilise ensuite la fonction ST_ExteriorRing pour récupérer la polyligne extérieure du polygone ce qui permet de supprimer toutes les scories internes au polygone (c’est-à-dire n’intersectant pas cette ligne) :

CREATE TABLE tablename_st_exterior_ring AS 
SELECT fieldname, ST_ExteriorRing(the_geom) AS the_geom
FROM tablename_st_dump;

3. Transformer la polyligne en polygone

On utilise la fonction ST_MakePolygon pour transformer la polyligne récupérer en polygone :

CREATE TABLE tablename_st_make_polygon AS 
SELECT fieldname, ST_MakePolygon(the_geom) AS the_geom
FROM tablename_st_exterior_ring;

4. Assembler les polygones dans un multipolygone

Si la géométrie initiale était un multipolygone, on peut assembler les différents polygones  avec la fonction ST_Union :

CREATE TABLE tablename_st_make_polygon AS 
SELECT fieldname, ST_Union(the_geom) AS the_geom
FROM tablename_st_make_polygon
GROUP BY fieldname;

Sources :