Sincronizzazione delle viste nel compositore di stampe QGIS?


10

Ho trovato una domanda molto simile al mio problema: come collegare i frame di dati in ArcGIS o QGIS? . Ma la soluzione per QGIS non funziona ora (il plug-in Dual View non è più disponibile).

Voglio sincronizzare tre visualizzazioni:

inserisci qui la descrizione dell'immagine

L'idea è di spostare le tre viste della mappa contemporaneamente con una mappa principale nel compositore di stampe QGIS.

C'è un modo o un plug-in per farlo?

Risposte:


2

Un'altra elegante soluzione "senza codice" per la sincronizzazione delle mappe del compositore utilizza il meccanismo "Panoramica" incorporato di QGIS:

inserisci qui la descrizione dell'immagine

Pertanto, aggiungiamo una panoramica "Cornice mappa principale" a ogni finestra della mappa, che deve essere sincronizzata con la mappa principale. Quindi impostiamo lo stile della cornice su Nessun pennello / Nessuna penna e abilitiamo "Centra sulla panoramica".

Per correggere la scala della mappa figlio, inseriamo un valore di espressione: inserisci qui la descrizione dell'immagine

È tutto.

Molto semplice e molto dinamico!


Grande! Così semplice ... ottimo lavoro in giro
aldo_tapia,

4

L'unico modo in cui l'ho trovato in questo momento per creare un piccolo script in Python, forse questo potrebbe migrare in un plugin, ma non ho esperienza in questo.

È un codice davvero semplice, selezionando il compositore e le mappe giuste:

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

Un'altra opzione sarebbe mantenere la scala iniziale nelle mappe slave da impostare dopo la nuova estensione se le mappe hanno forme diverse, ma nel mio caso personale con questo codice era sufficiente:

inserisci qui la descrizione dell'immagine

Sono aperto per migliorare questa soluzione (quasi non ho esperienza con PyQGIS).


Trattare con diverse estensioni e scale

Il codice sopra funziona alla grande con la stessa misura (e, di conseguenza, forma) e scala. Ora ho un codice migliorato testato con differenti estensioni, forme e scale:

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)

E il test risultante:

inserisci qui la descrizione dell'immagine


Non dimenticare di accettare la tua risposta facendo clic sul segno di spunta verde sul lato sinistro per mostrare che il tuo problema è stato risolto :)
Joseph

1
@Joseph grazie, ma è parzialmente risolto. Accetterò la mia risposta dopo averlo convertito in un plug-in per fornire una soluzione completa. Ancora una sfida per me
aldo_tapia,

2

Solo un piccolo consiglio per farlo senza codice. È meno efficiente della risposta di aldo ma alla fine fa il trucco se è per fare una mappa finale. Non è nemmeno necessario avere una vista principale, è l'estensione della tela della mappa che conta:

  1. Sposta la mappa A come desideri (sarà la mappa principale)
  2. Fai clic su "Visualizza l'estensione nell'area di disegno della mappa"
  3. Passa alla mappa B
  4. Fai clic su "Imposta l'estensione della tela"
  5. Passa alla mappa C
  6. Fai clic su "Imposta l'estensione della tela"

eccetera.

visualizzazione / estensione della tela della mappa

Quando hai bisogno che un'altra mappa sia un master, fai semplicemente clic sull'altra mappa e poi "visualizza l'estensione nella tela della mappa" prima di impostare le altre.

Se desideri conservare una vista specifica per dopo, ti consiglio di utilizzare il pannello dei segnalibri spaziali. Imposta la tela della mappa in una misura scelta, quindi fai clic su Imposta per mappare la tela in ogni slave di cui hai bisogno :)


Sì, lo facevo in questo modo. È un'ottima opzione, ma le scale nelle mappe B e C cambiano sempre, quindi ci sono altri due passaggi
aldo_tapia,

bella risposta tua,
devo

2

Ho avuto lo stesso problema ed ero in grado di ottenere il risultato desiderato usando le espressioni sulle mappe dipendenti. Ciò presuppone che tutte le mappe abbiano le stesse dimensioni nel layout.

  1. Assegna alla tua mappa principale un ID oggetto, ad esempio 'map1' (nella parte inferiore delle proprietà dell'oggetto)

  2. Su ciascuna mappa dipendente, aggiungi un'espressione a ciascuno dei valori di estensione:

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

Il codice otterrà le variabili per l'elemento del compositore 'map1', ne trarrà l'estensione come geometria e infine il suo valore x_min dalla geometria. Modificare x_min in y_min, x_max e y_max di conseguenza.

L'unico inconveniente è che è necessario aggiornare le mappe dipendenti ogni volta che si sposta la mappa principale. All'esportazione dovrebbe comunque aggiornarsi automaticamente.


Quale versione di QGIS stai usando? Ho provato in 3.0.2 senza successo
aldo_tapia il

@aldo_tapia QGIS 3.0.3 su Ubuntu 16.04
leak_my_brain

Strano, non riesco a farlo funzionare ... Ma votato!
aldo_tapia,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.