Próbuję śledzić sekcję renderowania mapy z książki kucharskiej pyqgis, ale chciałbym przetestować to jako samodzielną aplikację. Mogę zrobić pierwszą część, używając prostego renderowania, ale trochę utknąłem, robiąc drugi przykład, używając kompozytora map jako samodzielnego skryptu.
Oto samodzielny przykład fragmentu, który mogę zrobić:
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")
To, co naprawdę chciałbym zrobić, to to samo, ale użyj QgsComposition
i zapisz jak na przykład pdf. Książka kucharska mówi:
Używając kompozytora w samodzielnej aplikacji, możesz utworzyć własną instancję renderera map w taki sam sposób, jak pokazano w powyższej sekcji i przekazać ją do kompozycji.
Tego kawałka nie mogłem zrobić, wszystkie moje próby albo otrzymały pustą mapę, albo segfault. Korzystam z Linuksa mint 13, używając qgis 1.8.0. Byłoby wspaniale, gdyby ktoś mógł mi pokazać, jak zmodyfikować prosty przykład do tego, który używa kompozytora.
2.4
i powyżej, zobacz tę odpowiedź na podstawie tego samego przykładu, który powinien działać gis.stackexchange.com/a/223127/36886QgsMapRenderer jest przestarzały w wersji 2.4 i nowszych, zaktualizowałem przestarzałą część tej odpowiedzi na coś, co powinno działać od
2.4
do2.18.2
.źródło
layer.getLayerID()
nie działa i musi zostać zmieniony na:layer.id()
Może ten kod jest pomocny, chociaż nie jest to samodzielna aplikacja:
Mapa oparta jest na projekcie QGIS. Kompletny przykład można znaleźć tutaj: http://www.qgis.nl/media/2013/08/composerimage_demo.zip
źródło
QgsComposition
bez wywoływaniaiface.mapCanvas().mapRenderer()
.