PostGIS Snippets🔗

Posted by Médéric Ribreux 🗓 In kb/ snippets/

#gis #snippets #sql

  1. Récupérer l'emprise d'une couche
  2. Importer un fichier avec un encodage différent de celui du serveur PostgreSQL
  3. Importer une couche étiquette au format TAB

Récupérer l'emprise d'une couche

Vous avez une couche qui contient des objets géographiques et vous voulez récupérer la géométrie du polygone qui englobe l'ensemble des objets de la couche. Vous allez devoir combiner quelques fonctions de PostGIS:

SELECT ST_Envelope(ST_Collect(table.wkb_geometry)) from table;

Importer un fichier avec un encodage différent de celui du serveur PostgreSQL

De temps à autre, lors de l'import d'une couche géographique issue d'un tiers, PostgreSQL nous jette en indiquant que le contenu de la table n'est pas livré dans un jeu de caractères valides. C'est souvent le cas pour les utilisateurs qui travaillent sous MS-Windows et dont l'encodage par défaut n'est pas UTF-8. En effet, les bases de données d'un serveur postgreSQL sont souvent configurées par défaut pour travailler en UTF-8. Dans ces conditions, l'import avec ogr2ogr echoue: la table est bien créée mais elle est vide.

Voici une petite astuce pour gérer ce problème: il suffit d'indiquer l'encodage du fichier source au client postgreSQL. C'est assez déconcertant car ogr2ogr n'est pas censé être psql. Toutefois, il utilise bien les variables d'environnement de psql. Donc, il suffit d'ajouter un PGCLIENTENCODING=LATIN1 suivi de la commande OGR pour que tout se passe bien (avec les fichiers encodés en ISO-8859-1):

PGCLIENTENCODING=LATIN1 ogr2ogr -s_srs EPSG:2154 -f "PostgreSQL" PG:"host=server user=sid_admin dbname=GEOBASE password=password" ./COUCHE_QUI_VA_BIEN.TAB

Pas plus compliqué que ça !

Si ça ne fonctionne pas, vous pouvez utiliser d'autres encodages.

Importer une couche étiquette au format TAB

Il s'agit de récupérer les éléments de style qui vont permettre d'afficher la couche (de points) avec les bonnes étiquettes dans QGis via PostGIS. Il s'agit d'une simple requête SQL via OGR qui va récupérer les éléments de style de la couche TAB et les affecter dans des colonnes. Ensuite, on utilisera QGis et son outil d'étiquettes pour affecter les colonnes aux éléments de gestion des étiquettes.

Nous sommes obligés de procéder en deux étapes:

PGCLIENTENCODING=LATIN1 \
ogr2ogr -s_srs EPSG:2154 -f  "PostgreSQL" \
PG:"host=localhost user=admin dbname=GEOBASE password=password" \
-sql "SELECT *, OGR_STYLE FROM c49004_ecritures" -nln tmp_couche couche.tab \
&& ogr2ogr -f "PostgreSQL" \
PG:"host=localhost user=admin dbname=GEOBASE password=password" \
-nln couche \
PG:"host=localhost user=admin dbname=GEOBASE password=password" \
-sql "SELECT *, substring(ogr_style, 't:\"([^\"]+)\"[\\),]') As label_text, \
substring(ogr_style, 'c:([^,]+)[\\),]') As label_color, \
substring(ogr_style, 'a:([^,]+)[\\),]') As label_angle, \
substring(ogr_style, 'f:\"([^\"]+)\"[\\),]') As label_font, \
substring(ogr_style, 's:([0-9.]+).+[\\),]') As label_size, \
St_X(wkb_geometry) As label_X, \
St_Y(wkb_geometry) As label_Y \
FROM tmp_couche"

Ensuite, vous pouvez ouvrir QGis et sélectionner l'icône de l'outil d'étiquettes. Ensuite, il vous reste à affecter les champs suivants:

Dans l'onglet "Source de définition des paramètres":

On peut bien entendu améliorer cette requête et sortir plus de champs de styles (comme le fait que les caractères soient en gras ou non). Même s'il paraît aberrant d'utiliser un champ X/Y pour définir l'emplacement de l'étiquette, c'est obligatoire dans QGis si on veut pouvoir utiliser le champ qui définit la rotation de l'étiquette.

Si vous désirez aller plus en ajoutant plus de champs de style, vous pouvez consultez la référence sur les styles gérés par OGR.