Saya telah mengalami beberapa masalah bekerja dengan API QGIS untuk python. Saya merasa lebih nyaman bekerja di konsol python di QGIS tetapi saya mengalami masalah ketika saya mencoba menjalankan kode di luar QGIS.
Pada dasarnya saya ingin mengambil shapefile, beri label berdasarkan nama atribut yang ditentukan, dan render gambar. Kode berfungsi di QGIS, tetapi tidak berfungsi di luar QGIS. Jadi dari mana datangnya masalah saya?
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")
Saya dapat melakukan contoh rendering sederhana di buku resep python, jadi saya pikir jalur saya sudah diatur dengan benar.
"File Bentuk Bagus" harus diganti dengan lokasi jalur yang baik jika Anda ingin menjalankan ini. Dan palyr.fieldName = 'Atribut' harus ditetapkan ke nama bidang yang valid untuk shapefile itu.
Sunting: Saya telah menyingkirkan iface dan memasukkan kode sejauh antara inisialisasi mapRenderer dan deklarasi pertama.
mapRenderer = QgsMapRenderer()
rect = file.extent()
mapRenderer.setExtent(rect)
mapRenderer.setLabelingEngine(QgsPalLabeling())
lst = [file.id()]
Sunting: Saya menambahkan
app = QgsApplication([], True)
setelah
QgsApplication.initQgis()
dan kodenya berhasil.
iface
luar QGIS. Itu perlumapRenderer = QgsMapRenderer()