Cartes ENC dans QGis avec Postgis(2)

Vous pouvez télécharger l’ensemble des scripts de cet article à l’adresse https://www.nasca.ovh/downloads/fichiers_enc_postgis2.7z ou accéder directement sur GItHub: https://github.com/SigEtTerritoires/enc_postgis

Ajout de la symbologie par défaut QGis d’une base de données POSTGRESQL/Postgis pour les cartes ENC

Par défaut, QGIS n’enregistre pas automatiquement les styles dans la base PostGIS. Les symbologies et styles d’une couche sont stockés dans le fichier projet (QGS/QGZ) ou dans des fichiers de style (QML, SLD). Cependant, QGIS offre la possibilité d’« enregistrer le style dans la base de données ». Dans ce cas, il crée (ou utilise) une table spécifique, généralement nommée layer_styles (ou parfois qgis_styles selon la configuration et la version).

Enregistrer le style dans la base

QGIS permet d’enregistrer un style directement dans la base PostGIS via la commande « Enregistrer le style dans la base de données… ». Lorsque cette option est utilisée, QGIS crée une table appelée layer_styles qui contient plusieurs colonnes :

  • f_table_schema et f_table_name : pour identifier à quelle couche le style s’applique.
  • styleName : le nom du style.
  • styleQML et/ou styleSLD : le contenu du style au format QML ou SLD.
  • useAsDefault : indique si ce style doit être considéré comme style par défaut pour la couche.

  • Utilisation dans QGIS :
    Lorsqu’une couche PostGIS a un style enregistré dans cette table et que l’option « Utiliser le style par défaut stocké dans la base » est activée, QGIS appliquera la symbologie enregistrée pour cette couche lors du chargement.

Nous vous proposons ici d’ajouter à la table layer_styles tout ce qui est nécessaire pour que vous ayez la symbologie par défaut pour le schéma enc créé dans l’article précédent.

Pour importer les symbologies par défaut pour la base de données ENC nous allons procéder comme suit :

  • téléchargement d’un répertoire avec tous les symboles svg nécessaires aux différentes couches S57
  • Chargement d’un dump de fichier dans le schéma enc avec le nom qgislayerstyle
  • Insertion des enregistrements de cette table dans votre table public.layer_styles

Une fois ces étapes réalisées, si vous chargez une table du schéma enc dans QGis, elle aura automatiquement la symbologie appropriée.

Téléchargement du répertoire de symboles

La symbologie présente dans le fichier dump utilise des symboles svg que vous devez télécharger sur votre machine. En cliquant ici vous téléchargerez un répertoire ‘nautical’ contenant tous les symboles svg nécessaires ainsi qu’un répertoire nommé « XML » avec des symboles supplémentaires pour QGis.

Symboles SVG

Par défaut, les références aux symboles svg sont faites vers un répertoire ‘C:/nautical‘. Vous avez deux possibilités:

1- Décompresser le fichier nautical dans un répertoire c:/nautical de votre machine

Dans ce cas vous n’avez plus rien à faire. Les layer_styles trouveront les symboles svg sans problème.

2- Vous souhaitez enregistrer le répertoire nautical dans un répertoire de votre choix

Dans ce cas, vous devez modifier le fichier dumplayers.sql en remplaçant toutes les occurrences de c:/nautical par le chemin de votre choix.

Chargement de la table qgislayerstyles

Ouvrez avec un éditeur de texte  le fichier dumplayers.sql présent dans le fichier de téléchargement.

Vous devez l’éditer pour remplacer

  • Toutes les occurrences de data_base par le nom de votre base de données Postgresql
  • Toutes les occurrences de enc_schema par le nom de votre schéma ENC

On ne peut pas utiliser l’option restaure de pgAdmin avec ce format de fichier.

Ouvrez une fenêtre OSGeo4W Shell et rentrez la commande

psql -h votre_serveur -U postgres -d votre_base_de_données -p votre_port -f chemin/dumplayers.sql

Insertion dans public.layer_styles

Dans une fenêtre SQL de pgAdmin rentrez la requête suivante, en modifiant

FROM enc.qgislayerstyle

Si votre schéma de base de données est un autre que ENC

add_layer_styles.sql

INSERT INTO public.layer_styles (f_table_catalog,f_table_schema,f_table_name,f_geometry_column,stylename,styleqml,stylesld,useasdefault,description,owner,ui,update_time,type )

SELECT f_table_catalog,f_table_schema,f_table_name,f_geometry_column,stylename,styleqml,stylesld,useasdefault,description,owner,ui,update_time,type  FROM enc.qgislayerstyle;

Vous pouvez dès à présent tester en chargeant une couche du schéma enc dans QGis.

Chargement des couches dans QGis.

Tout comme pour le projet Geopackage, nous avons adapté un script Python pour QGis pour charger les couches souhaitées à partir de la base de données, avec leur symbologie par défaut et en pouvant définir une échelle minimum d’affichage.

Le script load_layers_postgis.py comprend une liste de 210 couches S57, ordonnées pour un affichage correct:

Les couches surfaciques représentées par des polygones pleins, puis les couches surfaciques représentées par des polygones vides (seuls les périmètres sont affichés), puis les couches de type linéaire et finalement les couches de type ponctuel. A l’intérieur de chaque catégorie l’ordre a été étudié pour éviter les masquages d’information.

Chaque couche est accompagnée avec une valeur d’échelle minimale d’affichage, par défaut 100000000.

