Ich habe dies endlich für meine Zwecke gelöst. Hier ist die Lösung, die ich gefunden habe, wenn sie jemandem hilft:
Schreiben Sie ein Python-Skript (meins am Ende), das im Wesentlichen Folgendes tut:
- Identifizieren Sie die eindeutigen Kategorien im interessierenden Punktschichtfeld
- Wählen Sie für jede Kategorie alle übereinstimmenden Punkte aus und legen Sie den Umfang dieses Satzes fest
- Generieren Sie für jede Ausdehnung ein neues Polygon in einer leeren Atlasabdeckungsebene mit dem Schlüsselattribut "CategoryName".
Dies gab mir die Atlasabdeckungsschicht mit einem Polygon für jede interessierende Kategorie, die so aussah:
Konfigurieren Sie den Atlas und den Print Composer wie gewohnt - und lassen Sie nur die Funktionen zum Ein- und Ausschalten.
Dafür ist es ein bisschen Versuch und Irrtum, die genauen Optionen herauszufinden:
Mit dem folgenden Ausdruck können Sie den Wert abrufen, der derzeit im Feld CategoryName für die aktuelle Atlasfunktion gespeichert ist
attribute ($atlasfeature, 'CategoryName')
Verwenden Sie diese Option, um ein regelbasiertes Styling für die Punktebene entlang der Linien von zu erstellen
attribute ($atlasfeature, 'CategoryName') = PointCategory AND PointCategory = "RedDots"
Ich hatte auch eine Regel, um sicherzustellen, dass alle anderen transparent wurden
attribute ($atlasfeature, 'CategoryName') IS NOT PointCategory
Das Testen mit dem Atlas funktioniert wirklich gut. Verwenden Sie zum Schluss einfach den gleichen Ansatz, um die angezeigten Beschriftungen zu bearbeiten, Beschriftungen dynamisch zu machen und Tabellen entsprechend zu filtern. Das Aktivieren der Option "Legende nach Karteninhalt filtern" ist auch dann sehr effektiv, wenn nicht alle Legendenelemente auf allen Karten angezeigt werden sollen.
Letzter Atlas-Satz:
Bearbeiten - wie es verlangt wurde, hier ist mein Skript:
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 )