Rendering dan Pelabelan Shapefile dengan PyQGIS

8

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.

lini tengah99
sumber
1
Sebagai permulaan, Anda tidak dapat menggunakan di ifaceluar QGIS. Itu perlumapRenderer = QgsMapRenderer()
Nathan W
Baiklah, sepertinya saya belum menginisialisasi mapRenderer dengan informasi yang cukup. Konsol membeku di c = QgsComposition (mapRenderer) setelah saya menambahkan info tentang tingkat lapisan dan mesin pelabelan. Kode masih berfungsi di QGIS, hanya perlu diubah ukurannya.
lini
1
Tampaknya inisialisasi aplikasi Qgs adalah masalahnya. Dan tampaknya masalah ini dibahas di gis.stackexchange.com/questions/69626/… . Jadi mendeklarasikan variabel aplikasi dan menambahkan app.exitQgis () berfungsi.
lini
Saya mengalami masalah saat membuat pngs dengan metode yang disebutkan di atas. Shapefile saya dibaca dengan benar, gambar dibuat, tetapi selalu putih sepenuhnya. Seperti yang Anda lihat di print-out, nilai mapRenderer.extent () selalu nol. Apakah ini normal, atau apakah saya perlu menggali lebih dalam tentang ini? Pemeriksaan selanjutnya dengan dpi, lebar dan tinggi QgsComposition memberikan beberapa nilai, meskipun saya tidak tahu apakah mereka benar atau tidak. Saya juga telah mencoba sejumlah opsi pencetakan / render yang berbeda, seperti c.render (), atau membagikan barang-barang tersebut sebagai pdf. Saya tidak pernah mendapatkan kesalahan, tetapi pag saya
Bob3k
Hai moderator yang menghapus posting terakhir saya pada topik yang sama, silakan tinggalkan yang ini. Ini sepenuhnya relevan karena saya tidak percaya jawaban di atas masih berfungsi dan saya bukan satu-satunya yang berjuang di sini. Entah aku gila, atau dua bit kode tidak lagi berfungsi. Saya telah menyalin ini dan mengubahnya untuk saya gunakan dan untuk kehidupan saya, saya tidak bisa mendapatkan tif dari shapefile dengan apa pun selain kanvas putih yang mengatakan 'Legenda: Kontur "di sudut kiri atas. Tujuan saya adalah untuk mengambil shapefile (shp) dan mengonversinya menjadi tif dengan garis kontur berlabel ketinggian. Saya dapat membuka s
Marc

Jawaban:

2

Kombinasi menghapus iface dan mendeklarasikan variabel aplikasi tampaknya berhasil. Saya sekarang mendapatkan gambar yang diberikan dari shapefile dengan setiap fitur yang dilabeli dengan atribut berdasarkan 'Atribut'.

lini tengah99
sumber