Eu tinha um requisito semelhante e montei um plug-in QGIS para gerar os mapas, com base em um shapefile com localidades de pontos para todas as espécies (ele assume um nome de taxon exclusivo na tabela de atributos como identificador comum). Meus requisitos não eram tão complexos - eu não precisava de informações, títulos ou legendas sazonais, mas pode ser um ponto de partida útil para você. Para os aspectos mais complexos, você precisará usar o compositor de mapas. Veja o livro de receitas do PyQGIS para mais informações.
Plugar
O plug-in automatiza a criação dos mapas e permite configurar extensões, resolução e outros aspectos. Aplica o mesmo estilo à saída que a sobreposição da grade. Atualmente, ele é executado apenas na versão de desenvolvimento do QGIS (1.9 ou posterior).
Script Sextante
Antes de criar o plugin, elaborei a lógica usando o SEXTANTE. Este script de usuário também deve funcionar no 1.8 (não o testou). O arquivo de estilo de distribuição (.qml) é o estilo das distribuições de saída (ignora o estilo da sobreposição de distribuição). Atualmente, ele coloca os mapas de saída no diretório temp com base nos padrões do sistema operacional (/ tmp no Linux e em vários locais no Windows - definidos pela variável de ambiente TEMP). Você pode facilmente definir isso no código. Você também precisará editar a extensão e a resolução de saída no código (e a cor do plano de fundo, se desejar uma cor diferente para o mar).
#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
#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)
taxon_layer = QgsVectorLayer(taxon_shp,"taxon","ogr")
QgsMapLayerRegistry.instance().addMapLayer(taxon_layer)
taxon_layer.loadNamedStyle(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))
tempdir = tempfile.gettempdir()
img.save(os.path.join(tempdir,taxon+".png"),"png")
# remove taxon layer from project
QgsMapLayerRegistry.instance().removeMapLayers([taxon_layer.id()])
tempdir = tempfile.gettempdir()
taxa = sextante.runalg('qgis:listuniquevalues', all_localities, taxon_field, None)['UNIQUE_VALUES'].split(";")
for taxon in taxa:
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)