J'essaie de suivre la section de rendu de carte du livre de recettes pyqgis, mais j'aimerais tester cela en tant qu'application autonome. Je peux faire la première partie, en utilisant un rendu simple, mais je suis un peu coincé à faire le deuxième exemple en utilisant le compositeur de carte comme script autonome.
Voici un exemple autonome pour le peu que je peux faire:
from qgis.core import *
from qgis.gui import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtXml import *
QgsApplication.setPrefixPath("/usr/", True)
QgsApplication.initQgis()
fh = open("eg.csv","w")
fh.write("""
x,y,name
153.0278, -27.4679, Brisbane
144.2500, -23.4500, Longreach
145.7753, -16.9256, Cairns
""")
fh.close()
uri = "eg.csv?delimiter=%s&xField=%s&yField=%s" % (",", "x", "y")
layer = QgsVectorLayer(uri, "eglayer", "delimitedtext")
QgsMapLayerRegistry.instance().addMapLayer(layer)
img = QImage(QSize(800,600), QImage.Format_ARGB32_Premultiplied)
color = QColor(255,255,255)
img.fill(color.rgb())
p = QPainter()
p.begin(img)
render = QgsMapRenderer()
lst = [ layer.getLayerID() ] # add ID of every layer
render.setLayerSet(lst)
rect = QgsRectangle(render.fullExtent())
rect.scale(1.1)
render.setExtent(rect)
render.setOutputSize(img.size(), img.logicalDpiX())
render.render(p)
p.end()
img.save("render.png","png")
Ce que j'aimerais vraiment faire, c'est la même chose, mais utilisez QgsComposition
et enregistrez comme par exemple pdf. Le livre de cuisine dit:
Lorsque vous utilisez Composer dans une application autonome, vous pouvez créer votre propre instance de rendu de carte de la même manière que celle indiquée dans la section ci-dessus et la transmettre à la composition.
Ce bit, je ne pouvais pas le faire, toutes mes tentatives obtenaient une carte vide ou un défaut de segmentation. J'utilise linux mint 13, en utilisant qgis 1.8.0. Ce serait formidable si quelqu'un pouvait me montrer comment modifier l'exemple simple en un exemple qui utilise le compositeur.
2.4
et au-dessus, voir cette réponse basée sur le même exemple qui devrait fonctionner gis.stackexchange.com/a/223127/36886QgsMapRenderer est obsolète dans la version 2.4 et supérieure, j'ai mis à jour la partie obsolète de cette réponse en quelque chose qui devrait fonctionner de
2.4
à2.18.2
.la source
layer.getLayerID()
ne fonctionne pas et doit être changé en:layer.id()
Peut-être que ce code est utile, bien qu'il ne s'agisse pas d'une application autonome:
La carte est basée sur un projet QGIS. Vous pouvez trouver un exemple complet ici: http://www.qgis.nl/media/2013/08/composerimage_demo.zip
la source
QgsComposition
sans appeleriface.mapCanvas().mapRenderer()
.