Tek başına bir komut dosyasında harita oluşturucu nasıl kullanılır?


9

Pyqgis yemek kitabından harita oluşturma bölümünü takip etmeye çalışıyorum , ancak bunu bağımsız bir uygulama olarak test etmek istiyorum. Ben basit render kullanarak ilk bölümünü yapabilirim, ama harita örneği bağımsız bir komut dosyası olarak kullanarak ikinci örneği yapmak biraz sıkışmış.

İşte yapabileceğim bit için bağımsız bir örnek:

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

Gerçekten yapmak istediğim şey aynı, ancak kullanın QgsCompositionve örneğin pdf olarak kaydedin. Yemek kitabı diyor ki:

Composer'ı bağımsız bir uygulamada kullanırken, yukarıdaki haritadaki gibi kendi harita oluşturucu örneğinizi oluşturabilir ve kompozisyona aktarabilirsiniz.

Yapamadığım bu bit, tüm girişimlerim boş bir harita ya da segfault elde ediyor. Qgis 1.8.0 kullanarak linux nane 13 kullanıyorum. Birisi bana basit örneği besteci kullanan bir örneğe nasıl değiştirebileceğimi gösterebilirse harika olurdu.

Yanıtlar:


8

Yorumlara dayanarak, bu cevap2.4
Gelecekteki referans için önceki sürümler için geçerlidir, işte çalışan bağımsız bir örnek.

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

Bunu yaptığımda bir pdf alıyorum, ama boş. 2.10 kullanıyorum (.getLayerID () öğesini .id () olarak değiştirmek zorundayım)
Conley Owens

Evet, üzgünüm, artık benim için de çalışmıyor. 1.8.0 üzerinde çalışıyor, ancak 2.4.0'da test ettim ve artık çalışmıyor gibi görünüyor.
rjad

ComposerMap.setNewExtent (mapRectangle) eklemek işe yarar görünüyor.
rjad

Ne yazık ki, bu artık 2.8.3 üzerinde çalışmıyor. GetLayerID () öğesini .id () olarak değiştirdim ve yine de yalnızca boş bir sayfa aldım. Statik metin oluşturma vb. Çalışır. Sorunun ne olabileceği hakkında bir fikrin var mı?
chriserik

QgsMapRenderer önerilmiyor 2.4ve üzeri, çalışması gerektiğini aynı örnekte dayalı bu cevaba bakınız gis.stackexchange.com/a/223127/36886
raphael

3

QgsMapRenderer 2.4 önerilmiyor ve yukarıdaki i? Kullanımdan kaldırılmış bölümünü güncelledik Bu yanıt dan çalışmalıdır şey 2.4için 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()çalışmıyor ve şu şekilde değiştirilmelidir:layer.id()
Yoldaş Che

Lütfen işletim sisteminizi ve QGIS sürümünüzü ekleyin
raphael

Win 7 ve QGIS sürümü: i.stack.imgur.com/8u8Ed.png
Yoldaş Che

2

Belki de bağımsız bir uygulama olmasa da bu kod yararlıdır:

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

Harita bir QGIS projesine dayanıyor. Tam bir örneği burada bulabilirsiniz: http://www.qgis.nl/media/2013/08/composerimage_demo.zip


Teşekkürler, ama benim sorunum QgsCompositionarama yapmadan geçmek için geçerli bir mapRenderer nesnesi almak nasıl bilmiyorum iface.mapCanvas().mapRenderer().
rjad
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.