Sincronizando visualizações no QGIS print compositor?

10

Encontrei uma pergunta muito semelhante ao meu problema: Como vincular quadros de dados no ArcGIS ou QGIS? . Mas a solução para o QGIS não funciona agora (o plug-in Dual View não está mais disponível).

Quero sincronizar três visualizações:

insira a descrição da imagem aqui

A idéia é mover as três visualizações de mapa ao mesmo tempo com um mapa mestre no QGIS print compositor.

Existe uma maneira ou plug-in de fazer isso?

aldo_tapia
fonte

Respostas:

2

Outra solução elegante "sem código" para a sincronização de mapas do compositor usa o mecanismo "Visão geral" do QGIS:

insira a descrição da imagem aqui

Portanto, adicionamos uma visão geral do "Quadro do mapa principal" a todas as janelas do mapa, que devem ser sincronizadas com o mapa principal. Em seguida, definimos o estilo do quadro como Sem pincel / Sem caneta e ativamos "Centralizar na visão geral".

Para corrigir a escala do mapa filho, inserimos um valor de Expressão: insira a descrição da imagem aqui

Isso é tudo.

Muito fácil e muito dinâmico!

Christoph
fonte
Ótimo! Tão simples ... excelente
solução
4

A única maneira que encontrei neste momento para criar um pequeno script em python, talvez isso possa migrar para um plug-in, mas não tenho experiência nisso.

É um código realmente básico, selecionando o compositor e os mapas certos:

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

Outra opção seria manter a escala inicial nos mapas escravos para definir a nova extensão se os mapas tiverem formas diferentes, mas no meu caso pessoal com esse código foi suficiente:

insira a descrição da imagem aqui

Estou aberto para melhorar esta solução (quase não tenho experiência com PyQGIS).


Lidar com diferentes extensões e escalas

O código acima funciona muito bem com a mesma extensão (e consequentemente, forma) e escala. Agora eu tenho um código aprimorado testado com diferentes extensões, formas e escalas:

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 o teste resultante:

insira a descrição da imagem aqui

aldo_tapia
fonte
Não se esqueça de aceitar a sua resposta clicando no sinal verde-desbotada no lado da mão esquerda para mostrar o seu problema foi resolvido :)
Joseph
1
@ Joseph obrigado, mas está meio resolvido. Aceitarei minha própria resposta após converter isso em um plug-in para fornecer uma solução completa. Ainda um desafio para mim
aldo_tapia
2

Apenas uma pequena dica para fazer isso sem código. É menos eficiente do que a resposta de Aldo, mas, no final, ele resolve o problema se for para fazer um mapa final. Você também não precisa ter uma visualização principal; é a extensão da tela do mapa que conta:

  1. Mova o mapa A como desejar (será o mapa principal)
  2. Clique em "Visualizar extensão na tela do mapa"
  3. Mudar para o mapa B
  4. Clique em "Definir para mapear a extensão da tela"
  5. Mudar para o mapa C
  6. Clique em "Definir para mapear a extensão da tela"

etc.

visualização / extensão da tela do mapa

Quando você precisar que outro mapa seja mestre, basta clicar no outro mapa e depois em "visualizar extensão na tela do mapa" antes de definir os outros.

Se desejar manter uma visão específica para mais tarde, recomendo que você use o painel de favoritos Espaciais. Defina a tela do mapa para uma extensão escolhida e clique em Definir para mapear a tela em cada escravo necessário :)

gisnside
fonte
Sim, eu costumava fazer dessa maneira. É uma ótima opção, mas escalas em mapa B e C sempre mudança, por isso há mais duas etapas
aldo_tapia
boa resposta de vocês, eu preciso experimentá-lo ^^
gisnside
2

Acabei de ter o mesmo problema e consegui o resultado desejado usando expressões nos mapas dependentes. Isso pressupõe que todos os mapas tenham as mesmas dimensões no layout.

  1. Dê ao seu mapa mestre um ID do item, por exemplo, 'map1' (na parte inferior das propriedades do item)

  2. Em cada mapa dependente, adicione uma expressão a cada um dos valores de extensão:

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

O código obterá as variáveis ​​para o item do compositor 'map1', obterá a extensão como geometria e, finalmente, obterá o valor x_min da geometria. Altere x_min para y_min, x_max e y_max de acordo.

A única desvantagem é que você precisa atualizar os mapas dependentes cada vez que moveu o mapa mestre. Na exportação, ele deve ser atualizado automaticamente.

leak_my_brain
fonte
Qual versão do QGIS você está usando? Tentei em 3.0.2, sem sucesso
aldo_tapia
@aldo_tapia QGIS 3.0.3 no Ubuntu 16.04
leak_my_brain
Estranho, eu não posso fazê-lo funcionar ... Mas votado!
Aldo_tapia