<div dir="ltr">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.<div>
<br></div><div>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(<a href="http://taxon_layer.id">taxon_layer.id</a>())" 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.</div>
<div><br></div><div>Thanks,</div><div>Rudi<br><div><br></div><div>[1] <a href="http://www.qgis.org/pyqgis-cookbook/composer.html#simple-rendering">http://www.qgis.org/pyqgis-cookbook/composer.html#simple-rendering</a></div>
<div>[2] <a href="http://qgissextante.blogspot.com/2013/01/using-selection-algorithms.html">http://qgissextante.blogspot.com/2013/01/using-selection-algorithms.html</a><br><div><br></div><div><br></div><div><div><font face="courier new, monospace">#Definition of inputs and outputs</font></div>
<div><font face="courier new, monospace">#==================================</font></div><div><font face="courier new, monospace">##[Scratch]=group</font></div><div><font face="courier new, monospace">##all_localities=vector</font></div>
<div><font face="courier new, monospace">##taxon_field=field all_localities</font></div><div><font face="courier new, monospace">##africa_map=vector</font></div><div><font face="courier new, monospace">##sa_map=vector</font></div>
<div><font face="courier new, monospace">##grid_layer=vector</font></div><div><font face="courier new, monospace">##distribution_style_file=file</font></div><div><font face="courier new, monospace">##output=output file</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">#Algorithm body</font></div><div><font face="courier new, monospace">#==================================</font></div><div>
<font face="courier new, monospace">from qgis.core import *</font></div><div><font face="courier new, monospace">from PyQt4.QtCore import *</font></div><div><font face="courier new, monospace">from PyQt4.QtGui import *</font></div>
<div><font face="courier new, monospace">from sextante.core.QGisLayers import QGisLayers</font></div><div><font face="courier new, monospace">from sextante.core.SextanteVectorWriter import SextanteVectorWriter</font></div>
<div><font face="courier new, monospace">import tempfile</font></div><div><font face="courier new, monospace">import os</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">def print_map(taxon,taxon_shp):</font></div>
<div><font face="courier new, monospace">    #load taxon layer (necessary?)</font></div><div><font face="courier new, monospace">    QGisLayers.load(taxon_shp,name = "taxon",style = distribution_style_file)</font></div>
<div><font face="courier new, monospace">    </font></div><div><font face="courier new, monospace">    # create image (dimensions 325x299)</font></div><div><font face="courier new, monospace">    img = QImage(QSize(325,299), QImage.Format_ARGB32_Premultiplied)</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    # set image's background color</font></div><div><font face="courier new, monospace">    color = QColor(192,192,255)   # blue sea</font></div>
<div><font face="courier new, monospace">    img.fill(color.rgb())</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    # create painter</font></div><div><font face="courier new, monospace">    p = QPainter()</font></div>
<div><font face="courier new, monospace">    p.begin(img)</font></div><div><font face="courier new, monospace">    p.setRenderHint(QPainter.Antialiasing)</font></div><div><font face="courier new, monospace"><br></font></div>
<div><font face="courier new, monospace">    render = QgsMapRenderer()</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    # create layer set</font></div><div>
<font face="courier new, monospace">    africa_layer = QGisLayers.getObjectFromUri(africa_map)</font></div><div><font face="courier new, monospace">    sa_layer = QGisLayers.getObjectFromUri(sa_map)</font></div><div><font face="courier new, monospace">    taxon_layer = QGisLayers.getObjectFromUri(taxon_shp)</font></div>
<div><font face="courier new, monospace">    </font></div><div><font face="courier new, monospace">    lst = []</font></div><div><font face="courier new, monospace">    lst.append(<a href="http://taxon_layer.id">taxon_layer.id</a>())    </font></div>
<div><font face="courier new, monospace">    lst.append(<a href="http://sa_layer.id">sa_layer.id</a>())</font></div><div><font face="courier new, monospace">    lst.append(<a href="http://africa_layer.id">africa_layer.id</a>())</font></div>
<div><font face="courier new, monospace">    </font></div><div><font face="courier new, monospace">    render.setLayerSet(lst)</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    # set extent (xmin,ymin,xmax,ymax)</font></div>
<div><font face="courier new, monospace">    rect = QgsRectangle(14.75,-36.00,34.00,-21.00)</font></div><div><font face="courier new, monospace">    render.setExtent(rect)</font></div><div><font face="courier new, monospace"><br>
</font></div><div><font face="courier new, monospace">    # set output size</font></div><div><font face="courier new, monospace">    render.setOutputSize(img.size(), img.logicalDpiX())</font></div><div><font face="courier new, monospace"><br>
</font></div><div><font face="courier new, monospace">    # do the rendering</font></div><div><font face="courier new, monospace">    render.render(p)</font></div><div><font face="courier new, monospace">    p.end()</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    # save image</font></div><div><font face="courier new, monospace">    outdir = os.path.dirname(os.path.abspath(output))</font></div>
<div><font face="courier new, monospace">    img.save(os.path.join(outdir,taxon+".png"),"png")</font></div><div><font face="courier new, monospace">    </font></div><div><font face="courier new, monospace">    # remove taxon layer from project</font></div>
<div><font face="courier new, monospace">    QgsMapLayerRegistry.instance().removeMapLayers(<a href="http://taxon_layer.id">taxon_layer.id</a>()) #crashes QGIS</font></div><div><font face="courier new, monospace"><br></font></div>
<div><font face="courier new, monospace">tempdir = tempfile.gettempdir()   </font></div><div><font face="courier new, monospace">taxa = sextante.runalg('qgis:listuniquevalues', all_localities, taxon_field, None)['UNIQUE_VALUES'].split(";")</font></div>
<div><font face="courier new, monospace">counter = 0   # limit for testing</font></div><div><font face="courier new, monospace">for taxon in taxa:</font></div><div><font face="courier new, monospace">    if counter < 10:</font></div>
<div><font face="courier new, monospace">        sextante.runalg('qgis:selectbyattribute', all_localities, taxon_field, 0, taxon)</font></div><div><font face="courier new, monospace">        sextante.runalg('qgis:selectbylocation', grid_layer, all_localities, 0)</font></div>
<div><font face="courier new, monospace">        filename = os.path.join(tempdir,"taxon.shp")    #memory file better?</font></div><div><font face="courier new, monospace">        sextante.runalg('qgis:saveselectedfeatures', grid_layer, filename)</font></div>
<div><font face="courier new, monospace">        print_map(taxon,filename)</font></div><div><font face="courier new, monospace">        counter+=1</font></div></div></div></div></div>