독립형 스크립트에서 맵 작성기를 사용하는 방법은 무엇입니까?


9

pyqgis 요리 책에서 지도 렌더링 섹션 을 따르려고 하지만 독립형 응용 프로그램으로 테스트하고 싶습니다. 간단한 렌더링을 사용하여 첫 번째 부분을 수행 할 수는 있지만 맵 작성기를 독립 실행 형 스크립트로 사용하여 두 번째 예제를 수행하는 데 약간 어려움이 있습니다.

내가 할 수있는 비트에 대한 독립 실행 형 예는 다음과 같습니다.

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")

내가 정말로하고 싶은 것은 동일하지만을 사용 QgsComposition하고 예를 들어 pdf로 저장하십시오. 요리 책은 말합니다 :

독립형 애플리케이션에서 작성기를 사용하는 경우 위 섹션에 표시된 것과 동일한 방식으로 고유 한 맵 렌더러 인스턴스를 작성하여 컴포지션에 전달할 수 있습니다.

내가 할 수 없었던이 비트는 모든 시도가 빈지도 또는 segfault를 얻습니다. qgis 1.8.0을 사용하여 Linux mint 13을 실행 중입니다. 누군가가 간단한 예제를 작곡가를 사용하는 예제로 수정하는 방법을 보여줄 수 있다면 좋을 것입니다.

답변:


8

주석을 기반으로,이 답변은 이전 버전의 경우에 적용됩니다2.4
. 나중에 참조 할 수 있도록 독립 실행 형 예제가 있습니다.

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()

이 작업을 수행하면 pdf가 표시되지만 비어 있습니다. 나는 2.10을 사용하고는 (나는 .ID하는 .getLayerID ()을 변경해야 할 ())
콘리 오웬스

예, 죄송합니다. 더 이상 나에게도 효과가 없습니다. 1.8.0에서 작동하지만 방금 2.4.0에서 테스트했지만 더 이상 작동하지 않는 것 같습니다.
rjad

composerMap.setNewExtent (mapRectangle)를 추가하면 작동하는 것 같습니다.
rjad

불행히도 이것은 더 이상 2.8.3에서 작동하지 않습니다. getLayerID ()를 .id ()로 변경했지만 여전히 빈 페이지 만 얻습니다. 정적 텍스트 등의 렌더링이 작동합니다. 문제가 무엇인지에 대한 아이디어가 있습니까?
chriserik

QgsMapRenderer는 더 이상 사용되지 않으며 gis.stackexchange.com/a/223127/368862.4
raphael

3

QgsMapRenderer는 2.4 이상에서 더 이상 사용되지 않으므로이 답변 에서 더 이상 사용되지 않는 부분을에서 작동 해야하는 것으로 업데이트 2.4했습니다 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()작동하지 않으며 다음과 같이 변경되어야합니다.layer.id()
Cherade Che

@ Mr.Che OS 및 QGIS 버전을 포함하십시오
raphael

Win 7 및 QGIS 버전 : i.stack.imgur.com/8u8Ed.png
Che

2

이 코드는 독립형 응용 프로그램이 아니지만 유용합니다.

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()

맵은 QGIS 프로젝트를 기반으로합니다. 여기에서 완전한 예를 찾을 수 있습니다 : http://www.qgis.nl/media/2013/08/composerimage_demo.zip


고맙지 만 내 문제는을 QgsComposition호출하지 않고 유효한 mapRenderer 객체를 전달하는 방법을 모른다는 것입니다 iface.mapCanvas().mapRenderer().
rjad
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.