Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

GEODATA DAYS 2024

#1 Mon 17 October 2016 15:28

dungeonkeeper81
Participant actif
Lieu: Lausanne
Date d'inscription: 12 Jan 2011
Messages: 70
Site web

QGIS: Reprise automatique des alias entre postgresql et Qgis

Bonjour,

J'ai découvert récemment que les commentaires intégrés aux données dans postgresql sont automatiquement repris dans QGIS:

[img]http://img4.hostingpics.net/pics/643932PGSQLQGIS.png[/img]

J'ai tout de suite flairé la belle affaire et j'ai cherché si il était possible de stocker des alias dans postgresql pour implémenter automatiquement le champ concerné (Alias).

Malheureusement je n'ai rien trouvé de concluant :

Sur qgis.org:
Cependant, il y a certains aspects du SQL que QGIS ignore tel que l’utilisation d’alias ou de colonnes générées par des fonctions SQL.


sad J'éspère qu'ils rigolent big_smile

A votre avis, est-ce que c'est possible de stocker des alias dans postgresql pour être repris directement dans QGIS ?

Merci d'avance pour vos éventuelles réponses.

Hors ligne

 

#2 Mon 17 October 2016 15:45

Sylvain PIERRE
Participant assidu
Lieu: Strasbourg
Date d'inscription: 6 Sep 2005
Messages: 170

Re: QGIS: Reprise automatique des alias entre postgresql et Qgis

Bonjour,

Oui c'est possible, j'avais testé la solution il y a qq temps, voici un bout de code qui le fait, à vous de l'adapter:

Code:

from qgis.core import QgsMapLayerRegistry
from qgis.gui import *
import qgis.utils
inLayer = 'ouvrage'
for layer in QgsMapLayerRegistry.instance().mapLayers().values():
    if inLayer in layer.name():
        print layer.name()
        prov = layer.dataProvider()
        #for field in layer.pendingFields():
        i=0
        for field in prov.fields():
                    print field.name()
                    print field.comment()
                    print prov.fields().field(i).name()
                    #field.append(displayString(field.comment()))
                    layer.addAttributeAlias(i,field.comment())
                    i+=1

Sylvain

Hors ligne

 

#3 Tue 18 October 2016 10:34

dungeonkeeper81
Participant actif
Lieu: Lausanne
Date d'inscription: 12 Jan 2011
Messages: 70
Site web

Re: QGIS: Reprise automatique des alias entre postgresql et Qgis

Merci Sylvain pour ce bout de code qui fait vraiment bien le boulot !

Il fonctionne à merveille et ça évite de perdre du temps (et les nerfs) à réécrire chaque Alias.

Je vais quand même continuer à rechercher une solution pour stocker ces infos dans la base de données.

Le but étant de ne faire la mise à jour à un seul endroit.

Mais merci encore.

Dernière modification par dungeonkeeper81 (Tue 18 October 2016 11:39)

Hors ligne

 

#4 Tue 18 October 2016 22:56

JD
Moderateur
Date d'inscription: 8 Aug 2013
Messages: 726

Re: QGIS: Reprise automatique des alias entre postgresql et Qgis

Bonsoir,

Les données concernant les alias sont sockés dans le style et le style peut être sauvegardé dans la base postgres.
De ce fait en créant un style par défaut dans la base, les alias pourraient être récupés d'office.
Je ne vois donc pas trop l'intérêt de les stocker dans les commentaires (sauf si tu veux une trace dans postgres en terme de métadonnées).

J'avais eu l'idée il y a quelque temps de développer un plugin pour stocker les métadonnées d'une couche postgres et les récupérer dans qgis. J'étais passé complètement à côté de cette information ( le fait que les commentaires soient repris).

Du coups je suis persuadé maintenant que cela à tout son sens.

En stockant la donnée sous la forme de json dans les commentaires de la table et des colonnes ,on aurait aucun mal au chargement de la couche à modifier les informations stockées dans les propriétés de cette couche.

