1 votos

QGIS+PostGIS establece extensiones de atlas para incluir características y puntos del atlas

Tengo un diseño de impresión de QGIS con una capa de atlas para la que me gustaría que la extensión del mapa mostrara la característica actual del atlas y un punto cercano. El proveedor de la capa es postgis.

Parece que la única manera de hacer esto es proporcionar por separado el xmin,xmax,ymin,ymax a través de expresión a qgis. También he descubierto que se comporta de forma extraña si la relación de aspecto del cuadro delimitador es diferente que el elemento de mapa así que tengo que tener en cuenta que también.

Lo que he probado hasta ahora:

Obtener un cuadro delimitador de PostGIS escalado en un 10% de altura

SELECT t.territory,
 st_expand(t.bbox, ((st_ymax((t.bbox)) - st_ymin((t.bbox))) * (0.1))) AS geom
FROM
 (SELECT
   parcellayer.id,
   st_envelope(st_union(parcellayer.geom, 
    (SELECT pointlayer.geom FROM pointlayer LIMIT 1))
   ) AS bbox 
 FROM parcellayer) t;

esto me da una caja pero necesito asegurarme de que tiene la misma relación de aspecto (2:1) Puedo hacer un montón de complicadas declaraciones de caso, pero ¿hay una manera más fácil de hacer esto?

1voto

user52245 Puntos 16

Esta es la respuesta que se me ocurrió:

(Esperaré a aceptar esta respuesta hasta que expire la recompensa por si a alguien se le ocurre algo mejor)

En POSTGIS:

SELECT 
 t.id,
 st_centroid(t.bbox) as geom,
 greatest(
  (st_xmax(t.bbox) - st_xmin(t.bbox))*0.5,
  st_ymax(t.bbox) - st_ymin(t.bbox)
  ) as radius
FROM
 (SELECT
   parcellayer.id,
   st_envelope(st_union(parcellayer.geom, 
    (SELECT pointlayer.geom FROM pointlayer LIMIT 1))
   ) AS bbox
 FROM parcellayer) t;

Esto produce un punto en el centro del cuadro delimitador combinado, así como un valor de "radio" que es la altura del cuadro delimitador (si el cuadro es más alto que ancho) o la mitad de la anchura (si el cuadro es más ancho que alto).

en QGIS podemos asignar nuestras extensiones de la siguiente manera:

xmin:

xmin(
 geometry(get_feature(
   'FrontMapExtents','thislayercolumnname',"atlaslayercolumnname" 
   )))
-
attribute(
 get_feature(
  'FrontMapExtents','thislayercolumnname',"atlaslayercolumnname" 
  ),
  'radius'
)

xmax: lo mismo pero cambia a 'xmax()' y suma el radio en vez de restarlo.

ymin:

xmin(
 geometry(get_feature(
   'FrontMapExtents','thislayercolumnname',"atlaslayercolumnname" 
   )))
-
attribute(
 get_feature(
  'FrontMapExtents','thislayercolumnname',"atlaslayercolumnname" 
  ),
  'radius'
) * 0.5

básicamente lo mismo pero *0,5 ya que la caja es la mitad de alta que de ancha.

ymax: lo mismo pero cambia a 'ymax()' y suma el radio en vez de restarlo.

Una buena ventaja de este método es que puedes añadir un multiplicador al valor del radio para añadir un % de búfer alrededor de las características.

0voto

mathieu Puntos 53

Si lo he entendido bien, quieres un lienzo con dos elementos de mapa, uno que muestre las características combinadas de dos capas y otro que muestre un mapa detallado de las características de una de las capas.

Pruebe a utilizar un Capa de cobertura con su combo BBOX cubriendo cada par de características, y establezca la extensión del mapa detallado de características a un margen específico del elemento de mapa (utilizando Variables | @map_extent_height & @map_extent_width ):

  • Obtener el BBOX de sus características combinadas y el alcance de la parcela actual en una Capa de cobertura (asegúrese de ocultarlo en el Atlas opciones):

    SELECT  ST_XMin(a.geom),
            ST_XMax(a.geom),
            ST_YMin(a.geom),
            ST_YMax(a.geom),
            ST_Envelope(ST_Collect(a.geom, b.geom)) AS geom
    FROM    parcellayer AS a,
            pointlayer AS b
    ;
  • Establecer extensiones del mapa de detalle ( incrementado por ej. 0.05 (5%) ):

    "st_xmin" - (  sqrt( @map_extent_width ^ 2 + @map_extent_height ^ 2 ) * 0.05 )
    "st_ymin" - (  sqrt( @map_extent_width ^ 2 + @map_extent_height ^ 2 ) * 0.05 )
    "st_xmax" + (  sqrt( @map_extent_width ^ 2 + @map_extent_height ^ 2 ) * 0.05 )
    "st_ymax" + (  sqrt( @map_extent_width ^ 2 + @map_extent_height ^ 2 ) * 0.05 )

Ahora, para mí esto funcionó de maravilla en un montón de casos de prueba. No puedo reproducir ningún comportamiento extraño con la escala de los elementos del mapa; sin embargo, si encuentra alguno, establecer la extensión explícitamente también para el mapa combinado podría funcionar.

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