Tôi đã gặp phải một số vấn đề khi làm việc với API QGIS cho python. Tôi đã cảm thấy thoải mái hơn khi làm việc trong bảng điều khiển python trong QGIS nhưng tôi gặp vấn đề khi tôi cố chạy mã bên ngoài QGIS.
Về cơ bản tôi muốn lấy một shapefile, gắn nhãn nó dựa trên tên thuộc tính được chỉ định và hiển thị một hình ảnh. Mã này hoạt động trong QGIS, nhưng không hoạt động bên ngoài QGIS. Vậy vấn đề của tôi đến từ đâu?
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")
Tôi có thể thực hiện ví dụ kết xuất đơn giản trong sách dạy nấu ăn trăn, vì vậy tôi nghĩ rằng các đường dẫn của tôi được thiết lập chính xác.
"Tệp hình dạng tốt" nên được thay thế bằng vị trí đường dẫn tốt nếu bạn muốn chạy tệp này. Và faderr.fieldName = 'Thuộc tính' nên được đặt thành tên trường hợp lệ cho shapefile đó.
Chỉnh sửa: Tôi đã thoát khỏi iface và chèn mã trong phạm vi giữa khởi tạo mapRenderer và khai báo lst.
mapRenderer = QgsMapRenderer()
rect = file.extent()
mapRenderer.setExtent(rect)
mapRenderer.setLabelingEngine(QgsPalLabeling())
lst = [file.id()]
Chỉnh sửa: Tôi đã thêm
app = QgsApplication([], True)
sau
QgsApplication.initQgis()
và mã làm việc.
iface
bên ngoài QGIS. Điều đó cần phải cómapRenderer = QgsMapRenderer()