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 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

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

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

 

#4 Tue 29 May 2018 17:09

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

Re: QGIS: export automatique atlas en ligne de commande

Si vous tapez dir(iface), que cela donne-t-il ?


geodata au cerema et petits billets en géomatique

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: VALENCE
Date d'inscription: 6 Aug 2007
Messages: 617

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: 3944

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: VALENCE
Date d'inscription: 6 Aug 2007
Messages: 617

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: 3944

Re: QGIS: export automatique atlas en ligne de commande

Bonjour,

JD a écrit:

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.

ppluvinet a écrit:

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

 

Pied de page des forums

Powered by FluxBB