स्टैंड-अलोन स्क्रिप्ट में मैप कंपोजर का उपयोग कैसे करें?


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, और उदाहरण के लिए पीडीऍफ़ में सेव करें। रसोई की किताब कहते हैं:

एक स्टैंडअलोन एप्लिकेशन में कंपोजर का उपयोग करते समय, आप अपना मैप रेंडरर इंस्टेंस उसी तरह बना सकते हैं, जैसा कि ऊपर के अनुभाग में दिखाया गया है और इसे रचना में पास करें।

यह बिट मैं नहीं कर सकता, मेरे सभी प्रयासों को या तो एक खाली नक्शा मिलता है, या एक segfault। मैं qgis 1.8.0 का उपयोग करके लिनक्स मिंट 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()

जब मैं ऐसा करता हूं, तो मुझे एक पीडीएफ मिलता है, लेकिन यह खाली है। मैं २.१० का उपयोग कर रहा हूँ (मुझे बदलना होगा .getLayerID () से .id ())
Conley Owens

हाँ, क्षमा करें, यह अब मेरे लिए भी काम नहीं करता है। 1.8.0 पर काम करता है, लेकिन मैंने अभी इसे 2.4.0 पर परीक्षण किया है और अब यह काम नहीं करता है।
rjad

ComposerMap.setNewExtent (mapRectangle) को जोड़ने से यह काम करने के लिए लगता है।
राजद

दुर्भाग्य से, यह 2.8.3 पर काम नहीं करता है। मैंने getLayerID () को .id () में बदल दिया और अभी भी केवल एक खाली पृष्ठ मिलता है। स्थिर पाठ आदि का प्रतिपादन। समस्या क्या हो सकती है पर कोई विचार?
१३

QgsMapRenderer को 2.4ऊपर और नीचे चित्रित किया गया है , इस उत्तर को उसी उदाहरण के आधार पर देखें जो gis.stackexchange.com/a/223127/36886 पर
राफेल

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()
कॉमरेड Che

@ Mr.Che कृपया अपना OS और QGIS संस्करण शामिल करें
राफेल

विन 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.bip


धन्यवाद, लेकिन मेरी समस्या यह है कि मुझे पता नहीं है कि QgsCompositionबिना कॉल किए पास होने के लिए एक वैध मैपरेंडर ऑब्जेक्ट कैसे प्राप्त करें iface.mapCanvas().mapRenderer()
rjad
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.