Finalmente resolví esto para mis propósitos, así que aquí está la solución que se me ocurrió si ayuda a alguien:
Escribe un script de Python (el mío al final de esto) que esencialmente hace esto:
- Identificar las categorías únicas en el campo de interés de la capa de puntos
- para cada categoría, seleccione todos los puntos coincidentes y establezca la extensión de este conjunto
- para cada extensión generar un nuevo polígono en una capa de cobertura de atlas en blanco con un atributo clave "CategoryName"
Esto me dio la capa de cobertura del atlas con un polígono para cada categoría de interés que se ve así:
Configure el atlas y el compositor de impresión de manera normal, dejando solo el problema de desactivar y activar las funciones.
Para esto, es un poco de prueba y error determinar el conjunto exacto de opciones:
La siguiente expresión le permite obtener el valor que actualmente se encuentra en el campo CategoryName para la característica de atlas actual
attribute ($atlasfeature, 'CategoryName')
Use esto para crear un estilo basado en reglas para la capa de puntos a lo largo de las líneas de
attribute ($atlasfeature, 'CategoryName') = PointCategory AND PointCategory = "RedDots"
También tenía una regla para garantizar que todos los demás se volvieran transparentes
attribute ($atlasfeature, 'CategoryName') IS NOT PointCategory
Probar esto con el atlas funciona muy bien. Finalmente, utilice el mismo enfoque para manipular las etiquetas que se muestran, haga que las etiquetas sean dinámicas y filtre las tablas adecuadamente. Marcar la opción 'filtrar leyenda por contenido del mapa' también es muy efectivo si no desea todos los elementos de la leyenda en todos los mapas.
Conjunto final de atlas:
Editar: como se solicitó, aquí está mi script:
from PyQt4.QtCore import *
#main script----------------------------------------------
#set up the layer references - you will need to change this
targetlayer=QgsMapLayerRegistry.instance().mapLayer("AtlasExtents20150727154732521")
eylayer = QgsMapLayerRegistry.instance().mapLayer("Early_Years_Providers20150727152919862")
#establish the unique categories
names = getUniqueAttributes(eylayer, 'Mapping_La')
#get a set of boxes
boxset = getBoundings(eylayer, names)
#ensure layer is emptied, then add bounding boxes
deleteBoxes(targetlayer)
createBoxes(targetlayer, boxset)
#end main script----------------------------------------------
#------functions-------#
#gets unique set of attributes - returns a set()
def getUniqueAttributes(layer, fieldname):
values = set()
for feature in layer.getFeatures():
values.add(feature[fieldname])
return values
#quickly selects all points on a layer, given a query
def selectionQuick(layer, queryitem):
layer.removeSelection ()
#hardcoded field name
expr = QgsExpression( "\"Mapping_La\" = '" + queryitem +"'")
it = layer.getFeatures( QgsFeatureRequest( expr ) )
ids = [i.id() for i in it]
layer.setSelectedFeatures( ids )
#for a set of unique items, get bounding boxes
def getBoundings(layer, itemset):
bboxes = {}
for itemname in itemset:
selectionQuick(layer,itemname)
box = layer.boundingBoxOfSelected()
bboxes[itemname] = box
return bboxes
#for a layer create a bunch of boxes
def createBoxes(layer, boxes):
id=0
for boxkey in boxes:
id = id +1
box=boxes[boxkey]
feat = QgsFeature(layer.pendingFields())
geom = QgsGeometry.fromRect(box)
feat.setAttribute('id', id)
#hardcoded field name
feat.setAttribute('CareType', boxkey)
feat.setGeometry(geom)
(res, outFeats) = layer.dataProvider().addFeatures([feat])
def deleteBoxes(layer):
ids = [f.id() for f in layer.getFeatures()]
layer.dataProvider().deleteFeatures( ids )