I am trying to accomplish PyQGIS simple map rendering via the QGIS 2.0 Python console, but end up with only a blank image. I've followed instructions of this link. My objective is to export a simple image of the current extent of layers of interest to a png. Where can I be going wrong?
#identify crs
crs = QgsCoordinateReferenceSystem(3297, QgsCoordinateReferenceSystem.EpsgCrsId)
# create image
img = QImage(QSize(800,600), QImage.Format_ARGB32_Premultiplied)
# set image's background color
color = QColor(255,255,255)
img.fill(color.rgb())
# create painter
p = QPainter()
p.begin(img)
p.setRenderHint(QPainter.Antialiasing)
render = QgsMapRenderer()
#set crs
render.setDestinationCrs(crs)
# set layer set
layers = qgis.utils.iface.legendInterface.layers()
lst = []
for layer in layers:
lst.append(layer.())
render.setLayerSet(lst)
# set to CURRENT extent**map of layer's full extent is successfully rendered when QgsRectangle(render.fullExtent() is used)
rect = QgsRectangle(render.extent())
rect.scale(1.1)
render.setExtent(rect)
# set output size
render.setOutputSize(img.size(), img.logicalDpiX())
# do the rendering
render.render(p)
p.end()
# save image
img.save("render.png","png")
Best Answer
Don't know if this is just a typo in your post, but if not, this could cause a blank image..
This should actually be qgis.utils.iface.legendInterface().layers() (note that legendInterface must be the method call, done by adding braces() )
What you want to do, is to add each layers id by appending layer.id()
Hope that helps!
Edit:
Did you try to save a layer with scale-based visibility enabled? Cause the renderer scales the image to full-extend prior to saving - maybe your layer data is invisible at that zoom-level?!
Btw. this is the code that worked for me (or at least with the vector-, shape-, and raster layers I tested it with ;) )
PS. When using rect = QgsRectangle(renderer.extent()) instead of renderer.fullExtent() the image I get is blank, too.