Làm cách nào để sử dụng trình soạn thảo bản đồ trong một tập lệnh độc lập?


9

Tôi đang cố gắng theo dõi phần kết xuất bản đồ từ sách dạy nấu ăn pyqgis, nhưng tôi muốn thử nghiệm đây là một ứng dụng độc lập. Tôi có thể thực hiện phần đầu tiên, sử dụng kết xuất đơn giản, nhưng tôi hơi bị mắc kẹt khi thực hiện ví dụ thứ hai bằng cách sử dụng trình soạn thảo bản đồ làm tập lệnh độc lập.

Đây là một ví dụ độc lập cho bit tôi có thể làm:

from qgis.core import *
from qgis.gui import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtXml import *

QgsApplication.setPrefixPath("/usr/", True)
QgsApplication.initQgis()

fh = open("eg.csv","w")
fh.write("""
x,y,name
153.0278, -27.4679, Brisbane
144.2500, -23.4500, Longreach
145.7753, -16.9256, Cairns
""")
fh.close()

uri = "eg.csv?delimiter=%s&xField=%s&yField=%s" % (",", "x", "y")
layer = QgsVectorLayer(uri, "eglayer", "delimitedtext")
QgsMapLayerRegistry.instance().addMapLayer(layer)
img = QImage(QSize(800,600), QImage.Format_ARGB32_Premultiplied)
color = QColor(255,255,255)
img.fill(color.rgb())
p = QPainter()
p.begin(img)
render = QgsMapRenderer()
lst = [ layer.getLayerID() ]  # add ID of every layer
render.setLayerSet(lst)
rect = QgsRectangle(render.fullExtent())
rect.scale(1.1)
render.setExtent(rect)
render.setOutputSize(img.size(), img.logicalDpiX())
render.render(p)
p.end()
img.save("render.png","png")

Những gì tôi thực sự muốn làm là giống nhau, nhưng sử dụng QgsCompositionvà lưu như ví dụ pdf. Sách dạy nấu ăn nói:

Khi sử dụng trình soạn thảo trong một ứng dụng độc lập, bạn có thể tạo cá thể trình kết xuất bản đồ của riêng mình theo cách tương tự như được hiển thị trong phần trên và chuyển nó vào bố cục.

Điều này tôi không thể làm được, tất cả những nỗ lực của tôi đều có được một bản đồ trống hoặc một segfault. Tôi đang chạy linux mint 13, sử dụng qgis 1.8.0. Sẽ thật tuyệt nếu ai đó có thể chỉ cho tôi cách sửa đổi ví dụ đơn giản thành ví dụ sử dụng trình soạn nhạc.

Câu trả lời:


8

Dựa trên các nhận xét, câu trả lời này hoạt động cho các phiên bản trước2.4
Để tham khảo trong tương lai, đây là một ví dụ độc lập hoạt động.

from qgis.core import *
from qgis.gui import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtXml import *

QgsApplication.setPrefixPath("/usr", True)
QgsApplication.initQgis()
app = QgsApplication([], True)

fh = open("eg.csv","w")
fh.write("""
x,y,name
153.0278, -27.4679, Brisbane
144.2500, -23.4500, Longreach
145.7753, -16.9256, Cairns
""")
fh.close()

uri = "eg.csv?delimiter=%s&xField=%s&yField=%s" % (",", "x", "y")
layer = QgsVectorLayer(uri, "eglayer", "delimitedtext")
print layer.isValid()
layerset = []
QgsMapLayerRegistry.instance().addMapLayer(layer)
layerset.append(layer.getLayerID())

myMapRenderer = QgsMapRenderer()
myMapRenderer.setLayerSet(layerset)
mapRectangle = QgsRectangle(140,-28,155,-15)
myMapRenderer.setExtent(mapRectangle)

comp = QgsComposition(myMapRenderer)
comp.setPlotStyle(QgsComposition.Print)
composerMap = QgsComposerMap(comp, 5,5,200,200)
composerMap.setNewExtent(mapRectangle)
comp.addItem(composerMap)
printer = QPrinter()
printer.setOutputFormat(QPrinter.PdfFormat)
printer.setOutputFileName("out.pdf")
printer.setPaperSize(QSizeF(comp.paperWidth(), comp.paperHeight()),    QPrinter.Millimeter)
printer.setFullPage(True)
printer.setColorMode(QPrinter.Color)
printer.setResolution(comp.printResolution())

pdfPainter = QPainter(printer)
paperRectMM = printer.pageRect(QPrinter.Millimeter)
paperRectPixel = printer.pageRect(QPrinter.DevicePixel)
comp.render(pdfPainter, paperRectPixel, paperRectMM)
pdfPainter.end()
app.exitQgis()

Khi tôi làm điều này, tôi nhận được một bản pdf, nhưng nó trống. Tôi đang sử dụng 2.10 (Tôi phải đổi .getLayerID () thành .id ())
Conley Owens

Vâng, xin lỗi, nó cũng không còn làm việc cho tôi nữa. Hoạt động trên 1.8.0, nhưng tôi chỉ thử nó trên 2.4.0 và dường như không còn hoạt động.
rjad

Thêm composerMap.setNewExtent (mapRonymous) dường như làm cho nó hoạt động.
rjad

