私は最終的にこれを私の目的のために解決したので、それが誰かを助ける場合に私が思いついた解決策は次のとおりです:
本質的にこれを行うpythonスクリプト(これの最後にあるもの)を記述します。
- 対象のポイントレイヤーフィールドで一意のカテゴリを特定する
- 各カテゴリについて、すべての一致するポイントを選択し、このセットの範囲を確立します
- 各エクステントについて、キー属性「CategoryName」を持つ空白のアトラスカバレッジレイヤーに新しいポリゴンを生成します
これにより、アトラスカバレッジレイヤーに、関心のある各カテゴリに対して1つのポリゴンが次のように表示されます。
通常どおりアトラスと印刷コンポーザーを構成します-機能のオンとオフの問題のみを残します。
このため、オプションの正確なセットを算出するのは少し試行錯誤です。
以下の式では、現在のアトラス機能の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 )