สิ่งนี้ทำได้ดีที่สุดกับ Spatialite และ SQL
ก่อนอื่นคุณจะต้องโหลดข้อมูลของคุณลงในฐานข้อมูล Spatialite ซึ่งสามารถทำได้โดยใช้ปลั๊กอิน DBManager ที่มาพร้อมกับ QGIS Layer/File button
คลิกที่นำเข้า
ด้วยข้อมูลของคุณในฐานข้อมูลคุณสามารถเรียกใช้แบบสอบถามต่อไปนี้โดยใช้SQL
ปุ่ม คุณจะต้องเปลี่ยนชื่อของคอลัมน์และตารางเพื่อให้เหมาะกับข้อมูลของคุณ
SELECT COALESCE(SUM(a2.pop),0) as pop_neighbours,
a1.pop,
a1.name,
a1.id,
a1.geomm FROM areas a1
LEFT OUTER JOIN areas a2 ON NOT a1.id = a2.id
AND intersects(a2.geomm, a1.geomm)
GROUP BY a1.id
บอกเครื่องมือสืบค้นคอลัมน์ id (id) ที่ไม่ซ้ำใครและคอลัมน์รูปทรงเรขาคณิต (geomm) แล้วคลิกโหลด
คุณควรมีอะไรแบบนี้เมื่อคุณติดป้ายกำกับแน่นอน
Query Breakdown
เรากำลังรวมเลเยอร์เข้ากับตัวเองโดยใช้:
LEFT OUTER JOIN areas a2 ON NOT a1.id = a2.id
AND intersects(a2.geomm, a1.geomm)
แต่เฉพาะที่รูปทรงเรขาคณิตตัดกันและรหัสไม่เหมือนกันมิฉะนั้นเราจะจบลงด้วยการบันทึกเดียวกันสองครั้งสำหรับแต่ละรูปหลายเหลี่ยม เรายังใช้LEFT OUTER JOIN
เพื่อให้เรารวมบันทึกที่ไม่ได้เข้าร่วมเช่นไม่มีเพื่อนบ้าน
ในส่วนที่เลือก:
SELECT COALESCE(SUM(a2.pop),0) as pop_neighbours,
a1.pop,
a1.name,
a1.id,
a1.geomm
เราจะใช้COALESCE
ในการสั่งซื้อเพื่อแปลงNULLS
(ไม่มีเพื่อนบ้าน) ลงมิฉะนั้นพวกเขาเพียงแค่ต้องการเข้าพัก0
NULL
จากนั้นเราก็GROUP BY a1.id
จะได้รับการบันทึกเดียวสำหรับแต่ละรูปหลายเหลี่ยม