Sonunda bunu benim amacım için çözdüm, işte size yardımcı oluyorsa bulduğum çözüm:
Esasen bunu yapan bir python betiği yazın (bunun sonunda benimki):
- nokta katmanı ilgi alanındaki benzersiz kategorileri belirleme
- her kategori için tüm eşleşen noktaları seçin ve bu setin kapsamını belirleyin
- her bir boyut için "CategoryName" anahtar özelliğine sahip boş bir atlas kapsama katmanında yeni bir çokgen oluşturun
Bu bana her ilgi alanı kategorisi için bir çokgen içeren atlas kapsama katmanı verdi:
Atlas ve baskı oluşturucuyu normal şekilde yapılandırın - yalnızca özelliklerin kapatılması ve açılması sorununu ortadan kaldırır.
Bunun için tam seçenek setini çözmek biraz deneme yanılma yöntemidir:
Aşağıdaki ifade, geçerli atlas özelliği için şu anda CategoryName alanında tutulan değeri almanızı sağlar
attribute ($atlasfeature, 'CategoryName')
Çizgileri boyunca nokta katmanı için kural tabanlı stil oluşturmak için bunu kullanın
attribute ($atlasfeature, 'CategoryName') = PointCategory AND PointCategory = "RedDots"
Ayrıca diğerlerinin şeffaf hale gelmesini garanti altına almak için bir kuralım vardı
attribute ($atlasfeature, 'CategoryName') IS NOT PointCategory
Bunu atlas ile test etmek gerçekten işe yarıyor. Son olarak, gösterilen etiketleri değiştirmek, etiketleri dinamik hale getirmek ve tabloları uygun şekilde filtrelemek için aynı yaklaşımı kullanın. Tüm haritalarda tüm gösterge öğelerini istemiyorsanız, 'Harita göstergesine harita içeriğine göre filtre uygula' seçeneğini işaretlemek de çok etkilidir.
Son atlas seti:
Düzenle - istendiği gibi, benim senaryom:
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 )