Sincronización de vistas en QGIS print composer?


10

Encontré una pregunta muy similar a mi problema: ¿Cómo vincular marcos de datos en ArcGIS o QGIS? . Pero la solución para QGIS no funciona ahora (el complemento Dual View ya no está disponible).

Quiero sincronizar tres vistas:

ingrese la descripción de la imagen aquí

La idea es mover las tres vistas de mapa al mismo tiempo con un mapa maestro en QGIS print composer.

¿Hay alguna forma o complemento para hacer esto?

Respuestas:


2

Otra solución elegante "sin código" para la sincronización de mapas de compositor utiliza el mecanismo integrado "Descripción general" de QGIS:

ingrese la descripción de la imagen aquí

Por lo tanto, agregamos un resumen del "Marco del mapa maestro" a cada ventana del mapa, que debe sincronizarse con el mapa maestro. Luego establecemos el estilo del marco en Sin pincel / Sin lápiz y habilitamos "Centrar en la vista general".

Para arreglar la escala del mapa secundario, ingresamos un valor de Expresión: ingrese la descripción de la imagen aquí

Eso es todo.

¡Muy fácil y muy dinámico!


¡Excelente! Tan simple ... excelente trabajo
aldo_tapia

4

La única forma que encontré en este momento es crear un pequeño script en Python, tal vez esto podría migrar a un complemento, pero no tengo experiencia en eso.

Es un código realmente básico, seleccionando el compositor y los mapas correctos:

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

Otra opción sería mantener la escala inicial en los mapas esclavos para establecer después de la nueva extensión si los mapas tienen diferentes formas, pero en mi caso personal con este código fue suficiente:

ingrese la descripción de la imagen aquí

Estoy abierto a mejorar esta solución (casi no tengo experiencia PyQGIS).


Tratar con diferentes extensiones y escalas

El código anterior funciona muy bien con la misma extensión (y, en consecuencia, forma) y escala. Ahora tengo un código mejorado probado con diferentes extensiones, formas y 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)

Y la prueba resultante:

ingrese la descripción de la imagen aquí


No olvide aceptar su respuesta haciendo clic en la marca de color verde descolorido en el lado izquierdo para mostrar que su problema se ha resuelto :)
Joseph

1
@Joseph gracias, pero está medio resuelto. Aceptaré mi propia respuesta después de convertir esto en un complemento para proporcionar una solución completa. Sigue siendo un desafío para mí
aldo_tapia

2

Solo un pequeño consejo para hacerlo sin código. Es menos eficiente que la respuesta de aldo, pero al final es el truco si es para hacer un mapa final. Tampoco necesita tener una vista maestra, lo que cuenta es la extensión del lienzo del mapa:

  1. Mueva el mapa A como desee (será el mapa maestro)
  2. Haga clic en "Ver extensión en el lienzo del mapa"
  3. Cambiar al mapa B
  4. Haga clic en "Establecer para ampliar la extensión del lienzo"
  5. Cambiar al mapa C
  6. Haga clic en "Establecer para ampliar la extensión del lienzo"

etc.

vista / extensión del lienzo del mapa

Cuando necesite otro mapa para ser un maestro, simplemente haga clic en el otro mapa y luego "vea la extensión en el lienzo del mapa" antes de configurar los demás.

Si desea mantener una vista específica para más adelante, le recomiendo que use el panel de marcadores espaciales. Establezca el lienzo del mapa en la extensión elegida y luego haga clic en Establecer para el lienzo del mapa en cada esclavo que necesite :)


Sí, solía hacerlo de esta manera. Es una gran opción, pero las escalas en el mapa B y C siempre cambian, por lo que hay dos pasos más
aldo_tapia

buena respuesta tuya, necesito probarlo ^^
gisnside

2

Simplemente tuve el mismo problema y pude obtener el resultado deseado usando expresiones en los mapas dependientes. Esto supone que todos los mapas tienen las mismas dimensiones en el diseño.

  1. Dele a su mapa maestro una ID de elemento, por ejemplo, 'mapa1' (en la parte inferior de las propiedades del elemento)

  2. En cada mapa dependiente, agregue una expresión a cada uno de los valores de extensión:

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

El código obtendrá las variables para el elemento del compositor 'map1', obtendrá la extensión como geometría de él y finalmente obtendrá su valor x_min de la geometría. Cambie x_min a y_min, x_max e y_max en consecuencia.

El único inconveniente es que necesita actualizar los mapas dependientes cada vez que mueve el mapa maestro. Sin embargo, al exportar debería actualizarse automáticamente.


¿Qué versión de QGIS estás usando? Lo intenté en 3.0.2 sin éxito
aldo_tapia

@aldo_tapia QGIS 3.0.3 en Ubuntu 16.04
leak_my_brain

Extraño, no puedo hacerlo correr ... ¡Pero voté!
aldo_tapia
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.