การซิงโครไนซ์มุมมองในผู้แต่งสิ่งพิมพ์ QGIS


10

ฉันพบคำถามที่คล้ายกับปัญหาของฉันมาก: จะเชื่อมโยง dataframes ใน ArcGIS หรือ QGIS ได้อย่างไร? . แต่โซลูชันสำหรับ QGIS ไม่ทำงานในขณะนี้ (ปลั๊กอินดูอัลวิวไม่สามารถใช้งานได้อีกต่อไป)

ฉันต้องการซิงค์สามมุมมอง:

ป้อนคำอธิบายรูปภาพที่นี่

แนวคิดคือการย้ายมุมมองแผนที่สามมุมมองพร้อมกันด้วยแผนที่หลักในนักแต่งเพลงพิมพ์ QGIS

มีวิธีหรือปลั๊กอินในการทำเช่นนี้?

คำตอบ:


2

อีกโซลูชัน "no code" ที่สวยงามสำหรับการซิงโครไนซ์แผนที่ผู้แต่งใช้กลไก "ภาพรวม" ในตัวของ QGIS:

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นเราจึงเพิ่มภาพรวม "กรอบแผนที่หลัก" ลงในหน้าต่างแผนที่ทุกอันที่ควรทำข้อมูลให้ตรงกันกับแผนที่หลัก จากนั้นเราตั้งค่าสไตล์เฟรมเป็น No Brush / No Pen และเปิดใช้งาน "Center on overview"

หากต้องการแก้ไขมาตราส่วนของแผนที่ย่อยเราป้อนค่า Expression: ป้อนคำอธิบายรูปภาพที่นี่

นั่นคือทั้งหมดที่

ง่ายมากและมีพลังมาก!


ที่ดี! ง่ายมาก ... งานที่ดีเลิศ
aldo_tapia

4

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

เป็นรหัสพื้นฐานจริงๆเลือกนักแต่งเพลงและแผนที่ที่ถูกต้อง:

from qgis.core import *
from qgis.utils import *

composerList = iface.activeComposers()

comp = composerList[4]

maps = comp.composition().composerMapItems()

masterMap = maps[0]
slave1 = maps[1]
slave2 = maps[4]

slave1.setNewExtent(masterMap.extent())
slave2.setNewExtent(masterMap.extent())

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

ป้อนคำอธิบายรูปภาพที่นี่

ฉันเปิดเพื่อปรับปรุงวิธีแก้ปัญหานี้ (ฉันแทบไม่มีประสบการณ์PyQGIS)


การจัดการกับขอบเขตและเกล็ดที่แตกต่างกัน

โค้ดด้านบนใช้งานได้ดีในระดับเดียวกัน (และต่อเนื่องเป็นรูปร่าง) และสเกล ตอนนี้ฉันมีรหัสที่ได้รับการปรับปรุงให้ดีขึ้นโดยมีส่วนต่าง, รูปร่างและสเกล:

from qgis.core import *
from qgis.utils import *

composerList = iface.activeComposers()

comp = composerList[0]

maps = comp.composition().composerMapItems()

masterMap = maps[2]
slave1 = maps[1]
slave2 = maps[0]

centroid = masterMap.extent().center()

diffx1 = slave1.extent().xMaximum() - slave1.extent().xMinimum()
diffy1 = slave1.extent().yMaximum() - slave1.extent().yMinimum()

diffx2 = slave2.extent().xMaximum() - slave2.extent().xMinimum()
diffy2 = slave2.extent().yMaximum() - slave2.extent().yMinimum()

newExtent1 = QgsRectangle(centroid[0]-(diffx1/2),centroid[1]-(diffy1/2),centroid[0]+(diffx1/2),centroid[1]+(diffy1/2))
newExtent2 = QgsRectangle(centroid[0]-(diffx2/2),centroid[1]-(diffy2/2),centroid[0]+(diffx2/2),centroid[1]+(diffy2/2))

slave1.setNewExtent(newExtent1)
slave2.setNewExtent(newExtent2)

และผลการทดสอบ:

ป้อนคำอธิบายรูปภาพที่นี่


