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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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. smile

Hors ligne

 

#4 Fri 29 July 2016 09:46

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1235
Site web

Re: QGIS: Automatisation de la génération d'un Atlas avec script python

Bravo et merci pour le partage !


Mathieu BOSSAERT
Association GeoRezo

Hors ligne

 

Pied de page des forums

Powered by FluxBB