J'ai finalement résolu cela à mes fins, alors voici la solution que j'ai trouvée si cela aide quelqu'un:
Écrivez un script python (le mien à la fin de ceci) qui fait essentiellement ceci:
- identifier les catégories uniques dans le champ d'intérêt de la couche de points
- pour chaque catégorie, sélectionnez tous les points correspondants et établissez l'étendue de cet ensemble
- pour chaque étendue, générez un nouveau polygone dans une couche de couverture d'atlas vierge avec un attribut clé "NomCatégorie"
Cela m'a donné la couche de couverture de l'atlas avec un polygone pour chaque catégorie d'intérêt ressemblant à ceci:
Configurez l'atlas et le compositeur d'impression comme d'habitude - ne laissant que le problème de désactiver et d'activer les fonctionnalités.
Pour cela, c'est un peu d'essais et d'erreurs pour déterminer l'ensemble exact d'options:
L'expression ci-dessous vous permet d'obtenir la valeur actuellement conservée dans le champ Nom de catégorie pour la fonction d'atlas actuelle
attribute ($atlasfeature, 'CategoryName')
Utilisez-le pour créer un style basé sur des règles pour le calque de points le long des lignes de
attribute ($atlasfeature, 'CategoryName') = PointCategory AND PointCategory = "RedDots"
J'avais aussi une règle pour garantir que tous les autres devenaient transparents
attribute ($atlasfeature, 'CategoryName') IS NOT PointCategory
Tester cela avec l'atlas fonctionne très bien. Enfin, utilisez simplement la même approche pour manipuler les étiquettes affichées, rendre les étiquettes dynamiques et filtrer les tableaux de manière appropriée. Cochez la case «filtrer la légende par le contenu de la carte» est également très efficace si vous ne voulez pas que tous les éléments de légende sur toutes les cartes.
Ensemble d'atlas final:
Modifier - comme cela a été demandé, voici mon 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 )