J'ai eu un peu de mal avec le Geometry generator
@GSienko. Pour la partie d'intersection, vous pouvez également utiliser la fonction intégrée aggregate
. J'ai également utilisé une segment_to_lines
fonction qui convertit les polygones en lignes.
difference(
segments_to_lines($geometry),
aggregate(
layer:= 'line',
aggregate:='collect',
expression:= $geometry,
filter:=intersects($geometry, geometry(@parent))
)
)
ou
difference(
segments_to_lines($geometry),
aggregate('line','collect',$geometry,intersects($geometry, geometry(@parent)))
)
Si vous avez un polygone "sans rapport" avec les lignes, vous pouvez ajouter une if
condition d'intersection. Si les couches sont en intersection, la différence est appliquée pour la symbologie, sinon la géométrie entière est appliquée.
if(
intersects(
segments_to_lines($geometry),
aggregate('line','collect',$geometry,intersects($geometry, geometry(@parent)))
),
difference(
segments_to_lines($geometry),
aggregate('line','collect',$geometry,intersects($geometry, geometry(@parent)))
),
segments_to_lines($geometry)
)
edit : Utiliser le générateur de lignes de cette façon a un point faible - vous devez gérer le symbole de légende, car il rend la ligne à travers le polygone (pas comme une bordure). Cependant, vous pouvez toujours dupliquer le calque, définir un remplissage simple et l'utiliser comme légende.