Exemple:

#Liste des couches dans l’ordre de chargement
couches_a_charger = [
(‘pl_DEPARE’, 100000000),
(‘pl_UNSARE’, 100000000),
(‘pl_TIDEWY’, 100000000),
(‘pl_DAMCON’, 100000000),
(‘pl_CAUSWY’, 100000000),
(‘pl_HULKES’, 100000000),
Pour que le script ne charge pas des couches qui ne vous intéressent pas, vous pouvez tout simplement mettre en commentaire la ligne correspondante en ajoutant un ‘#’ en début de ligne:

#Liste des couches dans l’ordre de chargement
couches_a_charger = [
(‘pl_DEPARE’, 100000000),
(‘pl_UNSARE’, 100000000),
#(‘pl_TIDEWY’, 100000000),
#(‘pl_DAMCON’, 100000000),

Dans cet exemple, les couches TIDEWY et DAMCON ne seront pas chargées.

De plus, si vous souhaitez définir une échelle minimale d’affichage pour une couche, il suffit de modifier la valeur correspondante:

‘pl_DEPARE’, 100000000),
(‘pl_UNSARE’, 100000000),
(‘pl_TIDEWY’, 100000),
#(‘pl_DAMCON’, 100000000),
#(‘pl_CAUSWY’, 100000000),
(‘pl_HULKES’, 100000000),
(‘pl_LOKBSN’, 100000000),
(‘pl_OBSTRN’, 50000),

Dans cet exemple la couche TIDEWY ne sera affichée que quand le zoom de la fenêtre cartographique aura une valeur inférieure à 100000 et la couche OBSTRN quand la valeur sera inférieure à 50000.

Pour utiliser le script:

  • téléchargez le fichier .py (il est dans enc_fichiers2.7z)
  • enregistrez-le dans un répertoire de votre choix
  • Ouvrez la console Python de QGis (Extensions ->Console Python)

  • Ouvrez la fenêtre d’Editeur (1)
  • Cliquez sur l’icône Parcourir (2) et pointez sur le fichier .py téléchargé
  • Modifiez les données de connexion à la base postgresql (3)
  • Modifiez le nom de votre schéma enc (4)
  • Exécutez le script (5)

Avant de l’exécuter vous pouvez effectuer les modifications pour ne pas charger certaines couches ou pour leur affecter une échelle minimale différente. N’oubliez pas d’enregistrer ces modifications avant de fermer votre projet.

Gestion de l’échelle d’affichage

Le script précédent permet de définir une échelle minimum au moment du premier chargement des couches dans le projet. Quand vous sauvegardez votre projet, c’est la valeur présente dans le champ Min_scale de la couche qui est sauvegardé. A l’ouverture du projet, ce sont les paramètres d’affichage au moment de la fermeture du projet qui sont pris en comte. Vous n’utiliserez donc le script précédent qu’au début du travail sur un projet. Mais les échelles définies dans le script load_layers peuvent ne pas être adaptés à votre zone de travail. Vous pourrez donc être amené à modifier les valeurs d’échelle min pour certaines couches.

Nous mettons à votre disposition un script Python, setminscale.py , qui permet de définir l’échelle minimum d’affichage pour toutes les couches sélectionnées dans le panneau Couches. Une fois enregistré votre projet, ces paramètres seront utilisés à chaque ouverture du projet.

Pour l’utiliser, commencez par le charger dans la console Python de QGis, sélectionnez (mettez en surbrillance) les couches que vous souhaitez modifier dans le panneau Couches, et, surtout, modifiez la ligne

#Définir l’échelle minimale (par exemple, 1:50000)
min_scale = 250000par la valeur souhaitée pour l’échelle minimale d’affichage.

Un script Python pour filtrer les couches par « purpose »

Les tables de votre base de données comportent un attribut nommé « purpose » .C’est une valeur comprise entre 1 et 6 et qui correspond à l’objectif principal de la carte:

  • 1 : Vue d’ensemble
  • 2 : Généralités
  • 3 : Côtière
  • 4 : Approche
  • 5 : Port
  • 6 : Accostage

Si vous avez des cartes avec des finalités différentes qui couvrent une même zone, par exemple une carte de type Généralités et une carte de type Approche,vous aurez des informations en double. Si les entités de deux cartes ne sont pas de même type (une entité surfacique d’une carte Approche correspondra à une entité ponctuelle de la carte Généralités, par exemple) le rendu peut devenir rapidement très brouillon. La solution proposée est simple, appliquer un filtre aux couches du projet pour n’afficher que celles qui ont la même valeur de « purpose ». Pour filtrer l’affichage de toutes les couches chargées dans le projet QGis, vous pouvez utiliser le script filter_purpose.py

Chargez le script dans la console python, modifiez la ligne:

#Définir le valeur de l’attribut « purpose » à filtrer
valeur_purpose = 5

par la valeur de purpose souhaitée, puis exécutez le script. Toutes les couches présentes dans le panneau Couchers du projet seront filtrées.

Si vous voulez supprimer tous les filtres actifs sur toutes les couches du projet, le script unfilter.py vous permet de le faire.

Si cet article vous a intéressé et que vous pensez qu'il pourrait bénéficier à d'autres personnes, n'hésitez pas à le partager sur vos réseaux sociaux en utilisant les boutons ci-dessous. Votre partage est apprécié !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *