Rencontres des Utilisateurs Francophones de QGIS
Grenoble - 27/03/2024
Julien Cabieces / Jacky Volpes
![]() |
Julien Cabieces Developpeur C++/Python QGIS Core committer |
Jacky Volpes Developpeur C++/Python Contributeur cœur QGIS & Plugins |
![]() |
On ne parlera pas de la symbologie des raster 😢
AND "ffo_bat_usage_niveau_1_txt" = 'Résidentiel collectif'
Ce trucage a été réalisé par des professionnels ... sans QGIS
Les étiquettes des polygones doivent masquer la partie noire des lignes
Le symbole Jet doit masquer la partie noire des lignes
![]() | ➡️ | ![]() |
...mais a quelques faiblesses/fragilités/limitations:
Cela pourrait être grandement amélioré 💸
Correction : Projet avec tous les symboles
Dans la section Symbologie des paramètres de couche.
overlay_nearest
permet de récupérer les entités d'une autre couche les plus proches d'une géométrie donnée.
Sur la couche points mesures, entrer cette expression comme géométrie générée
shortest_line(
$geometry,
overlay_nearest('routes', $geometry, limit:=1, max_distance:=50)[0]
)
On crée la ligne entre notre point et la première entité la plus proche de la couche routes.
On agrandit cette ligne sur 20 mètres, et on garde l'intersection avec l'entité la plus proche de la couche routes.
intersection(
extend(
shortest_line(
$geometry,
overlay_nearest('routes', $geometry, limit:=1, max_distance:=50)[0]
),
0, -- pas d'extension côté début
20 -- 20m d'extension côté fin
),
overlay_nearest('routes', $geometry, limit:=1, max_distance:=50)[0]
)
On peut étendre un peu ce symbole de part et d'autre pour donner un aspect "mesure de section".
extend(
intersection(
extend(
shortest_line(
$geometry,
overlay_nearest('routes', $geometry, limit:=1, max_distance:=50)[0]
),
0, -- pas d'extension côté début
20 -- 20m d'extension côté fin
),
overlay_nearest('routes', $geometry, limit:=1, max_distance:=50)[0]
),
1, -- 1m d'extension côté début
1, -- 1m d'extension côté fin
)
On évite de répéter des calculs, et la duplication de code.
Création d'une variable utilisable ensuite avec @.
-- Définition des variables
with_variable(
'nearest_poly',
overlay_nearest('routes', $geometry, limit:=1, max_distance:=50)[0],
-- Code principal
extend(
intersection(
extend(shortest_line($geometry, @nearest_poly), 0, 20),
@nearest_poly
),
1,
1
)
)
La géométrie n'est pas là où le symbole apparaît.
On peut ajouter un niveau de symbole avec la géométrie réelle si besoin.
On veut seulement dessiner une ligne le long du trottoir où la zone va être placée par le générateur de géométrie.
Zone de 1.50 m de large sur la route :
single_sided_buffer($geometry, 1.5, join:=2)
Pour décaler le rectangle, on pourrait utiliser la fonction translate
mais il faut jouer avec la trigonométrie pour trouver les bons delta X et Y.
Une astuce est d'utiliser la différence entre un rectangle plus grand, et un rectangle plus petit.
Pour décaler de 20 cm du bord du trottoir :
with_variable('decalage', 0.2,
difference(
single_sided_buffer($geometry, 1.5 + @decalage, join:=2),
buffer($geometry, @decalage, cap:='square', join:='miter')
)
)
Créer une ligne qui zigue-zague entre 2 côtés de 2 "single_sided_buffer" :
Nous aurons besoin de plusieurs variables dans notre expression :
On va chercher à placer des points le long des lignes l1 et l2 : voir line_interpolate_point
.
Pour être compatible avec des lignes de plusieurs segments, combiner array_foreach
et geometries_to_array
et collect_geometries
.
2 symboles générateurs de géométries :
Chaque page aura autant de carte que de zones secondaires.
Charger les couches atlas zones principales et secondaires :
Des idées ?
Ajouter un champ virtuel dans la table des zones secondaires pour savoir à quelle zone principale elle appartient.
Voir la fonction overlay_within
.
Comme nous avons une page par zone principale, c'est notre couche de couverture.
Le nom de la page sera le champ "nom".
Créer une première carte pour la zone secondaire 1, définir les expressions pour l'emprise
Voir la fonction get_feature
.
Astuce : pour prévoir les cartes des autres zones secondaires, utiliser les variables de l'objet pour le numéro de zone.
S'il n'y a pas de zone du numéro concerné, il faut que la carte n'apparaisse pas sur la page.
Écrire une expression adaptée pour l'opacité de la carte dans la section Rendu.
Pour ne pas voir apparaître les autres zones secondaires dans une carte, utiliser une symbologie ensemble de règles
avec une règle de filtrage utilisant les variables @atlas_page_name
et celle du numéro de zone secondaire.
Avant
Après
Avec le projet des arbres de Grenoble, créer une mise en page, et configurer l'atlas.
Une page correspondra à un intervalle de temps (voir la couche intervalles
qui sera utilisée comme couche de couverture).
Dans les propriétés de la carte ajoutée à la mise en page, cocher Plage temporelle et définir les expressions adéquates.
Voir la fonction attribute
.
Rencontres des Utilisateurs Francophones de QGIS
Grenoble - 27/03/2023
Julien Cabieces / Jacky Volpes