ในที่สุดฉันก็แก้ปัญหานี้เพื่อจุดประสงค์ของฉันดังนั้นนี่เป็นวิธีแก้ปัญหาที่ฉันจะได้รับหากมันช่วยใครได้:
เขียนสคริปต์ไพ ธ อน (ของฉันตอนท้าย) ซึ่งทำสิ่งนี้เป็นหลัก:
- ระบุหมวดหมู่ที่ไม่ซ้ำกันในฟิลด์เลเยอร์จุดสนใจ
- สำหรับแต่ละหมวดหมู่ให้เลือกจุดที่ตรงกันทั้งหมดและกำหนดขอบเขตของชุดนี้
- สำหรับแต่ละขอบเขตจะสร้างรูปหลายเหลี่ยมใหม่ในเลเยอร์การครอบคลุม Atlas ที่ว่างเปล่าพร้อมกับแอตทริบิวต์คีย์ "CategoryName"
สิ่งนี้ทำให้เลเยอร์การครอบคลุมของแผนที่ด้วยรูปหลายเหลี่ยมหนึ่งรูปสำหรับแต่ละหมวดหมู่ที่สนใจเช่นนี้:
กำหนดค่าแอตลาสและผู้แต่งเพลงตามปกติ - เหลือเพียงปัญหาของการปิดและเปิดฟีเจอร์
สำหรับเรื่องนี้มันเป็นการทดลองและข้อผิดพลาดเล็กน้อยในการหาทางเลือกที่แน่นอน:
นิพจน์ด้านล่างช่วยให้คุณรับค่าที่เก็บไว้ในฟิลด์ CategoryName สำหรับคุณลักษณะแอตลาสปัจจุบัน
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 )