Ho finalmente risolto questo per i miei scopi, quindi ecco la soluzione che ho trovato se aiuta qualcuno:
Scrivi uno script Python (il mio alla fine di questo) che essenzialmente fa questo:
- identificare le categorie uniche nel campo di interesse del livello punto
- per ogni categoria, selezionare tutti i punti corrispondenti e stabilire l'estensione di questo set
- per ogni misura genera un nuovo poligono in un livello di copertura dell'atlante vuoto con un attributo chiave "NomeCategoria"
Questo mi ha dato il livello di copertura dell'atlante con un poligono per ogni categoria di interesse simile a questa:
Configura l'atlante e il compositore di stampa come al solito, lasciando solo il problema di disattivare e attivare le funzionalità.
Per questo è un po 'di tentativi ed errori per elaborare il set esatto di opzioni:
L'espressione seguente consente di ottenere il valore attualmente contenuto nel campo NomeCategoria per la funzione atlante corrente
attribute ($atlasfeature, 'CategoryName')
Usalo per creare uno stile basato su regole per il livello punto lungo le linee di
attribute ($atlasfeature, 'CategoryName') = PointCategory AND PointCategory = "RedDots"
Avevo anche una regola per garantire che tutti gli altri diventassero trasparenti
attribute ($atlasfeature, 'CategoryName') IS NOT PointCategory
Testare questo con l'atlante funziona davvero bene. Infine, usa lo stesso approccio per manipolare le etichette mostrate, rendere dinamiche le etichette e filtrare le tabelle in modo appropriato. Spuntare la 'legenda del filtro per contenuto della mappa' è anche molto efficace se non si desidera tutti gli elementi della legenda su tutte le mappe.
Set atlante finale:
Modifica - come è stato richiesto, ecco il mio 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 )