QGIS User 0052 - Contour Labels Aggregate function
Вставка
- Опубліковано 10 лют 2025
- Label placement geometry generator code:
-- Name the (line) layer that "cuts" the layer
-- where the labels should be placed.
-- Also define the placement width for the labels.
with_variable('label_position_layer', 'layer_name',
with_variable('label_placement_width', 10, -- coordinate units
if( -- First, only apply to lines that actually are to be labled (improve speed)
intersects(
geometry1:=@geometry,
geometry2:=aggregate(
layer:=@label_position_layer,
aggregate:='collect',
expression:=$geometry
)
),
aggregate( -- The actual label placment
layer:=@label_position_layer,
aggregate:='collect',
expression:=intersection(
geometry1:=geometry(@parent),
geometry2:=buffer($geometry, @label_placement_width)
)
),
'') -- End of if-statement
))
Mr. Klas karlsson, I envision you as a tranquil, modest, and benevolent gentleman.
Thank you very much.
absolutely awsome!
very useful, huge thank You))
Hi Klas, very handy script. I'm not sure if it is chjanges in QGIS since you posted this, but when I set it up and run it as you have shown, it will only allow one single label per parent contour. so if multiple label line geometries cross the parent contours, it will only label one of the intersections, not all of them as happens in your video. is there a missing setting somewhere?
@@Ben-NMN could it be a question of multi part or singel part geometries?
@@KlasKarlsson The contours were generated using Raster->Extraction->Contour from a DEM geotiff and are type "MultiLineStringZ. the label line geometries were drawn in QGIS as type "MultiLineString" and saved as a shapefile. What were the types in your example?
how the hillshade effect made?
does anybody know a solution to display the altitude labels correctly - always facing to the top?
Try this (at 8 min): ua-cam.com/video/-xzoVF7Z7u0/v-deo.htmlsi=co42L6mgXGlstQhU
Are you having trouble exporting maps with masks on QGIS 3.32?
i'm the winner... 1 hundred
... thank you
Hello Klas..can I ask your inputs how to do a symbology bypass for two lines (of same layer) intersecting each other with geometry generator? Thanks
My labels don't apear on the intersections. The label line only dictates witch contur gets a label
To me the next step after this is making the contour labels “aggregate” with the zoom level. That is, as you zoom out you see fewer. How would this be accomplished? Just using a zoom range modifier to make every third or fourth one visible, etc? Would that also be possible to do with SVG objects so that as you zoom out they “combine” to reduce clutter.
Not sure about SVG, but for selective rendering depending on scale you can absolutely use geometry generators:
with_variable(
'factor',
to_int(
scale_linear(
value:=@map_scale,
domain_min:=1000000,
domain_max:=10000000,
range_min:=1,
range_max:=10)),
if("ELEV"%(@factor*100)=0,
$geometry,'')
)
Am I wrong that for the intersect you can use the overlay_intersects function?
You can usually do a lot of things multiple ways. In this case you are right, overlay_intersects() gets you the same result as intersects(aggregate...) but with less code. Well spotted!