मैंने आखिरकार इसे अपने उद्देश्यों के लिए हल कर लिया है, इसलिए यहाँ समाधान है अगर मैं किसी के साथ मदद करता हूं:
एक पाइथन स्क्रिप्ट लिखें (इसके अंत में मेरा) जो अनिवार्य रूप से ऐसा करता है:
- ब्याज की बिंदु परत क्षेत्र में अद्वितीय श्रेणियों की पहचान करें
- प्रत्येक श्रेणी के लिए, सभी मिलान बिंदुओं का चयन करें और इस सेट की सीमा स्थापित करें
- प्रत्येक सीमा के लिए एक महत्वपूर्ण विशेषता "श्रेणीनाम" के साथ रिक्त एटलस कवरेज परत में एक नया बहुभुज उत्पन्न करें
इसने मुझे एटलस कवरेज लेयर दी, जिसमें एक बहुभुज इस तरह की रुचि के प्रत्येक श्रेणी के लिए है:
सामान्य के अनुसार एटलस और प्रिंट कंपोज़र को कॉन्फ़िगर करें - केवल ऑन और ऑफ फीचर्स के मुद्दे को छोड़कर।
इसके लिए विकल्पों के सटीक सेट को काम करने के लिए परीक्षण और त्रुटि का एक छोटा सा हिस्सा है:
नीचे दी गई अभिव्यक्ति से आपको वर्तमान में एटलस फीचर के लिए श्रेणीनाम क्षेत्र में रखा गया मान मिल सकता है
attribute ($atlasfeature, 'CategoryName')
की परत के साथ बिंदु परत के लिए नियम आधारित स्टाइल बनाने के लिए इसका उपयोग करें
attribute ($atlasfeature, 'CategoryName') = PointCategory AND PointCategory = "RedDots"
मेरे पास यह गारंटी देने का भी नियम था कि अन्य सभी पारदर्शी हों
attribute ($atlasfeature, 'CategoryName') IS NOT PointCategory
एटलस के साथ यह परीक्षण वास्तव में अच्छी तरह से काम करता है। अंत में, दिखाए गए लेबल में हेरफेर करने के लिए केवल उसी दृष्टिकोण का उपयोग करें, लेबल को गतिशील बनाएं और उचित तालिकाओं को फ़िल्टर करें। यदि आप सभी मानचित्रों पर सभी लेज़र आइटम नहीं चाहते हैं, तो 'सामग्री द्वारा फ़िल्टर करें कथा' को चखना भी बहुत प्रभावी है।
अंतिम एटलस सेट:
संपादित करें - जैसा कि इसके लिए कहा गया था, यहाँ मेरी स्क्रिप्ट है:
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 )