Nokta özelliklerine dayalı bir Atlas nasıl oluşturulur?


9

Esasen bir nokta katmanındaki kategorik bir alana dayalı bir atlas üretmek istiyorum.

yani kategorik alanı "Karşılık" olan bir çocuk bakım sağlayıcıları nokta tabakası var. Bu alandaki her özelliği "Okul Sonrası Kulübü", "Kahvaltı Kulübü" vb. İle kategorilere ayırdım ve şimdi her kategori için yinelenen ve her biri için sadece puanları gösteren bir dizi harita üretmek istiyorum. Okul sonrası kulüplerden bir harita, kahvaltı kulüplerinden bir harita vb. Kapsamları oldukça farklı olabilir.

Birer birer yapabilirim ama her kategorinin kapsamına göre bir atlas üretmenin bir yolu olmalı gibi görünüyor mu? (Bariz bir şeyi kaçırdığımı hissediyorum :))

Veya alternatif olarak, bir çokgen katmanının oluşturulmasını otomatikleştirmenin ve bunu atlas için gizli bir kapsam olarak kullanmanın bir yolu var mı?

EDIT: Bu konuda biraz ilerleme kaydetti - geçerli atlas kapsama özelliği ile ilgili özellikleri açmak ve kapatmak için kural tabanlı stil kullanabilirsiniz. tüm yapmak istediğiniz farklı bir nokta kümesi göstermek aslında iyi çalışıyor. Şimdi bunu bir renk şemasına ve reaktif efsaneye geri bağlamaya bakıyorum.



Teşekkürler Chris - ama emin değilim. Orijinal bir atlastaki her alan için bir alt atlas yapıp yapamayacağınızı mı soruyor? her biri 4 sayfa olan 4 alan? (Ben ne istendi takip etmek için mücadele rağmen)
JonoPatterson

1
Hayır, temelde her ikiniz bir harita serisi oluşturmak istiyorsunuz. Seri, aynı harita kapsamını ve temel bilgileri, ancak her birinde farklı özellikleri gösterir. Buradaki yorumum, sayfa tanımlama sorguları denilen şeyle ArcGIS'te bunun hakkında konuşuyor ve bağlantı kuruyor - yani, atlas / mapbook'taki her sayfada o sayfada hangi katmanların / özelliklerin gösterileceğini belirleyen bir tanım sorgusu var. Sadece tek bir dizi istediğiniz bir dizi serisi istiyor. Ancak QGIS henüz böyle bir işlevsellik sunuyor mu bilmiyorum (Ben bir cevap / yorum okudum değil düşündüm, ama şimdi bulamıyorum).
Chris W

Ayrıca, sizin durumunuzda, her bir noktanın aynı nitelikleri paylaşan uzantılarına dayalı sınırlayıcı kutular oluşturabilir ve ardından bunları dizin özellikleriniz olarak kullanabilirsiniz, ancak yine de farklı nokta gruplarını otomatik olarak açma ve kapatma sorunuyla karşı karşıya kalırsınız. . Bunları ayrı katmanlara ayırsanız bile, bir tür tanım sorgusu olmadan herhangi bir sayfada bu noktaları kapatmanın bir yolu yoktur.
Chris W

Evet, öldün. Onun da bu bir tekrar gis.stackexchange.com/questions/121802/… - bu yüzden elle yapmak için başvurmak zorunda kalabilirsiniz.
JonoPatterson

Yanıtlar:


9

Sonunda bunu benim amacım için çözdüm, işte size yardımcı oluyorsa bulduğum çözüm:

Esasen bunu yapan bir python betiği yazın (bunun sonunda benimki):

  1. nokta katmanı ilgi alanındaki benzersiz kategorileri belirleme
  2. her kategori için tüm eşleşen noktaları seçin ve bu setin kapsamını belirleyin
  3. her bir boyut için "CategoryName" anahtar özelliğine sahip boş bir atlas kapsama katmanında yeni bir çokgen oluşturun

Bu bana her ilgi alanı kategorisi için bir çokgen içeren atlas kapsama katmanı verdi: Atlas kapsama katmanı

Atlas ve baskı oluşturucuyu normal şekilde yapılandırın - yalnızca özelliklerin kapatılması ve açılması sorununu ortadan kaldırır.

Bunun için tam seçenek setini çözmek biraz deneme yanılma yöntemidir:

  1. Aşağıdaki ifade, geçerli atlas özelliği için şu anda CategoryName alanında tutulan değeri almanızı sağlar

    attribute ($atlasfeature, 'CategoryName') 
    
  2. Çizgileri boyunca nokta katmanı için kural tabanlı stil oluşturmak için bunu kullanın

    attribute ($atlasfeature, 'CategoryName') = PointCategory AND PointCategory = "RedDots"
    
  3. Ayrıca diğerlerinin şeffaf hale gelmesini garanti altına almak için bir kuralım vardı

    attribute ($atlasfeature, 'CategoryName') IS NOT PointCategory
    

Gösterilen kurallar

Bunu atlas ile test etmek gerçekten işe yarıyor. Son olarak, gösterilen etiketleri değiştirmek, etiketleri dinamik hale getirmek ve tabloları uygun şekilde filtrelemek için aynı yaklaşımı kullanın. Tüm haritalarda tüm gösterge öğelerini istemiyorsanız, 'Harita göstergesine harita içeriğine göre filtre uygula' seçeneğini işaretlemek de çok etkilidir.

Son atlas seti:

Özellik Tabanlı Atlas

Düzenle - istendiği gibi, benim senaryom:

    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 )

3
@JonoPatterson şimdi de başlangıçta belirtilen python betiğinizi paylaşacak olsaydınız, bu şimdiye kadarki en iyi cevap olurdu;)
Bernd V.

Tamam bunu yapacak - onun kaba n hazır olsa da bazı tweaks (yıllardır herhangi bir kodlama yapmadım!) Gerekir. Bunu yapmanın en iyi yolu nedir - sadece bir kod kutusuna yapıştırın?
JonoPatterson

@JonoPatterson Senaryo için çok teşekkür ederim. Benim için bir acemi olarak, bu zaten çok iyi görünüyor :). Eminim yakında buna ihtiyacım olacak.
Bernd V.

Örnek ifadeleriniz biraz yanlış - "$ atlasfeature" olmalı, "$ atlasfeatureid" değil
ndawson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.