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 !.
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

#1 mer. 23 mai 2018 22:13

Lsam
Membre
Date d'inscription: 27 nov. 2013
Messages: 117

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 jeu. 24 mai 2018 10:07

MathieuR
Moderateur
Lieu: aix-en-provence
Date d'inscription: 16 févr. 2009
Messages: 1474

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

Hors ligne

 

#3 jeu. 24 mai 2018 16:23

Lsam
Membre
Date d'inscription: 27 nov. 2013
Messages: 117

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 (jeu. 24 mai 2018 16:24)

Hors ligne

 

#4 mar. 29 mai 2018 17:09

MathieuR
Moderateur
Lieu: aix-en-provence
Date d'inscription: 16 févr. 2009
Messages: 1474

Re: QGIS: export automatique atlas en ligne de commande

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

Hors ligne

 

#5 jeu. 31 mai 2018 22:07

Lsam
Membre
Date d'inscription: 27 nov. 2013
Messages: 117

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 (jeu. 31 mai 2018 22:08)

Hors ligne

 

#6 mar. 12 juin 2018 10:54

lejedi76
Membre
Date d'inscription: 8 août 2013
Messages: 266

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 mar. 12 juin 2018 18:14

Lsam
Membre
Date d'inscription: 27 nov. 2013
Messages: 117

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 sam. 08 décembre 2018 07:43

mickael_53
Membre
Date d'inscription: 7 déc. 2018
Messages: 1

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

 

Pied de page des forums

Powered by FluxBB

Partagez  |