[Qgis-developer] Unloading a layer in Sextante script crashes QGIS

Rudi von Staden rudivs at gmail.com
Tue Feb 19 02:54:43 PST 2013


I've put together a Sextante script to automate the production of
grid-based species distribution maps (png image output) by modifying [1]
and [2]. It takes a vector layer of point localities (with species name as
a field) and a grid layer as input, and produces output maps by selecting
grids based on point localities.

For each species it creates a distribution shapefile, which consists of the
grid polygons where the species occurs. As far as I could tell, this layer
needs to be loaded to the canvas before it can be included in the layerset
to be rendered for the output images (is there a better way?). Sextante
includes a function for loading layers, but not removing them. From what I
could find, "QgsMapLayerRegistry.instance().removeMapLayers(taxon_layer.id())"
should remove the layer, but it crashes QGIS when I try (current git
version). If I comment out the line, my canvas gets clogged. Any idea where
the problem lies? Script below.

Thanks,
Rudi

[1] http://www.qgis.org/pyqgis-cookbook/composer.html#simple-rendering
[2] http://qgissextante.blogspot.com/2013/01/using-selection-algorithms.html


#Definition of inputs and outputs
#==================================
##[Scratch]=group
##all_localities=vector
##taxon_field=field all_localities
##africa_map=vector
##sa_map=vector
##grid_layer=vector
##distribution_style_file=file
##output=output file

#Algorithm body
#==================================
from qgis.core import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from sextante.core.QGisLayers import QGisLayers
from sextante.core.SextanteVectorWriter import SextanteVectorWriter
import tempfile
import os

def print_map(taxon,taxon_shp):
    #load taxon layer (necessary?)
    QGisLayers.load(taxon_shp,name = "taxon",style =
distribution_style_file)

    # create image (dimensions 325x299)
    img = QImage(QSize(325,299), QImage.Format_ARGB32_Premultiplied)

    # set image's background color
    color = QColor(192,192,255)   # blue sea
    img.fill(color.rgb())

    # create painter
    p = QPainter()
    p.begin(img)
    p.setRenderHint(QPainter.Antialiasing)

    render = QgsMapRenderer()

    # create layer set
    africa_layer = QGisLayers.getObjectFromUri(africa_map)
    sa_layer = QGisLayers.getObjectFromUri(sa_map)
    taxon_layer = QGisLayers.getObjectFromUri(taxon_shp)

    lst = []
    lst.append(taxon_layer.id())
    lst.append(sa_layer.id())
    lst.append(africa_layer.id())

    render.setLayerSet(lst)

    # set extent (xmin,ymin,xmax,ymax)
    rect = QgsRectangle(14.75,-36.00,34.00,-21.00)
    render.setExtent(rect)

    # set output size
    render.setOutputSize(img.size(), img.logicalDpiX())

    # do the rendering
    render.render(p)
    p.end()

    # save image
    outdir = os.path.dirname(os.path.abspath(output))
    img.save(os.path.join(outdir,taxon+".png"),"png")

    # remove taxon layer from project
    QgsMapLayerRegistry.instance().removeMapLayers(taxon_layer.id())
#crashes QGIS

tempdir = tempfile.gettempdir()
taxa = sextante.runalg('qgis:listuniquevalues', all_localities,
taxon_field, None)['UNIQUE_VALUES'].split(";")
counter = 0   # limit for testing
for taxon in taxa:
    if counter < 10:
        sextante.runalg('qgis:selectbyattribute', all_localities,
taxon_field, 0, taxon)
        sextante.runalg('qgis:selectbylocation', grid_layer,
all_localities, 0)
        filename = os.path.join(tempdir,"taxon.shp")    #memory file better?
        sextante.runalg('qgis:saveselectedfeatures', grid_layer, filename)
        print_map(taxon,filename)
        counter+=1
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/qgis-developer/attachments/20130219/bcd1c92f/attachment-0001.html>


More information about the Qgis-developer mailing list