#1 Wed 23 May 2018 22:13
- Lsam
- Participant assidu
- Date d'inscription: 27 Nov 2013
- Messages: 157
QGIS: export automatique atlas en ligne de commande
Bonjour,
Sur un petit serveur sans interface graphique, sous Debian, je cherche le moyen d'exporter automatiquement un atlas en fichiers images. Cet atlas et le composeur sont enregistrés dans un projet qgs.
Peut-on le faire avec un script Python ? J'ai pas mal cherché et pour le moment j'arrive à lire un fichier projet mais pas à utiliser le composeur et l'atlas. Faut-il tout redéfinir en Python ?
Voici où j'en suis (je débute, et je souhaite plutôt utiliser Python 2.7 / PyQt 4 pour l'instant) :
Code:
>>> from qgis.core import QgsProject >>> from PyQt4.QtCore import QFileInfo >>> fichier = QFileInfo('/chemin/vers/projet.qgs') >>> projet = QgsProject.instance() >>> projet.read(fichier) False
Ce False est déjà étonnant car le chemin est bon.
Et ensuite quelles classes utiliser pour récupérer le composeur ?
Merci par avance pour vos lumières.
LSam
Hors ligne
#2 Thu 24 May 2018 10:07
Re: QGIS: export automatique atlas en ligne de commande
Bonjour,
Je viens de tester vos lignes de commande, et celles-ci fonctionnent chez moi
Peut-être tentez ceci en testant l'existence du fichier dans un premier temps :
Code:
from qgis.core import QgsProject from PyQt4.QtCore import QFileInfo import os fichier = 'D:/WKSP/1_TRAVAUX/180329_EOLIENS_RAPACES/180329_EOLIENS_RAPACES.qgs' if os.path.isfile(fichier): print("le fichier projet existe") fichier = QFileInfo(fichier) projet = QgsProject.instance() projet.read(fichier)
Sinon, voici une fonction qui permet de récupérer une composition :
Code:
from qgis.utils import iface def getCompositionByName(name) : ''' récupère le composeur dont le nom est name ''' for composer_view in iface.activeComposers() : print composer_view.composerWindow().windowTitle() if composer_view.composerWindow().windowTitle() == name : myComposition = composer_view.composition() return(myComposition) getCompositionByName("Composeur 1")
geodata au cerema et petits billets en géomatique
Hors ligne
#3 Thu 24 May 2018 16:23
- Lsam
- Participant assidu
- Date d'inscription: 27 Nov 2013
- Messages: 157
Re: QGIS: export automatique atlas en ligne de commande
Merci Mathieu pour la réponse.
Autant pour moi, le fichier n'existait tout simplement pas (j'étais pas sur le bon serveur dans ma console !). Après correction, le fichier projet est désormais bien lu.
Par contre, il ne trouve pas l'attribut activeComposers() !
Code:
>>> from qgis.core import QgsProject >>> from PyQt4.QtCore import QFileInfo >>> from qgis.utils import iface >>> l = iface.activeComposers() Error in sys.excepthook: Traceback (most recent call last): File "/usr/lib/python2.7/dist-packages/qgis/utils.py", line 196, in qgis_excepthook showException(type, value, tb, None, messagebar=True) File "/usr/lib/python2.7/dist-packages/qgis/utils.py", line 107, in showException open_stack_dialog(type, value, tb, msg) File "/usr/lib/python2.7/dist-packages/qgis/utils.py", line 142, in open_stack_dialog iface.messageBar().popWidget() AttributeError: 'NoneType' object has no attribute 'messageBar' Original exception was: Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'activeComposers'
Est-ce parce que je ne peux pas accéder à l'interface graphique sur mon serveur ?
Pour info je suis en Python 2.7.13, python-qgis 2.18.19 et pyqt 4.11, sans interface graphique.
Dernière modification par Lsam (Thu 24 May 2018 16:24)
Hors ligne
#5 Thu 31 May 2018 22:07
- Lsam
- Participant assidu
- Date d'inscription: 27 Nov 2013
- Messages: 157
Re: QGIS: export automatique atlas en ligne de commande
Bonsoir,
Voici ce que ça donne :
Code:
>>> from qgis.core import QgsProject >>> from PyQt4.QtCore import QFileInfo >>> from qgis.utils import iface >>> fichier = QFileInfo('/chemin/vers/projet.qgs') >>> projet = QgsProject.instance() >>> projet.read(fichier) True >>> print projet.fileName() /chemin/vers/projet.qgs >>> l = iface.activeComposers() Error in sys.excepthook: Traceback (most recent call last): File "/usr/lib/python2.7/dist-packages/qgis/utils.py", line 196, in qgis_excepthook showException(type, value, tb, None, messagebar=True) File "/usr/lib/python2.7/dist-packages/qgis/utils.py", line 107, in showException open_stack_dialog(type, value, tb, msg) File "/usr/lib/python2.7/dist-packages/qgis/utils.py", line 142, in open_stack_dialog iface.messageBar().popWidget() AttributeError: 'NoneType' object has no attribute 'messageBar' Original exception was: Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'activeComposers' >>> dir(iface) ['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
On dirait qu'il manque pas mal de chose ?!
Merci
Dernière modification par Lsam (Thu 31 May 2018 22:08)
Hors ligne
#6 Tue 12 June 2018 10:54
- JD
- Moderateur
- Date d'inscription: 8 Aug 2013
- Messages: 726
Re: QGIS: export automatique atlas en ligne de commande
Bonjour,
tu essaies d'exécuter le script python en dehors de qgis ?
Si c'est le cas, iface n'existe pas et n'est pas initialisé.
Tu ferais mieux d'exécuter ton script python via qgis (tu auras accès à iface) :
Code:
qgis --code mon_fichier.py
en prévoyant de tuer qgis dans ton script python
Cordialement,
Hors ligne
#7 Tue 12 June 2018 18:14
- Lsam
- Participant assidu
- Date d'inscription: 27 Nov 2013
- Messages: 157
Re: QGIS: export automatique atlas en ligne de commande
Bonjour,
D’accord, merci je comprends mieux.
Du coup ça ne m'arrange pas d'utiliser QGis directement, car je voudrais exporter automatiquement des cartes au format PNG à partir de tables d'un serveur PostGIS sans interface graphique.
Que me reste-t-il comme solution ?
Il faut que je construise mon composeur et mon atlas de toute pièce dans un script Python ? Impossible donc de partir d'un fichier projet ?
Cordialement,
Hors ligne
#8 Sat 08 December 2018 07:43
- mickael_53
- Participant occasionnel
- Date d'inscription: 7 Dec 2018
- Messages: 11
Re: QGIS: export automatique atlas en ligne de commande
Bonjour à tous,
Je suis nouveau sur le forum et comme utilisateur de python. Avec votre aide précieuse, j'ai réalisé un script python pour pouvoir exporter en pdf les cartes d'un atlas et ça fonctionne. Voici le code :
Code:
import os from qgis.core import QgsProject from qgis.gui import QgsMapCanvas, QgsLayerTreeMapCanvasBridge from qgis.core.contextmanagers import qgisapp from PyQt4.QtCore import QFileInfo ########CONFIGURATION########### repertoireTravail = 'C:/GEOLIS_2/' ############################## project_path = repertoireTravail + '/atlas.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 composerView = qgis.utils.iface.activeComposers()[0] composition = composerView.composition() atlas = composition.atlasComposition() composition.setAtlasMode(QgsComposition.ExportAtlas) atlas.beginRender() for i in range(0,atlas.numFeatures()): atlas.prepareForFeature(i) composition.exportAsPDF('C:/GEOLIS_2/report_5'+str(i)+'_carte.pdf') atlas.endRender()
Par contre j'aimerai pouvoir modifier le nom de sortie des export PDF mais là je ne sais pas faire. Dans Qgis j'ai paramétré le nom du fichier d'export comme ceci :
"matricule" ||'_'||year( now())||'_'|| month( now())||'_'|| case when length(day(now()))=1 then ('0'||day(now())) else day(now()) end ||'_carte'
Le champ matricule provient de ma table qui me sert de couche de couverture "emprise_territoire"
Pourriez vous m'aider ? Je vous remercie et bonne continuation.
Mickaël
Hors ligne
#9 Thu 15 April 2021 10:35
- ppluvinet
- Participant assidu
- Lieu: LYON
- Date d'inscription: 6 Aug 2007
- Messages: 609
Re: QGIS: export automatique atlas en ligne de commande
Bonjour,
Je réactive ce sujet. En effet, je souhaite faire la même chose avec QGIS 3.16 , à savoir exporter un atlas d'un composeur , mais j'ai un message d'erreur :
Code:
composerView = qgis.utils.iface.activeComposers()[0] NameError: name 'qgis' is not defined
Mon script est le suivant :
Code:
import os from qgis.core import QgsApplication, QgsProject, QgsProject from qgis.core import QgsProject from qgis.gui import QgsMapCanvas, QgsLayerTreeMapCanvasBridge from qgis.utils import iface from qgis.core.contextmanagers import qgisapp from PyQt5.QtCore import QFileInfo import sys print(os.environ['OSGEO4W_ROOT']) projectPath = sys.argv[1] renderingPath = sys.argv[2] ComposerName = sys.argv[3] def printAtlas(projectPath, renderingPath): canvas = QgsMapCanvas(None) # will reparent it to widget via layout # Load our project bridge = QgsLayerTreeMapCanvasBridge(QgsProject.instance().layerTreeRoot(), canvas) #QgsProject.instance().read(QFileInfo(projectPath)) QgsProject.instance().read(projectPath) # Load the composer composerView = qgis.utils.iface.activeComposers()[0] #composerView = activeComposers()[0] composition = composerView.composition() atlas = composition.atlasComposition() composition.setAtlasMode(QgsComposition.ExportAtlas) atlas.beginRender() for i in range(0,atlas.numFeatures()): atlas.prepareForFeature(i) composition.exportAsPDF(renderingPath+str(i)+'_carte.pdf') atlas.endRender() qgs = QgsApplication([], True) # load providers qgs.initQgis() printAtlas(projectPath, renderingPath) # When your script is complete, call exitQgis() to remove the provider and # layer registries from memory qgs.exitQgis()
Si quelqu'un a fait récemment la même chose, je suis preneur !
Merci d'avance pour votre retour,
Dernière modification par ppluvinet (Thu 15 April 2021 10:36)
Pascal PLUVINET
Hors ligne
#10 Thu 15 April 2021 12:15
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3881
Re: QGIS: export automatique atlas en ligne de commande
Bonjour,
Pas lu le code mais le message d'erreur dit que 'qgis' n'est pas défini, et aussi vous importez iface déjà donc remplacez la ligne boguée par
Code:
composerView = iface.activeComposers()[0]
Hors ligne
#11 Fri 16 April 2021 09:59
- JD
- Moderateur
- Date d'inscription: 8 Aug 2013
- Messages: 726
Re: QGIS: export automatique atlas en ligne de commande
Bonjouor,
depuis la version 3, l'API a complètement changé.
Regarder ce post sur stackexchange qui explique exactement comment on fait ceci :
https://gis.stackexchange.com/questions … mmand-line
Hors ligne
#12 Fri 16 April 2021 11:14
- ppluvinet
- Participant assidu
- Lieu: LYON
- Date d'inscription: 6 Aug 2007
- Messages: 609
Re: QGIS: export automatique atlas en ligne de commande
Merci pour vos pistes. J'ai réussi à faire ce que je souhaitais avec QGIS 3.16. Je me suis largement inspiré de plusieurs sources.
Je partage mes scripts mais n'ayant plus fait de python depuis 2-3 ans, il y a surement des améliorations à faire. Je n'ai pas bien le temps d'aller + loin.
Dans mon cas, j'ai 12 projets QGZ avec pour chacun d'eux un atlas nommé 'page'.
J'ai créé un fichier Python "exportpage.py" et un fichier bat "Export_page_QGIS3.16.bat" qui permet de lancer le script python sur chaque projet qgz. Ces scripts sont dans le même répertoire que les projets QGIS.
Script Python "exportpage.py":
Code:
from qgis.core import QgsApplication, QgsProject, QgsLayoutExporter import os from qgis.core import QgsApplication, QgsProject, QgsProject from qgis.core import QgsProject from qgis.gui import QgsMapCanvas, QgsLayerTreeMapCanvasBridge from qgis.utils import iface from qgis.core.contextmanagers import qgisapp from PyQt5.QtCore import QFileInfo import sys def export_atlas(qgs_project_path, layout_name, outputs_folder): # Open existing project project = QgsProject.instance() project.read(qgs_project_path) # Open prepared layout that as atlas enabled and set layout = project.layoutManager().layoutByName(layout_name) # Start atlas iterator atlas = layout.atlas() if atlas.beginRender(): while atlas.next(): exporter = QgsLayoutExporter(layout) settings = QgsLayoutExporter.ImageExportSettings() filename = atlas.currentFilename()+'_.png' #f'atlas.currentFilename().png' filename_path = os.path.join(outputs_folder, filename) print(f'Export '+atlas.currentFilename()) exporter.exportToImage(filename_path, settings) print(f'finished') atlas.endRender() else: print('WARNING - No atlas features available for export!') def main(): # Start a QGIS application without GUI qgs = QgsApplication([], False) qgs.initQgis() #Chemon des projets qgz, chemin du répertoire d'export et nom du composeur project_path = sys.argv[1] output_folder = 'O:/RESTITUTION/' layout_name = 'page' export_atlas(project_path, layout_name, output_folder) # Close the QGIS application qgs.exitQgis() if __name__ == "__main__": main()
Script BAT "Export_page_QGIS3.16.bat"
Code:
@echo off call "C:\Program Files\QGIS 3.16\bin\o4w_env.bat" call qt5_env.bat call py3_env.bat path %OSGEO4W_ROOT%\apps\qgis-ltr\bin;%PATH% set QGIS_PREFIX_PATH=%OSGEO4W_ROOT:\=/%/apps/qgis-ltr set GDAL_FILENAME_IS_UTF8=YES rem Set VSI cache to be used as buffer, see #6448 set VSI_CACHE=TRUE set VSI_CACHE_SIZE=1000000 set QT_PLUGIN_PATH=%OSGEO4W_ROOT%\apps\qgis-ltr\qtplugins;%OSGEO4W_ROOT%\apps\qt5\plugins SET PYTHONPATH=C:\PROGRA~1\QGIS3~1.16\apps\Python37;C:\PROGRA~1\QGIS3~1.16\apps\Python37\Scripts;C:\Program Files\QGIS 3.16\apps\qgis-ltr\python SET QT_QPA_PLATFORM_PLUGIN_PATH=C:\PROGRA~1\QGIS3~1.16\apps\Qt5\plugins SET PATH=%PATH%;C:\PROGRA~1\QGIS3~1.16\apps\Qt5\bin;C:\PROGRA~1\QGIS3~1.16\apps\Python37\Lib\site-packages @echo on REM on boucle sur les projet QGIS for %%i in (*.qgz) do ( echo %%i python3 exportpage.py %%i ) pause
Le module atlas de QGIS est vraiment très puissant, notamment en jouant avec les expressions et en intégrant du HTML. J'ai (re)découvert cela récemment !
La possibilité de lancer les scripts pour produire des cartes sans même ouvrir les projets QGIS donne un gros + !
Bonne fin de semaine !
Pascal PLUVINET
Hors ligne
#13 Fri 16 April 2021 12:08
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3881
Re: QGIS: export automatique atlas en ligne de commande
Bonjour,
depuis la version 3, l'API a complètement changé.
Je me disais bien que le activeComposers me semblait vieux mais je n'ai pas cherché plus loin.
Dans mon cas, j'ai 12 projets QGZ avec pour chacun d'eux un atlas nommé 'page'.
J'ai créé un fichier Python "exportpage.py" et un fichier bat "Export_page_QGIS3.16.bat" qui permet de lancer le script python sur chaque projet qgz. Ces scripts sont dans le même répertoire que les projets QGIS
(peut-être HS) Dans l''extension MapsPrinter qui permet d'exporter plusieurs mises en page (mais il faudra quand même lancer QGIS), j'ai mis à jour la branche master pour permettre via Processing d'exporter les mises en pages (avec atlas ou pas) en indiquant un dossier de projets. De mémoire ça fonctionnait bien, mais j'ai pas eu de temps pour peaufiner les choses et publier, et suis moins en demande d'une telle fonctionnalité aujourd'hui. Donc testeurs et contributeurs intéressés bienvenus...
Hors ligne