EN | PT
Para não variar, a nova versão do QGIS (o QGIS 2.6 Brigthon) traz um conjunto alargado de novas funcionalidades que permitem ao utilizador fazer mais, melhor e mais rápido do que com a versão anterior. Uma das novidades desta versão é a possibilidade de controlar algumas propriedades dos itens do compositor através de dados (por exemplo, o tamanho e a posição). Algo que abre a porta a aplicações bastante interessantes. Nos próximos artigos, proponho-me a mostrar como criar séries de mapas com multiplos formatos.
Neste primeiro artigo, o objectivo é que, mantendo o tamanho da folha, o mapa seja criado com a orientação (paisagem ou retrato) que melhor se adapte à forma do elemento do atlas. Para exemplificar, usei a amostra de dados do Alaska para criar um mapa de cada uma das regiões do Alaska.
Em primeiro lugar comecei por criar o meu layout numa dos formatos, colocando vários itens nas posições que desejava.
Para controlar a orientação da folha através do atlas, fui ao separador “Composição” e na opção orientação, usei no botão propriedades definidos por dados a seguinte expressão:
CASE WHEN bounds_width( $atlasgeometry ) >= bounds_height( $atlasgeometry ) THEN 'landscape' ELSE 'portrait' END
Usando a opção de pré-visualização do atlas, podemos verificar que a orientação da folha já muda de acordo com a forma do elemento do atlas. No entanto, os itens não acompanham essa mudança e alguns ficam até fora da área de impressão.
Para controlar o tamanho e posição dos itens do mapa tive em consideração o tamanho de uma folha A4 (297 x 210 mm), as dimensões das margens do mapa ( 20 mm, 5 mm, 10 mm, 5 mm) e os pontos de referência dos itens.
No caso do item “mapa”, usando como ponto de referência o canto superior esquerdo, foi necessário alterar a sua altura e largura. Sabia que a altura do item era é subtracção do tamanho das margens superiores e inferiores (30 mm) da altura folha por isso a expressão a usar foi:
(CASE WHEN bounds_width( $atlasgeometry ) >= bounds_height( $atlasgeometry) THEN 297 ELSE 210 END) - 30
De forma análoga, a expressão a usar para a largura foi:
(CASE WHEN bounds_width( $atlasgeometry ) >= bounds_height( $atlasgeometry) THEN 210 ELSE 297 END) - 10
Os restantes itens ocupavam sempre uma posição relativa na folha sem que fosse necessário alterar o seu tamanho e por isso tinha apenas de controlar a sua posição. Por exemplo, o título encontrava-se centrado no topo da folha, e portanto, usando como ponto de referência o topo-centro, bastou definir a seguinte expressão para a posição X:
(CASE WHEN bounds_width( $atlasgeometry ) >= bounds_height( $atlasgeometry) THEN 297 ELSE 210 END) / 2.0
Já a legenda exige alterar a posição em X e em Y. Usando como ponto de referência o canto inferior direito, a expressão para a posição em X foi:
(CASE WHEN bounds_width( $atlasgeometry ) >= bounds_height( $atlasgeometry) THEN 297 ELSE 210 END) - 7
E para a posição em Y:
(CASE WHEN bounds_width( $atlasgeometry ) >= bounds_height( $atlasgeometry) THEN 210 ELSE 297 END) - 12
Para os restantes itens (rosa dos ventos, escala gráfica e texto no canto inferior esquerdo), as expressões a usar eram em tudo similares às já apresentadas, e, após definidas em cada um dos itens, fiquei com o layout preparado para se adaptar às duas orientações da folha.
Depois disso, a impressão/exportação de todos os (25) mapas ficou à distância de um só clique.
No próximo artigo da série, procurarei explicar como criar séries de mapas em que seja o tamanho da folha a adaptar-se de forma a manter uma escala constante.
Parabéns pelo excelente trabalho
Thanks for your tutorial !
Just updated to QGIS 2.6 on Linux Debian Wheezy and tried to control the page orientation from the atlas as you said. Used the first expression of your tutorial but the orientation remains the same between my pages in atlas preview. Don’t understand why. When I change the order of landscape and portrait in the expression it sets the other one, but again for all pages. Very strange isn’t it ? It seems QGIS didn’t take into account the atlasgeometry of each feature.
This probably means that the CASE condition is never meet for your geometries and therefore you are always stuck with the ELSE result. I would advice you use the labeling properties of the atlas layer to understand the results of bounds_width( $geometry ) and bounds_height( $geometry ).
Notice that I have changed $atlasgeometry to $geometry otherwise you would have only one valid result (the current atlas feature in preview).
Good luck.
OK with another vector layer it works. Don’t understand why it doesn’t work with the first one. Perhaps because I created the original project with QGIS 2.4. Doesn’t matter if it works with all my future project. Thanks again for tutorial and for english version cause I didn’t speak portuguese 🙂
Uhm that is weird. Check If you have any invalid geometries on the first layer or if there is some problem with the CRS.
I’m glad the post is useful for others, that was the idea.