#1 Fri 26 August 2022 16:24
- cllemendavvid
- Juste Inscrit !
- Date d'inscription: 21 Sep 2020
- Messages: 6
QGIS: creer une table depuis un script python
Bonsoir à tous
Je suis novice en python
je souhaite simplement transvaser sur Qgis un résultat récupéré depuis une requête Postgresql
le résultat doit être une table Qgis
Pour cela je voudrais écrire un script python
Après l'import des différents modules
je passe d'abord par une connexion à une base de données Postgresql
puis je créer une couche vecteur
le but ensuite est de transvaser le résultat de la requête Sql
vers la couche Qgis
J'ai récupéré le début d'un ancien code, ça donne ceci
Code:
import psycopg2 import psycopg2.extras import os from qgis.core import * from qgis.utils import iface from PyQt4.QtCore import* import processing Host = serveur DBname = bdd schema = Schema User = login Password = mot_de_passe Folder=Dossier conn_string = "host='"+Host+"' dbname='"+DBname+"' user='"+User+"' password='"+Password+"'" conn = psycopg2.connect(conn_string) cursor = conn.cursor() uri1='None' EtiQuet = QgsVectorLayer(uri1,"EtiQuet","memory") pr = EtiQuet.dataProvider() EtiQuet.startEditing() pr.addAttributes([QgsField("section",QVariant.String),QgsField("code_cb",QVariant.String),QgsField("capacite",QVariant.Int),QgsField("nb_etiq",QVariant.Int) ]) requete1 ="SELECT * FROM pm996.cb" #cette requete ne sera pas celle utilisée mais plus simple pour l'exemple cursor.execute(requete1) resultats = cursor.fetchall()
Puis je pense utiliser les fonctions suivantes
QgsFeature() | addFeatures
merci de votre aide
Hors ligne
#2 Fri 26 August 2022 17:27
- p.jeremie
- Participant assidu
- Lieu: Valence
- Date d'inscription: 10 Sep 2017
- Messages: 427
Re: QGIS: creer une table depuis un script python
Bonjour,
Je ne peux pas vous répondre sur la partie python, mais je m'interroge : si votre requête SQL est assez complexe, pourquoi ne pas en faire une vue dans postgres, que vous pourriez récupérer dans QGIS ? Si votre enquête est assez simple, peut être est-il possible de la paramétrer directement dans QGIS soit via le constructeur de requête pour votre couche source, soit via une couche virtuelle.
Hors ligne
#3 Mon 29 August 2022 17:18
- cllemendavvid
- Juste Inscrit !
- Date d'inscription: 21 Sep 2020
- Messages: 6
Re: QGIS: creer une table depuis un script python
Bonjour
merci d'avoir répondu
p.jeremie :
pourquoi ne pas en faire une vue dans postgres,
la vue, oui c'est une bonne idée, à vrai dire, j'ai pas accès à Postgres
et ensuite la table est une liste que l'on récupère une seule fois donc
le script est tout aussi adapté je pense
Et vue que Python est bien utile sur Qgis c'est l'occasion d'en apprendre un petit peu :)
CD
Hors ligne
#4 Tue 06 September 2022 11:49
- cllemendavvid
- Juste Inscrit !
- Date d'inscription: 21 Sep 2020
- Messages: 6
Re: QGIS: creer une table depuis un script python
Bonjour
finalement j'ai trouvé , voici la solution
Code:
... cursor = conn.cursor() uri1='None' EtiQuet = QgsVectorLayer(uri1,"EtiQuet","memory") pr = EtiQuet.dataProvider() EtiQuet.startEditing() pr.addAttributes(\ [ QgsField("section",QVariant.String),QgsField("code_cb",QVariant.String),QgsField("capacite",QVariant.Int),QgsField("nb_etiq",QVariant.Int) ]) requete1 = "Create.." cursor.execute(requete1) resultats = cursor.fetchall() for i in range (0, len(resultats)): feat=QgsFeature() feat.setAttributes( [resultats[i][0], resultats[i][1],resultats[i][2],resultats[i][3] ]) pr.addFeatures([feat]) EtiQuet.commitChanges() layer_sp=QgsMapLayerRegistry.instance().addMapLayer(EtiQuet) QgsVectorFileWriter.writeAsVectorFormat(layer_sp, Dossier + '\\'+schema+'.xlsx', 'utf8', None, 'XLSX') conn.commit() cursor.close() conn.close()
fetchall --> vers une liste 2D "resultats"
puis une boucle pour ajouter les éléments dans un objet QgsFeature()
Hors ligne