Geometry generator
Lutei um pouco com o @GSienko. Para peça de interseção, você também pode usar a função embutida aggregate
. Também usei a segment_to_lines
função que converte polígonos em linhas.
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)))
)
Se você tiver algum polígono "não relacionado" às linhas, poderá adicionar uma if
condição para a interseção. Se as camadas estiverem em interseção, a diferença será aplicada à simbologia; caso contrário, toda a geometria será aplicada.
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 : O uso do gerador de linha dessa maneira tem um ponto fraco - você precisa lidar com o símbolo da legenda, porque ele renderiza a linha através do polígono (não como uma borda). No entanto, você ainda pode duplicar a camada, definir preenchimento simples e usá-lo para legenda.