Geologists display the dip and strike of rock layers on geological maps using a dip and strike symbol, where dip in degrees indicates the maximum angle a rock layer descends relative to the horizontal. However, it is not directly possible in QGIS 2.18, using basic label settings, to place and orient a dip label next to a dip and strike symbol.
However, there is a way around this issue using Trigonometry and editing the layer’s Attribute Table. This method may be useful for controlling the position and orientation of labels around point features in general. The first step involves adding values to the Attribute Table. First, add these two new columns:
- Angle – 0° is North and values increases clockwise up to 359°
- Distance – label distance from a point feature
You can add Angle and Distance values to these columns manually or use the Field Calculator (see below) to add values if you have lots of points. Also, I chose Map Units (not millimeters) for Symbol Size, Font Size and Distance for my map, as I prefered to keep symbol size, font size and position of labels fixed when zooming in and out.
Note – I use Strike (Angle) and Label Distance (Distance) in my Attribute Table
The next step is to control the position of the label around the points using trigonometry. Right click the points layer and choose:
Properties – Labels – Placement
Check that Offset From Point is checked and then click the Data Defined Override next to the Offset X, Y boxes and choose Edit. The Expression String Builder will appear. Enter the following expression in the Expression String Builder window:
to_string ( ((-1) * ( “Distance” )) * cos ( radians ( “Angle” ))) ||’,’|| to_string (((-1) * ( “Distance” )) * sin ( radians ( “Angle” )) )
The expression takes the angle and distance values from the Attribute Table (edited earlier) and calculates an X, Y label position relative to the point feature. You may also optionally control the angle of a symbol or icon itself via:
Layer Properties – Style – click Data Defined Override icon – Edit
Then enter the following expression in the Data Defined Override dialogue:
“Angle” – 90
Finally, to control the rotation of label text, so text follows the orientation (angle) of a rotating symbol or icon, choose:
Layer Properties – Labels – Placement – Data Defined – Rotation
Click the Data Defined Override Icon again and then choose Edit. Enter the following expression in the Data Defined Override dialogue:
(“Angle” – 90) * -1
The following geological map of the Old Head of Kinsale in southern Ireland shows the results of the above procedure. We see that the dip labels rotate and currently follow the orientation of the dip and strike symbols (note that the points are at the intersection of the T symbol).
Geological Survey of Ireland – Creative Commons Attribution 4.0 license
You may have several different symbols, of various sizes, each requiring an appropriate label distance expressed in the Attribute Table. It took me a few tries before I found the right distances for my geological symbols, from 90 to 230 meters distance depending on the symbol size and type.
Lastly, the expressions “Angle” – 90 and (“Angle” – 90) * -1 were necessary in my case because I needed to place my labels next to the dip and strike symbol’s barb. You may need to use a different expression e.g. “Angle” and (“Angle”) * -1, or a value other than 90° depending on the symbol used and the prefered label placement location. Some trial and error is may be required to find the correct label position.
Pingback: Using Trigonometry To Place And Orientate Labels in QGIS – GeoNe.ws
Excellent tip – and got it working – thanks. I chose not to create a distance field myself and placed a hard number (-4) in the string as below. I also used the existing AZIMUTH field so didnt need to alter the table:
to_string((-4*cos(radians( “AZIMUTH”+90))) )|| ‘,’ || to_string(-4 * sin(radians( “AZIMUTH”+90 )))
Awesome. I have been looking since a while for this trick and many that show how to do the dip symbols in the end don’t offset the label in dip direction. Big improvement and thumbs up. Thanks 🙂