Kết xuất và dán nhãn Shapefile với PyQGIS


8

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.


1
Để bắt đầu, bạn không thể sử dụng ifacebên ngoài QGIS. Điều đó cần phải cómapRenderer = QgsMapRenderer()
Nathan W

Được rồi, có vẻ như tôi chưa khởi tạo mapRenderer với đủ thông tin. Bảng điều khiển đóng băng tại c = QssCysis (mapRenderer) sau khi tôi thêm thông tin về phạm vi của lớp và công cụ ghi nhãn. Mã vẫn hoạt động trong QGIS mặc dù, nó chỉ cần thay đổi kích thước.
tiền

1
Có vẻ như việc khởi tạo QssApplication là vấn đề. Và có vẻ như vấn đề này đã được đề cập trong gis.stackexchange.com/questions/69626/iêu . Vì vậy, việc khai báo một biến ứng dụng và thêm một app.exitQgis () đã hoạt động.
tiền

Tôi đang gặp vấn đề khi tạo pngs với phương pháp đã nói ở trên. Shapefile của tôi được đọc chính xác, một hình ảnh được tạo ra, nhưng nó luôn luôn hoàn toàn trắng. Như bạn có thể thấy trong bản in, các giá trị mapRenderer.extent () luôn bằng không. Điều này là bình thường, hay tôi cần phải đào sâu hơn về điều này? Các kiểm tra tiếp theo với dpi, chiều rộng và chiều cao của QssCysis cung cấp một số giá trị, mặc dù tôi không biết liệu chúng có chính xác hay không. Tôi cũng đã thử một số tùy chọn in / kết xuất khác nhau, như c.render () hoặc đưa ra nội dung dưới dạng pdf. Tôi không bao giờ gặp lỗi, nhưng trang của tôi
Bob3k

Này người điều hành đã xóa bài đăng cuối cùng của tôi trong cùng một chủ đề, vui lòng để lại bài này. Điều này hoàn toàn phù hợp vì tôi không tin rằng các câu trả lời ở trên vẫn hoạt động và tôi không phải là người duy nhất đang vật lộn ở đây. Hoặc là tôi điên, hoặc hai bit mã không còn hoạt động. Tôi đã sao chép chúng và điều chỉnh chúng để sử dụng và cho cuộc sống của tôi, tôi không thể lấy một tif từ shapefile với bất cứ thứ gì khác ngoài một tấm vải trắng có chữ 'Legend: Contours "ở góc trên bên trái. Mục tiêu của tôi là để lấy một shapefile (shp) và chuyển đổi nó thành một tif với các đường viền được dán nhãn ở độ cao. Tôi có thể mở s
Marc

Câu trả lời:


2

Sự kết hợp của việc loại bỏ iface và khai báo biến ứng dụng dường như đã hoạt động. Bây giờ tôi nhận được một hình ảnh được hiển thị từ shapefile với mỗi tính năng được gắn nhãn với thuộc tính dựa trên 'Thuộc tính'.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.