Thật không may, điều này không hoạt động trên 2.8.3 nữa. Tôi đã thay đổi getLayerID () thành .id () và vẫn chỉ nhận được một trang trống. Kết xuất văn bản tĩnh, vv hoạt động. Bất kỳ ý tưởng về những gì vấn đề có thể được?
chriserik

QssMapRenderer không được chấp nhận trong 2.4và trên, hãy xem câu trả lời này dựa trên cùng một ví dụ sẽ hoạt động gis.stackexchange.com/a/223127/36886
raphael

3

QssMapRenderer không được dùng nữa trong phiên bản 2.4 trở lên, tôi đã cập nhật phần không dùng từ câu trả lời này thành thứ gì đó nên hoạt động từ 2.4đến 2.18.2.

from qgis.core import *
from qgis.gui import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtXml import *

QgsApplication.setPrefixPath("/usr", True)
QgsApplication.initQgis()
app = QgsApplication([], True)

fh = open("eg.csv","w")
fh.write("""
x,y,name
153.0278, -27.4679, Brisbane
144.2500, -23.4500, Longreach
145.7753, -16.9256, Cairns
""")
fh.close()

uri = "eg.csv?delimiter=%s&xField=%s&yField=%s" % (",", "x", "y")
layer = QgsVectorLayer(uri, "eglayer", "delimitedtext")
print layer.isValid()
layerset = []
QgsMapLayerRegistry.instance().addMapLayer(layer)
layerset.append(layer.getLayerID())

def create_composition(layer_list, extent):
#New code for versions 2.4 and above
    ms = QgsMapSettings()
    ms.setLayers(layer_list)
    ms.setExtent(extent)
    comp = QgsComposition(ms)
    return comp, ms

comp, ms = create_composition(layerset, QgsRectangle(140,-28,155,-15))

comp.setPlotStyle(QgsComposition.Print)
composerMap = QgsComposerMap(comp, 5,5,200,200)

#Uses mapsettings value
composerMap.setNewExtent(ms.extent())

comp.addItem(composerMap)
printer = QPrinter()
printer.setOutputFormat(QPrinter.PdfFormat)
printer.setOutputFileName("out.pdf")
printer.setPaperSize(QSizeF(comp.paperWidth(), comp.paperHeight()),    QPrinter.Millimeter)
printer.setFullPage(True)
printer.setColorMode(QPrinter.Color)
printer.setResolution(comp.printResolution())

pdfPainter = QPainter(printer)
paperRectMM = printer.pageRect(QPrinter.Millimeter)
paperRectPixel = printer.pageRect(QPrinter.DevicePixel)
comp.render(pdfPainter, paperRectPixel, paperRectMM)
pdfPainter.end()
app.exitQgis()

layer.getLayerID()không hoạt động và phải đổi thành:layer.id()
Ông Che

@ Mr.Che vui lòng bao gồm phiên bản HĐH và QGIS của bạn
raphael

Giành chiến thắng 7 và phiên bản QGIS: i.stack.imgur.com/8u8Ed.png
Ông Che

2

Có thể mã này hữu ích, mặc dù nó không phải là một ứng dụng độc lập:

from qgis.core import *
from qgis.utils import iface
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import os   
# Clear map canvas
QgsMapLayerRegistry.instance().removeAllMapLayers()
iface.mapCanvas().refresh()
# Open QGIS project
QgsProject.instance().setFileName('composerimage_demo.qgs')
QgsProject.instance().read()
# Set up composition
mapRenderer = iface.mapCanvas().mapRenderer()
c = QgsComposition(mapRenderer)
c.setPlotStyle(QgsComposition.Print)
# Set dimensions and resolution
c.setPaperSize(160,185)
dpi = c.printResolution()
dpmm = (dpi / 25.4)
width = int(dpmm * c.paperWidth())
height = int(dpmm * c.paperHeight())
# Add map to composition
x, y = 0, 0
w, h = c.paperWidth(), c.paperHeight()
composerMap = QgsComposerMap(c, x,y,w,h)
composerMap.setFrame(True) # Does not work with QGIS 1.9-Master. Use hasFrame() instead.
c.addItem(composerMap)
# Create output image and initialize it
image = QImage(QSize(width, height), QImage.Format_ARGB32)
image.setDotsPerMeterX(dpmm * 1000)
image.setDotsPerMeterY(dpmm * 1000)
image.fill(0)
# Render composition
imagePainter = QPainter(image)
sourceArea = QRectF(0, 0, c.paperWidth(), c.paperHeight())
targetArea = QRectF(0, 0, width, height)
c.render(imagePainter, targetArea, sourceArea)
imagePainter.end()
# Save image to disk (other extensions possible)
image.save('composerimage_demo.jpg')
# Clear map canvas
QgsMapLayerRegistry.instance().removeAllMapLayers()
iface.mapCanvas().refresh()

Bản đồ được dựa trên một dự án QGIS. Bạn có thể tìm thấy một ví dụ đầy đủ ở đây: http://www.qgis.nl/media/2013/08/composerimage_demo.zip


Cảm ơn, nhưng vấn đề của tôi là tôi không biết làm thế nào để có được một đối tượng mapRenderer hợp lệ để chuyển đến QgsCompositionmà không gọi iface.mapCanvas().mapRenderer().
rjad
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.