J'ai rencontré quelques problèmes avec l'API QGIS pour python. Je suis devenu plus à l'aise de travailler dans la console python dans QGIS mais je rencontre des problèmes lorsque j'essaie d'exécuter le code en dehors de QGIS.
Fondamentalement, je veux prendre un fichier de formes, l'étiqueter en fonction du nom d'attribut spécifié et rendre une image. Le code fonctionne dans QGIS, mais ne fonctionne pas en dehors de QGIS. D'où vient mon problème?
import sys
import qgis
import PyQt4
from qgis.core import *
from qgis.utils import *
from qgis.gui import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
#initialize QGIS
QgsApplication.setPrefixPath( r"C:\OSGeo4W64\apps\qgis", True )
QgsApplication.initQgis()
#Add layer to instance
file = QgsVectorLayer("Good Shape File", "BMAS", "ogr")
QgsMapLayerRegistry.instance().addMapLayer(file)
#Adjust layer Settings
#Code sample from http://gis.stackexchange.com/questions/77870/how-to-label-vector-features-programmatically
palyr = QgsPalLayerSettings()
palyr.enabled = True
palyr.fieldName = 'Attribute'
palyr.placement= QgsPalLayerSettings.OverPoint
palyr.setDataDefinedProperty(QgsPalLayerSettings.Size,True,True,'8','')
palyr.writeToLayer(file)
if file.isValid():
print "File is valid."
mapRenderer = iface.mapCanvas().mapRenderer()
lst = [file.id()]
mapRenderer.setLayerSet(lst)
mapRenderer.setLayerSet( lst )
c = QgsComposition(mapRenderer)
c.setPlotStyle(QgsComposition.Print)
x, y = 0, 0
w, h = c.paperWidth(), c.paperHeight()
composerMap = QgsComposerMap(c, x,y,w,h)
c.addItem(composerMap)
composerLabel = QgsComposerLabel(c)
composerLabel.adjustSizeToText()
c.addItem(composerLabel)
composerLabel.setItemPosition(20,10)
composerLabel.setItemPosition(20,10, 100, 30)
legend = QgsComposerLegend(c)
legend.model().setLayerSet(mapRenderer.layerSet())
c.addItem(legend)
#set image sizing
dpi = c.printResolution()
dpmm = dpi / 25.4
width = int(dpmm * c.paperWidth())
height = int(dpmm * c.paperHeight())
img = QImage(QSize(width, height), QImage.Format_ARGB32)
img.setDotsPerMeterX(dpmm * 1000)
img.setDotsPerMeterY(dpmm * 1000)
img.fill(0)
imagePainter = QPainter(img)
sourceArea = QRectF(0, 0, c.paperWidth(), c.paperHeight())
targetArea = QRectF(0, 0, width, height)
#renders image
c.render(imagePainter, targetArea, sourceArea)
imagePainter.end()
img.save("E:/QGisTestImages/out.png", "png")
Je suis capable de faire l'exemple de rendu simple dans le livre de recettes python, donc je pense que mes chemins sont correctement configurés.
"Good Shape File" doit être remplacé par un bon emplacement de chemin si vous souhaitez l'exécuter. Et palyr.fieldName = 'Attribute' doit être défini sur un nom de champ valide pour ce fichier de formes.
Edit: je me suis débarrassé de iface et inséré du code pour l'étendue entre l'initialisation de mapRenderer et la lst déclaration.
mapRenderer = QgsMapRenderer()
rect = file.extent()
mapRenderer.setExtent(rect)
mapRenderer.setLabelingEngine(QgsPalLabeling())
lst = [file.id()]
Edit: j'ai ajouté
app = QgsApplication([], True)
après
QgsApplication.initQgis()
et le code a fonctionné.
iface
dehors de QGIS. Cela doit êtremapRenderer = QgsMapRenderer()
Réponses:
La combinaison de la suppression de l'iface et de la déclaration de la variable d'application semble avoir fonctionné. Je reçois maintenant une image rendue à partir du fichier de formes avec chaque fonctionnalité étiquetée avec l'attribut basé sur «Attribut».
la source