Saya akhirnya memecahkan ini untuk tujuan saya jadi inilah solusi yang saya buat jika itu membantu siapa pun:
Tulis skrip python (milik saya di akhir ini) yang pada dasarnya melakukan ini:
- mengidentifikasi kategori unik di bidang lapisan poin yang menarik
- untuk setiap kategori, pilih semua titik yang cocok dan tentukan sejauh mana set ini
- untuk setiap tingkat menghasilkan poligon baru di lapisan cakupan atlas kosong dengan atribut kunci "CategoryName"
Ini memberi saya lapisan cakupan atlas dengan satu poligon untuk setiap kategori yang menarik seperti ini:
Konfigurasikan atlas dan cetak komposer seperti biasa - hanya menyisakan masalah mematikan dan mengaktifkan fitur.
Untuk ini, sedikit trial and error untuk mengetahui set opsi yang tepat:
Ekspresi di bawah ini memungkinkan Anda mendapatkan nilai yang saat ini dimiliki di bidang CategoryName untuk fitur atlas saat ini
attribute ($atlasfeature, 'CategoryName')
Gunakan ini untuk membuat gaya berdasarkan aturan untuk layer titik di sepanjang garis
attribute ($atlasfeature, 'CategoryName') = PointCategory AND PointCategory = "RedDots"
Saya juga punya aturan untuk menjamin semua yang lain menjadi transparan
attribute ($atlasfeature, 'CategoryName') IS NOT PointCategory
Menguji ini dengan atlas bekerja dengan sangat baik. Akhirnya cukup gunakan pendekatan yang sama untuk memanipulasi label yang ditampilkan, membuat label dinamis dan memfilter tabel dengan tepat. Mencentang 'legenda filter berdasarkan konten peta' juga sangat efektif jika Anda tidak ingin semua item legenda di semua peta.
Set atlas akhir:
Sunting - seperti yang diminta, inilah skrip saya:
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 )