Menyinkronkan tampilan dalam komposer cetak QGIS?

10

Saya menemukan pertanyaan yang sangat mirip dengan masalah saya: Bagaimana menautkan dataframe di ArcGIS atau QGIS? . Tetapi solusi untuk QGIS tidak berfungsi sekarang (plug-in Dual View tidak tersedia lagi).

Saya ingin menyinkronkan tiga tampilan:

masukkan deskripsi gambar di sini

Idenya adalah untuk memindahkan tiga tampilan peta pada saat yang sama dengan master peta dalam komposer cetak QGIS.

Apakah ada cara atau plug-in untuk melakukan ini?

aldo_tapia
sumber

Jawaban:

2

Solusi "tanpa kode" elegan lainnya untuk sinkronisasi peta komposer menggunakan mekanisme "Ikhtisar" QGIS bawaan:

masukkan deskripsi gambar di sini

Untuk itu kami menambahkan ikhtisar "Bingkai Peta Utama" ke setiap jendela peta, yang harus disinkronkan dengan peta induk. Kemudian kita mengatur gaya bingkai ke No Brush / No Pen dan mengaktifkan "Center on overview".

Untuk memperbaiki skala peta anak, kami memasukkan nilai Ekspresi: masukkan deskripsi gambar di sini

Itu saja.

Sangat mudah dan sangat dinamis!

christoph
sumber
Bagus! Sangat sederhana ... kerja yang luar biasa
aldo_tapia
4

Satu-satunya cara yang saya temukan saat ini untuk membuat skrip kecil dengan python, mungkin ini bisa bermigrasi ke plugin tapi saya tidak punya pengalaman dalam hal itu.

Merupakan kode yang sangat mendasar, memilih komposer dan peta yang tepat:

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())

Pilihan lain adalah mempertahankan skala awal dalam peta slave untuk ditetapkan setelah batas baru jika peta memiliki bentuk yang berbeda, tetapi dalam kasus pribadi saya dengan kode ini sudah cukup:

masukkan deskripsi gambar di sini

Saya terbuka untuk meningkatkan solusi ini (saya hampir tidak punya pengalaman dengan PyQGIS).


Berurusan dengan luasan dan skala yang berbeda

Kode di atas berfungsi dengan baik dengan tingkat yang sama (dan akibatnya, bentuk) dan skala. Sekarang saya memiliki kode yang ditingkatkan diuji dengan luasan, bentuk dan skala yang berbeda:

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)

Dan tes yang dihasilkan:

masukkan deskripsi gambar di sini

aldo_tapia
sumber
Jangan lupa untuk menerima jawaban Anda dengan mengklik tanda centang hijau pudar di sisi kiri untuk menunjukkan bahwa masalah Anda telah terpecahkan :)
Joseph
1
@ Joseph, terima kasih, tetapi sudah setengah terpecahkan. Saya akan menerima jawaban saya sendiri setelah mengonversinya dalam plug-in untuk memberikan solusi lengkap. Masih menjadi tantangan bagi saya
aldo_tapia
2

Hanya sedikit tip untuk melakukannya tanpa kode. Itu kurang efisien daripada jawaban aldo tetapi itu pada akhirnya melakukan trik jika itu untuk melakukan peta akhir. Anda juga tidak perlu memiliki tampilan master, ini adalah batas kanvas peta yang diperhitungkan:

  1. Pindahkan peta A sesuai keinginan (itu akan menjadi peta induk)
  2. Klik "Lihat jangkauan di kanvas peta"
  3. Beralih ke peta B
  4. Klik "Setel untuk memetakan batas kanvas"
  5. Beralih ke peta C
  6. Klik "Setel untuk memetakan batas kanvas"

dll.

peta tampilan / luas kanvas

Saat Anda membutuhkan peta lain untuk menjadi master, cukup klik pada peta lainnya lalu "lihat luasnya di kanvas peta" sebelum mengatur yang lain.

Jika Anda ingin menyimpan tampilan tertentu untuk nanti, saya sarankan Anda menggunakan panel bookmark spasial. Atur kanvas peta ke batas yang dipilih lalu klik Setel untuk memetakan kanvas di setiap budak yang Anda butuhkan :)

gisnside
sumber
Ya, saya biasa melakukannya dengan cara ini. Merupakan pilihan yang bagus, tetapi skala di peta B dan C selalu berubah, jadi ada dua langkah lagi
aldo_tapia
jawaban yang bagus untukmu, aku harus mencobanya ^^
gisnside
2

Saya hanya punya masalah yang sama dan bisa mendapatkan hasil yang diinginkan menggunakan ekspresi pada peta dependen. Ini mengasumsikan semua peta memiliki dimensi yang sama dalam tata letak.

  1. Berikan peta master Anda ID item, misalnya 'map1' (di bagian bawah properti item)

  2. Pada setiap peta dependen, tambahkan ekspresi ke masing-masing nilai luas:

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

Kode akan mendapatkan variabel untuk item komposer 'map1', mendapatkan sejauh geometri dari itu dan akhirnya mendapatkan nilai x_min dari geometri. Ubah x_min menjadi y_min, x_max dan y_max sesuai.

Satunya downside adalah bahwa Anda perlu me-refresh peta tergantung setiap kali Anda memindahkan peta master. Pada ekspor itu harus diperbarui secara otomatis.

leak_my_brain
sumber
Versi QGIS mana yang Anda gunakan? Saya mencoba di 3.0.2 tanpa hasil
aldo_tapia
@aldo_tapia QGIS 3.0.3 di Ubuntu 16.04
leak_my_brain
Aneh, saya tidak bisa menjalankannya ... Tapi terbalik!
aldo_tapia