Pages: 1
- Sujet précédent - QGIS: Automatisation de la génération d'un Atlas avec script python - Sujet suivant
#1 Mon 18 July 2016 17:50
- jerome_m
- Participant actif
- Lieu: Montpellier
- Date d'inscription: 28 Nov 2012
- Messages: 51
QGIS: Automatisation de la génération d'un Atlas avec script python
Bonjour à tous,
j'essaie de créer un script python pour automatiser la génération d'atlas Qgis.
Ce que j'ai :
- Un projet qgis avec des couches postgres, wms, etc
- Un composteur qui permet de créer un atlas : ce dernier est déjà configuré (nom des fichiers en sorties, filtres, etc...)
Actuellement, pour générer mon atlas, je dois ouvrir le projet sous Qgis, ouvrir le composeur, faire "Exporter l'Atlas au format PDF", sélectionner le dossier de destination.
J'aimerai automatiser cette tache avec un script python.
J'ai réussi à le faire pour un composeur sans atlas avec le code suivant :
import os
from qgis.core import QgsProject
from qgis.gui import QgsMapCanvas, QgsLayerTreeMapCanvasBridge
from qgis.core.contextmanagers import qgisapp
from PyQt4.QtCore import QFileInfo
project_path = 'D:/xxx/atlas_gn_2_14.qgs'
canvas = QgsMapCanvas(None)
# Load project
bridge = QgsLayerTreeMapCanvasBridge(QgsProject.instance().layerTreeRoot(), canvas)
QgsProject.instance().read(QFileInfo(project_path))
# Load the composer
composerView = qgis.utils.iface.activeComposers()[0]
composition = composerView.composition()
# Export en pdf
composition.exportAsPDF('D:/xxx/report.pdf')
QgsProject.instance().clear()
Dans le cas d'un atlas, je n'arrive pas à le générer : mon export se fait mais sans l'atlas activé...
En regardant sur internet, je vois que certains ont testé en reparamétrant l'atlas (couche de couverture, format en sortie, filtre...) (mais cela ne fontionne pas chez moi, l'atlas ne s'active pas...)
Vu que tout est déjà sauvegardé dans mon fichier qgs, je pense qu'il doit y avoir un moyen simple de la générer.
Est ce que quelqu'un aurait une piste pour m'aider ?
Merci d'avance
Hors ligne
#2 Tue 19 July 2016 01:03
- JD
- Moderateur
- Date d'inscription: 8 Aug 2013
- Messages: 726
Re: QGIS: Automatisation de la génération d'un Atlas avec script python
Bonsoir,
j'ai pas vu comment on faisait pour exporter l'atlas en un seul fichier, y'a l'option atlas.setSingleFile(True) mais je ne vois pas comment le faire marcher :
Code:
# Load the composer composerView = qgis.utils.iface.activeComposers()[0] composition = composerView.composition() atlas = composition.atlasComposition() composition.setAtlasMode(QgsComposition.ExportAtlas) ####partie à substituer atlas.beginRender() for i in range(0,atlas.numFeatures()): atlas.prepareForFeature(i) composition.exportAsPDF(ur'D://xxx/report_{}.pdf'.format(i)) atlas.endRender()
Après tu peux merger les pdf de manière classique
Après une petite demi heure de recherche pour faire l'export en un seul fichier pdf :
tu peux remplacer la partie à substituer ci-dessus par :
Code:
printer = QPrinter() painter = QPainter() outpout = ur'C://test.pdf' composition.beginPrintAsPDF(printer, output) painter.begin(printer) atlas.beginRender() for i in range(0, atlas.numFeatures()-1): atlas.prepareForFeature( i ) composition.doPrint(printer, painter) printer.newPage() atlas.prepareForFeature( i +1) composition.doPrint(printer, painter) atlas.endRender() painter.end()
ajouter les modules au début :
Code:
from PyQt4.QtGui import (QPainter, QPrinter)
Dernière modification par lejedi76 (Tue 22 November 2016 14:59)
Hors ligne
#3 Thu 28 July 2016 17:19
- jerome_m
- Participant actif
- Lieu: Montpellier
- Date d'inscription: 28 Nov 2012
- Messages: 51
Re: QGIS: Automatisation de la génération d'un Atlas avec script python
Merci, avec ton aide, j'ai réussi à faire ce que je souhaité !
Voici le code avec l'utilisation d'un filtre pour n'exporter que certaines pages de l'atlas :
Code:
########CONFIGURATION########### # Filtre filtreOp = 'id > 300' repertoireTravail = 'E:/xxx/' ############################## print "Debut de generation de l'Atlas" + typeAtlas project_path = repertoireTravail + '/xxx.qgs' canvas = QgsMapCanvas(None) # will reparent it to widget via layout # Load our project bridge = QgsLayerTreeMapCanvasBridge(QgsProject.instance().layerTreeRoot(), canvas) QgsProject.instance().read(QFileInfo(project_path)) # Load the composer # on parcourt la liste des composeurs pour ouvrir le bon composerId = 0 composerList = iface.activeComposers() print "Nombre de composeurs : " + format(len(composerList)) for item in composerList: if item.composerWindow().windowTitle() == 'my_compo_xxx': break composerId += 1 print "Num du composeur : " + format(composerId) composerView = composerList[composerId] composerWindow = composerView.composerWindow() composition = composerView.composition() atlas = composition.atlasComposition() #on definit le filtre atlas.setFilterFeatures(True) atlas.setFeatureFilter(filtreOp) atlas.setPageNameExpression("'op_'||\"id\"") #on active l'atlas composition.setAtlasMode(QgsComposition.ExportAtlas) print "Nombre de fiches a generer : " + format(atlas.numFeatures()) atlas.beginRender() for i in range(0,atlas.numFeatures()): atlas.prepareForFeature(i) composition.exportAsPDF(repertoireTravail + ur'Export_atlas_pyqgis/'+ atlas.nameForPage(i) +'.pdf') print "Fiche " + format(i) + " OK" atlas.endRender() composerWindow.close() QgsProject.instance().clear() print "Export OK"
Mon seul problème à présent est qu'à la fin, je n'arrive pas à réinitialiser complètement Qgis (équivalent de Projet / Nouveau). Si je ne fais pas cette opération manuellement, les anciens composeurs restent actif si je relance le script sur un nouveau projet (malgrè le QgsProject.instance().clear())
Merci en tout cas de ton aide, car ce genre de script est bien pratique. Prochaine étape, l'exécuter en dehors de Qgis sur un serveur.
Hors ligne
Pages: 1
- Sujet précédent - QGIS: Automatisation de la génération d'un Atlas avec script python - Sujet suivant