1 votos

Cómo centrar todos los compositores de QGIS en el lienzo del mapa principal

Tengo un proyecto de plantilla que se utilizará para muchos sitios futuros y quiero centrar automáticamente todos los mapas de diseño del compositor en el mismo centro que el lienzo principal. Idealmente, esto se haría como parte de un modelo de procesamiento. He intentado usar una expresión para los límites de los mapas de diseño pero no veo ninguna propiedad de lienzo con la que trabajar. Podría usar una sola característica en una configuración de atlas, pero eso añade complicaciones que realmente no quiero.

0 votos

¿Cuándo debería ocurrir este centrado? ¿Cada vez que muevas el lienzo? ¿Una vez que abras un diseño?

0 votos

Antes de exportar los mapas, lo cual también me gustaría hacer utilizando el modelador gráfico

0 votos

Por lo que sé, no hay solución para obtener la extensión de la vista actual del lienzo de QGIS. Lo que podrías hacer es definir una variable de proyecto que será utilizada por tu diseño y que podrás modificar. ¿Te serviría @Sethinacan?

2voto

Mihai Todor Puntos 73

Principios

Cada mapa en cada diseño tiene en propiedad escalas de extensión y la posibilidad de establecer la extensión basada en el atlas.

enter image description here

Lo que quieres hacer no es un atlas, sino una extensión basada en datos.

Paso a paso

  1. Copia la extensión de tu lienzo actual : enter image description here
  2. Crea la variable para almacenar tu extensión. Haz clic en el + y nombra la variable canvas_extent llénala con lo que has copiado antes.

enter image description here

  1. Configura la extensión X min basándote en los datos, la expresión debería ser: array_get(string_to_array(replace (@canvas_extent, array(',',' : '), array (',',','))),0).

enter image description here

  1. Para Y mín será array_get(string_to_array(replace (@canvas_extent, array(',',' : '), array (',',','))),1), para X máx será array_get(string_to_array(replace (@canvas_extent, array(',',' : '), array (',',','))),2) y para Y máx será array_get(string_to_array(replace (@canvas_extent, array(',',' : '), array (',',','))),3)

Repite los pasos para cada diseño que tengas.

Cuando cambies el valor de tu variable canvas_extent se actualizará la extensión del diseño.

0 votos

Lo que he hecho es similar, pero añadí una variable para el centro y luego utilicé expresiones para calcular las extensiones, lo que permite mapas a diferentes escalas.

0 votos

Desafortunadamente, los diseños no se actualizan automáticamente

0voto

David Galt Puntos 93

Puedes copiar esto en la Consola de Python y debería funcionar:

extent = iface.mapCanvas().extent()
project = QgsProject.instance()
projectLayoutManager = project.layoutManager()
layouts = projectLayoutManager.layouts()
for layout in layouts:
    for item in layout.items():
        if isinstance(item, QgsLayoutItemMap):
            scale = item.scale()
            size = item.sizeWithUnits()
            item.setExtent(extent)
            item.setScale(scale)
            item.attemptResize(size)
            item.refresh()

0 votos

Es una buena respuesta, pero en mi caso tengo mapas a diferentes escalas, por lo que necesito trabajar con un centro

0 votos

OK, editado. Casi la misma respuesta que antes, pero obtienes la escala antes de cambiar la extensión y luego vuelves a establecer la escala.

0 votos

... y corregí el cambio de tamaño del elemento de diseño que ocurre. Estoy seguro de que tiene que haber una forma más sencilla de hacer esto, pero el código anterior funciona.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X