วิธีสร้าง Atlas ตามคุณลักษณะของจุด


9

โดยพื้นฐานแล้วฉันต้องการที่จะสร้างแอตลาสตามฟิลด์เด็ดขาดในเลเยอร์จุด

นั่นคือฉันมีจุดเลเยอร์ของผู้ให้บริการดูแลเด็กที่มีฟิลด์เด็ดขาด "การจัดเตรียม" ฉันได้จัดหมวดหมู่ฟีเจอร์แต่ละรายการในฟิลด์นี้ด้วย "After School Club", "Breakfast Club" ฯลฯ และตอนนี้ฉันต้องการสร้างชุดของแผนที่ที่วนซ้ำตามแต่ละหมวดหมู่และแสดงเฉพาะคะแนนสำหรับแต่ละอัน หนึ่งแผนที่ของสโมสรหลังเลิกเรียน, แผนที่ของสโมสรอาหารเช้าและอื่น ๆ ขอบเขตอาจแตกต่างกันเล็กน้อย

ฉันสามารถทำทีละคน แต่ดูเหมือนว่าควรมีวิธีการสร้างแผนที่ตามขอบเขตของแต่ละหมวดหมู่? (ฉันรู้สึกว่าฉันขาดอะไรบางอย่างที่ชัดเจน :))

หรือจะมีวิธีการสร้างเลเยอร์รูปหลายเหลี่ยมโดยอัตโนมัติและใช้สิ่งนั้นเป็นพื้นที่ซ่อนเร้นสำหรับแผนที่หรือไม่

แก้ไข: ฉันมีความคืบหน้าเล็กน้อยเกี่ยวกับเรื่องนี้ - คุณสามารถใช้การออกแบบตามกฎเพื่อเปิดและปิดคุณสมบัติที่เกี่ยวข้องกับคุณลักษณะการครอบคลุมแผนที่ปัจจุบัน มันใช้งานได้จริงถ้าทุกอย่างที่คุณต้องการคือแสดงคะแนนที่แตกต่าง ตอนนี้ฉันกำลังมองหาที่ผูกกลับไปที่โทนสีและตำนานปฏิกิริยา


1
นี่เป็นพื้นๆ
Chris W

ขอบคุณ Chris - แต่ไม่แน่ใจว่าเป็นเช่นนั้นหรือไม่ อันนั้นดูเหมือนจะถามว่าคุณสามารถทำแผนที่ย่อยสำหรับแต่ละพื้นที่ในแผนที่ดั้งเดิมได้หรือไม่? เช่น 4 พื้นที่ละ 4 หน้า? (แม้ว่าฉันพยายามดิ้นรนเพื่อติดตามสิ่งที่ถูกขอ)
JonoPatterson

1
ไม่โดยพื้นฐานแล้วคุณทั้งคู่ต้องการสร้างชุดแผนที่ ชุดแสดงขอบเขตแผนที่เดียวกันและข้อมูลพื้นฐาน แต่มีคุณสมบัติแตกต่างกันในแต่ละอัน ความคิดเห็นของฉันพูดถึงและลิงก์ไปยังการทำใน ArcGIS ผ่านสิ่งที่เรียกว่าการสืบค้นคำจำกัดความของหน้า - นั่นคือแต่ละหน้าใน atlas / mapbook มีการสืบค้นคำจำกัดความที่กำหนดว่าเลเยอร์ / คุณสมบัติใดจะแสดงในหน้านั้น เขาต้องการซีรีส์ซีรีส์ที่คุณต้องการซีรีส์เดียว อย่างไรก็ตามฉันไม่ทราบว่า QGIS ยังมีฟังก์ชั่นดังกล่าว (ฉันคิดว่าฉันอ่านคำตอบ / ความคิดเห็นที่ไม่ได้ แต่ตอนนี้ฉันไม่สามารถหาได้)
Chris W