อย่าลืมที่จะยอมรับคำตอบของคุณโดยคลิกที่ขีดสีเขียวจางหายไปในด้านซ้ายมือเพื่อแสดงให้เห็นถึงปัญหาของคุณได้รับการแก้ไข :)
โจเซฟ

1
@Joseph ขอบคุณ แต่แก้ไขไปครึ่งหนึ่งแล้ว ฉันจะยอมรับคำตอบของฉันเองหลังจากแปลงเป็นปลั๊กอินเพื่อมอบโซลูชันที่สมบูรณ์ ยังเป็นสิ่งที่ท้าทายสำหรับฉัน
aldo_tapia

2

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

  1. ย้ายแผนที่ A ตามที่คุณต้องการ (จะเป็นแผนที่หลัก)
  2. คลิกที่ "ดูขอบเขตในแผนที่ผ้าใบ"
  3. เปลี่ยนเป็นแผนที่ B
  4. คลิกที่ "ตั้งค่าเพื่อขยายขอบเขตผ้าใบ"
  5. เปลี่ยนเป็นแผนที่ C
  6. คลิกใน "ตั้งค่าเป็นขอบเขตผ้าใบของแผนที่"

เป็นต้น

มุมมอง / ขอบเขตของแผนที่ผ้าใบ

เมื่อคุณต้องการให้แผนที่อื่นเป็นหลักเพียงคลิกที่แผนที่อื่นจากนั้น "ดูขอบเขตภาพในแผนที่" ก่อนที่จะตั้งค่าแผนที่อื่น

หากคุณต้องการเก็บมุมมองที่เฉพาะเจาะจงไว้ใช้ในภายหลังฉันขอแนะนำให้คุณใช้แผงบุ๊คมาร์ค Spatial ตั้งค่าผืนผ้าใบแผนที่เป็นระดับที่เลือกจากนั้นคลิกที่ตั้งค่าเป็นผืนผ้าใบแผนที่ในแต่ละทาสที่คุณต้องการ :)


ใช่ฉันเคยทำด้วยวิธีนี้ เป็นตัวเลือกที่ยอดเยี่ยม แต่ปรับมาตราส่วนในแผนที่ B และ C เสมอการเปลี่ยนแปลงดังนั้นจึงมีอีกสองขั้นตอน
aldo_tapia

คำตอบที่ดีของคุณฉันต้องลอง ^^
gisnside

2

ฉันเพิ่งมีปัญหาเดียวกันและสามารถรับผลลัพธ์ที่ต้องการโดยใช้นิพจน์บนแผนที่ที่ขึ้นต่อกัน สิ่งนี้ถือว่าแผนที่ทั้งหมดมีขนาดเท่ากันในเค้าโครง

  1. ระบุ ID รายการในแผนที่หลักของคุณเช่น 'map1' (ที่ด้านล่างของคุณสมบัติรายการ)

  2. บนแต่ละแผนที่ที่ขึ้นต่อกันให้เพิ่มนิพจน์ในแต่ละค่าของขอบเขต:

    x_min(map_get(item_variables('map1'), 'map_extent'))
    

รหัสจะได้รับตัวแปรสำหรับรายการผู้แต่ง 'map1' รับขอบเขตเป็นรูปทรงเรขาคณิตจากมันและในที่สุดก็ได้รับค่า x_min จากรูปทรงเรขาคณิต เปลี่ยน x_min เป็น y_min, x_max และ y_max ตามลำดับ

ข้อเสียเพียงอย่างเดียวคือคุณต้องรีเฟรชแผนที่ตามแต่ละครั้งที่คุณย้ายแผนที่หลัก ในการส่งออกควรอัปเดตโดยอัตโนมัติแม้ว่า


คุณใช้ QGIS รุ่นใดอยู่ ฉันพยายามใน 3.0.2 โดยไม่ประสบความสำเร็จ
aldo_tapia

@aldo_tapia QGIS 3.0.3 บน Ubuntu 16.04
leak_my_brain

แปลกฉันไม่สามารถทำให้มันทำงาน ... แต่ upvoted!
aldo_tapia
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.