#1 Fri 23 December 2022 09:03
- laurent00
- Participant assidu
- Date d'inscription: 6 Aug 2007
- Messages: 404
QGIS: Carte Atlas sur une page
bonjour
je souhaite réaliser un atlas de 364 monuments, ils sont petits et donc j'aimerais en disposer 9 par page.
comment est-ce possible ?
merci LJ
Hors ligne
#2 Fri 23 December 2022 12:25
- Tixi
- Participant actif
- Date d'inscription: 6 Jun 2022
- Messages: 128
Re: QGIS: Carte Atlas sur une page
Question tres interessante, impossible que personne n'ait eu ce probleme avant.
Il est evident qu en mettant neuf cartes conduites par l atlas , elle seront toutes centrees sur la meme entite.
Une solution serait de separer les 364 monuments en 9 couches d'une quarantaine d'entites, ca doit marcher. Mais il doit y avoir mieux.
J ai pense a une autre solution qui utilise l extention de la carte : Xmin, Y min, X max Y max. Il faudrait recuperer les coordonnees du centroid de l entite N+1 de l atlas et y ajouter quelques metres, decametres ou hectometres pour avoir Xmax, en retrancher autant pour avoir X min. Pareil pour Y. et ce , pour les entites N+1 a N+8.
Je n ai pas encore reussi a le faire.
Par contre, il resterait un probleme, pour que la premiere carte ne passe pas, a la seconde iteration, a l entite 2 mais a l entite 10, puisque l entite 2 serait deja sur la carte 2 de la premiere iteration. Cela dit, ce probleme doit etre solutionnable d une maniere ou d une autre.
Hors ligne
#3 Fri 23 December 2022 14:42
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 995
Re: QGIS: Carte Atlas sur une page
Il me semble que la solution est donnée ici :
https://gis.stackexchange.com/questions … atlas-page
Avec des expressions pour controler l'emprise (extent) des cartes, basées sur "@atlas_featureid" + 1 à N selon la position de la carte (ex. : "@atlas_featureid + 5" pour la 5 carte de la page.
Code:
with_variable( 'h', bounds_width( map_get(item_variables('map1'),'map_extent')), y(geometry(get_feature_by_id( @atlas_layername, @atlas_featureid + 1 )))-@h/2)
Sylvain M.
Hors ligne
#4 Sat 24 December 2022 13:03
- laurent00
- Participant assidu
- Date d'inscription: 6 Aug 2007
- Messages: 404
Re: QGIS: Carte Atlas sur une page
Merci
je pense avoir mis les formules correctes sur ma 'carte 2', comme ceci, en changeant le nom de la carte et pour les xymax -> + au lieu de -
mais cela ne semble pas marcher, pas sur de comprendre les w et h ?
les formules semblent fonctionner mais me ramènent les même que la Carte 1 !?
Code:
xmin -> with_variable( 'w', bounds_width( map_get(item_variables('Carte 1'),'map_extent')), x(geometry(get_feature_by_id( @atlas_layername, @atlas_featureid + 1 )))-@w/2) ymin -> with_variable( 'h', bounds_width( map_get(item_variables('Carte 1'),'map_extent')), y(geometry(get_feature_by_id( @atlas_layername, @atlas_featureid + 1 )))-@h/2) xmax -> with_variable( 'w', bounds_width( map_get(item_variables('Carte 1'),'map_extent')), x(geometry(get_feature_by_id( @atlas_layername, @atlas_featureid + 1 )))+@w/2) ymax -> with_variable( 'h', bounds_width( map_get(item_variables('Carte 1'),'map_extent')), y(geometry(get_feature_by_id( @atlas_layername, @atlas_featureid + 1 )))+@h/2)
Dernière modification par laurent00 (Sat 24 December 2022 13:09)
Hors ligne
#5 Sat 24 December 2022 14:58
- Tixi
- Participant actif
- Date d'inscription: 6 Jun 2022
- Messages: 128
Re: QGIS: Carte Atlas sur une page
Chez moi, ca marche, avec une modification : 'Carte 1' s'appelle 'Map 1' car j ai une version anglaise du logiciel je suppose. Il faut que le nom de votre carte soit bien le bon. Vous pouvez double cliquer sur le nom dans la liste des elements pour le changer si besoin.
Hors ligne
#6 Sat 24 December 2022 15:38
- laurent00
- Participant assidu
- Date d'inscription: 6 Aug 2007
- Messages: 404
Re: QGIS: Carte Atlas sur une page
je suis passé sur une dénomination map1 et map2 et cela semble fonctionner
sauf que les coordonnées ramenées sont x 100 000 et du coup ne s'affichent pas, si je multiplie les formules par 100 000, d'une part elles sont arrondies et donc perdent en précision et en plus l'échelle est très réduite !?
je pense qu'il y a un souci avec ma configuration de projet, je suis sur un SCR WGS 84 EPSG 4326 QGIS version 3.22
aussi je zoom assez fortement sur des images satellites 1/300
LJ
Dernière modification par laurent00 (Sat 24 December 2022 15:39)
Hors ligne
#7 Sat 24 December 2022 15:45
- laurent00
- Participant assidu
- Date d'inscription: 6 Aug 2007
- Messages: 404
Re: QGIS: Carte Atlas sur une page
4326 est une projection degré
est-il possible qu'il faille passer par une projection métrique ?
effectivement cela fonctionne maintenant, les fonctions appelées nécessitent donc une projection métrique !
LJ
Dernière modification par laurent00 (Sat 24 December 2022 15:49)
Hors ligne
#8 Sat 24 December 2022 15:56
- laurent00
- Participant assidu
- Date d'inscription: 6 Aug 2007
- Messages: 404
Re: QGIS: Carte Atlas sur une page
malheureusement lorsque je change de page dans mon atlas,
il recommence la page au id : 2 au lieu du 3 !?
une idée ?
LJ
Hors ligne
#9 Sat 24 December 2022 17:20
- laurent00
- Participant assidu
- Date d'inscription: 6 Aug 2007
- Messages: 404
Re: QGIS: Carte Atlas sur une page
malheureusement lorsque je change de page dans mon atlas,
il recommence la page au id : 2 au lieu du 3 !?
peut être qu'il y a plus propre, mais j'ai créé une colonne "pages_catalogue" dans ma couche de base et attribué un numéro de page au id qui convient pour que la page commence par ce id,
ensuite dans l'atlas je filtre sur
"page_catalogue" IS NOT NULL
ça va car j'ai 364 entités et 18 miniatures par page
LJ
Dernière modification par laurent00 (Sat 24 December 2022 17:21)
Hors ligne
#10 Sat 24 December 2022 17:49
- Tixi
- Participant actif
- Date d'inscription: 6 Jun 2022
- Messages: 128
Re: QGIS: Carte Atlas sur une page
Oui, si ca marche, c'est bien.
Sinon, j'avais pense a filtrer par
$id % 9 = 0
(le reste de la division par neuf est nul)
Mais du coup, je me demande si ca s applique a toutes les cartes ou seulement a la carte de reference c est a dire la carte 1 par defaut, voir le 1er des 4 onglets (appele Layout chez moi, disposition ou mise en page probablement chez vous)
Hors ligne
#11 Sat 24 December 2022 19:32
- laurent00
- Participant assidu
- Date d'inscription: 6 Aug 2007
- Messages: 404
Re: QGIS: Carte Atlas sur une page
oui tout fonctionne
seul soucis sur la dernière page toutes les cartes apparaissent identiques, elles se répètent à la suite du dernier id
comment leur dire de ne pas s'afficher ?
LJ
Hors ligne
#12 Sun 25 December 2022 11:48
- Tixi
- Participant actif
- Date d'inscription: 6 Jun 2022
- Messages: 128
Re: QGIS: Carte Atlas sur une page
Pour ne pas afficher les cartes, il faut aller tout en bas de l onglet des propriétés de la carte, dans le menu "Rendu". C est l avant dernier normalement, le dernier étant "Variables"
La il y a une case a cocher : Exclure de l export. Il faut la cocher et mettre une règle du genre
if ("id" = 364,'1','0')
Si l'id est 364, exclure de l export, sinon, ne rien faire.
En espérant que l id de vos monument soit de 1 a 364, sinon il faut adapter la valeur et/ou le champ. Comme l’étendue des cartes est conduite par des règles contenant des N+1, N+2 ..., peut être vous faudra t il du > 364 au lieu de = 364
je crois que 1 est pour exclure de l export, je n ai pas fait le test. Sinon, il faut inverser le 1 et le 0
Il faut mettre cette règle sur vos cartes, sauf celle qui montre le dernier monument.
Les cartes seront cachées de l export, mais pas du composeur, logique, sinon vous ne pourriez plus les sélectionner pour les modifier.
Joyeux Noel
Hors ligne
#13 Sun 25 December 2022 21:59
- laurent00
- Participant assidu
- Date d'inscription: 6 Aug 2007
- Messages: 404
Re: QGIS: Carte Atlas sur une page
merci cela fonctionne avec la formule suivante
Code:
if("fid" + 23 > 365, 1,0)
il faut effectivement ajouter à chaque carte id + n° de la carte comme dans les formules d'emprise qui appelle
Code:
@atlas_featureid + 23
sur chaque carte
du coup 1 = non et 0 = oui
LJ
Dernière modification par laurent00 (Sun 25 December 2022 22:00)
Hors ligne
#14 Mon 26 December 2022 09:54
- laurent00
- Participant assidu
- Date d'inscription: 6 Aug 2007
- Messages: 404
Re: QGIS: Carte Atlas sur une page
dernier élément a priori cela n'est pas reproductible en l'état dans un rapport.
la boite générer un atlas est différent de éditer un rapport !?
la solution aussi avec le rendu et la formule marche également if("fid" + 23 > 365, 1,0) marche aussi avec la partie opacité if("fid" + 23 > 365, 0,100), attention pas avec tous les modes de fusion !
aussi il n'est pas possible avec cette solution d'appeler les données attachées à chaque miniature, seulement celles de la première miniature de chaque page d'atlas
résultat ici -> https://www.researchgate.net/profile/La … UpdatesLog
LJ
Dernière modification par laurent00 (Tue 27 December 2022 14:54)
Hors ligne
#15 Tue 27 December 2022 20:04
- laurent00
- Participant assidu
- Date d'inscription: 6 Aug 2007
- Messages: 404
Re: QGIS: Carte Atlas sur une page
je crois qu'il serait intéressant de trouver ou développer un atlas qui permettent de faire des atlas de miniatures genre catalogue
peut être avec le développement à venir des rapports qui me semble encore limité
LJ
Hors ligne
#16 Tue 03 January 2023 15:23
- loicbcn
- Participant occasionnel
- Date d'inscription: 22 Jan 2018
- Messages: 26
Re: QGIS: Carte Atlas sur une page
Bonjour,
En créant une nouvelle couche attributaire pour gérer l'atlas, avec un enregistrement pour chaque page, et 9 champs contenant les emprises de chaque carte de la page sous forme de tableau (array) [minX,minY,maxX,maxY], il doit être possible d'obtenir 9 vignettes par page.
Restera à gérer la dernière page, car 364 n'est pas divisible par 9. donc, 4 vignettes de cette dernière page n'auront pas d'emprise pour afficher de contenu.
Hors ligne
#17 Wed 04 January 2023 13:06
- loicbcn
- Participant occasionnel
- Date d'inscription: 22 Jan 2018
- Messages: 26
Re: QGIS: Carte Atlas sur une page
Pour développer un peu le message précédent,
On peut générer une table de ce type, avec une ligne par page de l'atlas ... Ici, il y aura 4 éléments par page.
|line|elem1|elem2|elem3|elem4|
|----|-----|-----|-----|-----|
|1 |json |json |json |json |
|2 |json |json |json |json |
|3 |json |json |json |json |
...
Et on stocke dans du json les données de chaque entité à cartographier, le nom de l'entité et l'emprise par exemple (ici, les points représentent des communes (chefs lieux d'admin express)).
{"nom":"Mairie de Brive-la-Gaillarde","emprise":[583824.3,6451231.3,585824.3,6453231.3]}
{"nom":"Mairie de Muret","emprise":[563845.4,6262917.8,565845.4,6264917.8]}
...
L'atlas peut être généré en utilisant cette table comme couche de couverture, puis dans les emprises (min X, min Y, max X, max Y) on peut saisir:
from_json("elem1")['emprise'][0]
from_json("elem1")['emprise'][1]
from_json("elem1")['emprise'][2]
from_json("elem1")['emprise'][3]
Pour la première carte de la page,
from_json("elem2")['emprise'][0]
...
Pour la 2ème carte, etc...
ça fait un peu de saisie, mais pour une seule page.
Et si on veut que chaque com de commune apparaisse au dessus de chaque carte, on peut mettre une étiquette avec comme valeur:
[%from_json( "elem1" )['nom']%] ...
Pour la dernière page qui peut contenir moins de 4 éléments, on peut jouer sur l'option "rendu" dans les propriétés de l'objet dans le composer.
en donnant cette valeur à l'opacité: case when "elem1" is null then 0 else 100 end
Finalement, le plus compliqué, c'est de générer cette table.
J'ai généré celle de cet exemple avec le dbmanager de QGIS (couches virtuelles) avec cette requête sur une table nommée "prefs_r76" issue des chefs lieux d'admin express, pour des pages contenant 4 éléments ... il faut la modifier si on veut + ou - d' éléments / page.
Code:
with datas as ( select p.*, cast(ceil(cast(ROW_NUMBER() OVER () as float) / 4) as int) page, (ROW_NUMBER() OVER ())%4 +1 idcarte, json_object('nom', nom_chf, 'emprise', json_array( xmin(st_buffer(geometry, 1000)), ymin(st_buffer(geometry, 1000)), xmax(st_buffer(geometry, 1000)), ymax(st_buffer(geometry, 1000)))) as jsondata from prefs_r76 p order by page, idcarte ) select page, max(case when idcarte = 1 then jsondata end) elem1, max(case when idcarte = 2 then jsondata end) elem2, max(case when idcarte = 3 then jsondata end) elem3, max(case when idcarte = 4 then jsondata end) elem4 from datas group by page
Voilà. C'est un peu long, et plus on veut d'éléments / page, plus ce sera long, mais ça fonctionne.
Dernière modification par loicbcn (Wed 04 January 2023 16:08)
Hors ligne
#18 Fri 06 January 2023 20:40
- laurent00
- Participant assidu
- Date d'inscription: 6 Aug 2007
- Messages: 404
Re: QGIS: Carte Atlas sur une page
merci je testerai aussi
LJ
Hors ligne