Ca ne doit pas demander beaucoup de temps de développement à vu de nez.
Je veux bien développer un peu mais j'aimerais bien ne pas à avoir tout faire.
Y a-t-il des développeurs qui traînent dans le coin et qui veulent mettre la main à la pâte ?

Cordialement

Dernière modification par lejedi76 (Wed 19 October 2016 00:16)

Hors ligne

 

#5 Wed 19 October 2016 09:44

Sylvain PIERRE
Participant assidu
Lieu: Strasbourg
Date d'inscription: 6 Sep 2005
Messages: 170

Re: QGIS: Reprise automatique des alias entre postgresql et Qgis

Bonjour,

On doit pouvoir gérer tout ça uniquement côté base de données. Je vais prendre l'exemple de la base permanente des équipements de l'INSEE.
Typologie de 179 type d'équipements:
[img]http://imageshack.com/a/img924/990/AKxjB6.png[/img]

La table des données:
[img]http://imageshack.com/a/img924/9559/MJgynS.png[/img]

Avec une fonction plpgsql on va pouvoir aller ajouter les libellés de champs en tant que commentaire dans la table de données:

Code:

--- fonction d'insertion des commentaires sur la table de description des équipements
DROP FUNCTION sdaasp.insert_comment();
CREATE OR REPLACE FUNCTION sdaasp.insert_comment() 
RETURNS void AS
$BODY$
DECLARE
    _sql_comment TEXT;
BEGIN
    FOR _sql_comment IN
        SELECT 'COMMENT ON COLUMN '||col.table_schema||'.bpe_com_2014."'|| col.column_name ||'" IS ''' ||replace(bpe.lib_equipt, '''', '''''')||''';' sqlquery
        FROM information_schema.columns col, sdaasp.bpe_desc_equipt_2014 bpe 
        WHERE table_name='bpe_com_2014' and bpe.equipt = col.column_name
    LOOP
        EXECUTE '' || _sql_comment || '';
        RAISE NOTICE '%', _sql_comment;
    END LOOP;
END;
$BODY$
LANGUAGE 'plpgsql';

Il faut bien sur adapter le code aux cas particuliers, mais cette fonction gère déjà les apostrophes. Voir si d'autres caractères pourraient poser des problèmes.

Voilà

Bonne journée

Sylvain

Dernière modification par Sylvain PIERRE (Wed 19 October 2016 09:48)

Hors ligne

 

#6 Wed 19 October 2016 18:53

JD
Moderateur
Date d'inscription: 8 Aug 2013
Messages: 726

Re: QGIS: Reprise automatique des alias entre postgresql et Qgis

Bonsoir Sylvain,

Je comprends ta fonction mais je ne vois pas trop où tu veux en venir avec ton exemple.
Je parlais de récupérer des metadonnées dans qgis (outre celles déjà présentes et déjà renseignées comme l' emprise, srid...) qu'on stockerait dans postgres.

Exemple : titre, résumé, mot clés etc...

Cordialement,

Hors ligne

 

#7 Wed 26 August 2020 18:37

Bruno Defrance
Juste Inscrit !
Lieu: Grenoble
Date d'inscription: 27 Sep 2005
Messages: 8

Re: QGIS: Reprise automatique des alias entre postgresql et Qgis

Bonjour,

Le même code en QGIS 3

Code:

from qgis.core import QgsProject
from qgis.gui import *
import qgis.utils
inLayer = 'chantiers'
for layer in QgsProject.instance().mapLayers().values():
    if inLayer in layer.name():
        print(layer.name())
        prov = layer.dataProvider()
        #for field in layer.pendingFields():
        i=0
        for field in prov.fields():
                    print( field.name())
                    print( field.comment())
                    print( prov.fields().field(i).name())
                    #field.append(displayString(field.comment()))
                    layer.setFieldAlias(i,field.comment())
                    i+=1

Bruno

Hors ligne

 

Pied de page des forums

Powered by FluxBB