นอกจากนี้ในกรณีของคุณคุณสามารถสร้างกล่องขอบเขตตามขอบเขตของแต่ละจุดที่ใช้คุณสมบัติเดียวกันแล้วใช้มันเป็นคุณสมบัติดัชนีของคุณ แต่คุณยังคงมีปัญหาในการเปิดและปิดกลุ่มจุดต่าง ๆ โดยอัตโนมัติ . แม้ว่าคุณจะแบ่งเป็นเลเยอร์แยกกันโดยไม่มีการสืบค้นคำจำกัดความบางอย่างก็ไม่มีทางที่จะปิดประเด็นเหล่านั้นในหน้าใดก็ตาม
Chris W

ใช่ตายแล้ว นอกจากนี้ยังเป็นการทำซ้ำของgis.stackexchange.com/questions/121802/นี้- ดังนั้นฉันอาจต้องหันไปทำด้วยตนเอง
JonoPatterson

คำตอบ:


9

ในที่สุดฉันก็แก้ปัญหานี้เพื่อจุดประสงค์ของฉันดังนั้นนี่เป็นวิธีแก้ปัญหาที่ฉันจะได้รับหากมันช่วยใครได้:

เขียนสคริปต์ไพ ธ อน (ของฉันตอนท้าย) ซึ่งทำสิ่งนี้เป็นหลัก:

  1. ระบุหมวดหมู่ที่ไม่ซ้ำกันในฟิลด์เลเยอร์จุดสนใจ
  2. สำหรับแต่ละหมวดหมู่ให้เลือกจุดที่ตรงกันทั้งหมดและกำหนดขอบเขตของชุดนี้
  3. สำหรับแต่ละขอบเขตจะสร้างรูปหลายเหลี่ยมใหม่ในเลเยอร์การครอบคลุม Atlas ที่ว่างเปล่าพร้อมกับแอตทริบิวต์คีย์ "CategoryName"

สิ่งนี้ทำให้เลเยอร์การครอบคลุมของแผนที่ด้วยรูปหลายเหลี่ยมหนึ่งรูปสำหรับแต่ละหมวดหมู่ที่สนใจเช่นนี้: ชั้นความครอบคลุมของ Atlas

กำหนดค่าแอตลาสและผู้แต่งเพลงตามปกติ - เหลือเพียงปัญหาของการปิดและเปิดฟีเจอร์

สำหรับเรื่องนี้มันเป็นการทดลองและข้อผิดพลาดเล็กน้อยในการหาทางเลือกที่แน่นอน:

  1. นิพจน์ด้านล่างช่วยให้คุณรับค่าที่เก็บไว้ในฟิลด์ CategoryName สำหรับคุณลักษณะแอตลาสปัจจุบัน

    attribute ($atlasfeature, 'CategoryName') 
    
  2. ใช้สิ่งนี้เพื่อสร้างการกำหนดสไตล์ตามกฎสำหรับเลเยอร์จุดตามแนวของ

    attribute ($atlasfeature, 'CategoryName') = PointCategory AND PointCategory = "RedDots"
    
  3. ฉันยังมีกฎเพื่อรับประกันว่าคนอื่น ๆ ทั้งหมดนั้นโปร่งใส

    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 )

3
@JonoPatterson ถ้าคุณต้องการในขณะนี้ยังมีการแบ่งหลามสคริปต์ของคุณที่กล่าวถึงใน thebeginning นี้จะเป็นคำตอบที่ดีที่สุดที่เคย;)
แบร์นโวลต์

ตกลงจะทำสิ่งนี้ - แม้ว่ามันจะไม่พร้อมก็ตามดังนั้นมันจะต้องมีการปรับแต่ง (ยังไม่ได้ทำการเข้ารหัสใด ๆ เป็นเวลาหลายปี!) วิธีที่ดีที่สุดที่จะทำคืออะไร - เพียงวางในกล่องรหัส?
JonoPatterson

@JonoPatterson ขอบคุณมากสำหรับสคริปต์ สำหรับฉันในฐานะมือใหม่นี่มันดูดีมากแล้ว :) ฉันแน่ใจว่าฉันจะต้องการสิ่งนี้ในไม่ช้า
Bernd V.

นิพจน์ตัวอย่างของคุณผิดเล็กน้อย - ควรเป็น "$ atlasfeature" ไม่ใช่ "$ atlasfeatureid"
ndawson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.