Cuối cùng tôi đã giải quyết vấn đề này cho mục đích của mình vì vậy đây là giải pháp tôi đã đưa ra nếu nó giúp được ai:
Viết một kịch bản python (của tôi ở cuối này) về cơ bản thực hiện điều này:
- xác định danh mục duy nhất trong trường điểm quan tâm
- đối với mỗi danh mục, chọn tất cả các điểm phù hợp và thiết lập phạm vi của bộ này
- cho mỗi phạm vi, tạo một đa giác mới trong lớp phủ bản đồ trống với thuộc tính khóa "CategoryName"
Điều này đã cho tôi lớp phủ bản đồ với một đa giác cho mỗi loại sở thích trông như thế này:
Định cấu hình tập bản đồ và trình soạn thảo in như bình thường - chỉ để lại vấn đề tắt và bật các tính năng.
Đối với điều này, đó là một chút thử nghiệm và lỗi để tìm ra bộ tùy chọn chính xác:
Biểu thức bên dưới cho phép bạn nhận được giá trị hiện được giữ trong trường CategoryName cho tính năng tập bản đồ hiện tại
attribute ($atlasfeature, 'CategoryName')
Sử dụng công cụ này để tạo kiểu dựa trên quy tắc cho lớp điểm dọc theo dòng
attribute ($atlasfeature, 'CategoryName') = PointCategory AND PointCategory = "RedDots"
Tôi cũng có một quy tắc để đảm bảo tất cả những người khác trở nên minh bạch
attribute ($atlasfeature, 'CategoryName') IS NOT PointCategory
Kiểm tra điều này với atlas hoạt động thực sự tốt. Cuối cùng chỉ cần sử dụng cùng một cách tiếp cận để thao tác các nhãn được hiển thị, làm cho các nhãn động và các bảng bộ lọc một cách thích hợp. Việc gõ 'chú thích bộ lọc theo nội dung bản đồ' cũng rất hiệu quả nếu bạn không muốn tất cả các mục chú thích trên tất cả các bản đồ.
Tập bản đồ cuối cùng:
Chỉnh sửa - như đã được yêu cầu, đây là kịch bản của tôi:
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 )