나는 마침내 내 목적을 위해 이것을 해결 했으므로 여기에 누군가를 도울 수있는 해결책이 있습니다.
본질적으로 이것을 수행하는 파이썬 스크립트를 작성하십시오 (이 끝에 광산).
- 관심 포인트 레이어 필드에서 고유 범주를 식별
- 각 범주에 대해 모든 일치점을 선택하고이 세트의 범위를 설정하십시오.
- 각 익스텐트에 대해 키 속성이 "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 )