How to force a label to be positioned in the center of a line? In QGIS the project I'm working on has this river line that crosses the polygon. I tried all kinds os settings to make the label be in the center of the line but nothing seems to work! How can I do it without placing it manually?
1 Answer
What caused the problem
Inspecting your data, it becomes clear that the problem is the geometry of your line: its very weird. Vertices appear in a chaotic order: Start point (first vertex) of the line is somewhere in the middle, next few vertices follow the river, than it jumps to another part and continues there for a few vertices etc.
How to solve the problem
Select all features of the exploded line and
Merge selected features
.
Than you can apply your label along the line where you want.
Further options for optimization
Maximum angle: Once solved, depending on your settings, you could observe another problem. When you define
label anchor
, you have to select strict (as you did on your screenshot). Otherwise, the label might still be shifted to another, more suitable (from the point of view of the algorithm) position.But you also have to select a mode for placement of the label:
Parallel
,Curved
orHorizontal
. When you choseCurved
together with thestrict
seting for label anchor, the label might disappear. This has to do with the extremely meandering river, especially in the middle part. IncreaseMaximum angle between curved characters
so that the label becomes visible - even if almost illegible (cf. screenshot).With these settings, the label is forced to be displayed along the meandering river, characters being rotated based on the river's curves. So in this case, better choose parallel or horizontal labeling or another anchor.
Increasing the maximum angle makes label visible, but almost illegible because characters trace the meandering river-line:
Create a more aesthetic curved label: Another option is to generate a (much simplified) auxiliary line of your river, without all these meanders. You can do this using Geometry by expression and an expression like this:
smooth (simplify( $geometry,9000),12)
. This gets you the red line in the next screenshot - hide it (No symbol
), but label this line - its here only for the sake of a leading line for the label.On the screenshot, I made some further adjustments like setting a distance of the label from the line, increasing space between characters etc.
Red, simlified and smoothed line can be hidden, but is used in the background as the line the label traces.
Consider workflow: GIS or graphic? QGIS has a lot of options to adapt labels to your needs. But maybe you reach a point where all the work to achieve this lead you to the idea to do the labeling as part of a post-processing task in a vector graphic software where creating curved labels can be much more intuitive and faster.
Rules for cartographic typography: A last point: consider cartographic conventions for orientation of labels. Labels should follow the direction of the river.
Multipart to singleparts
) and see if the problem can be solved this way.point_n($geometry,num_points($geometry)/2)