I am trying to archive the following: I have a print setup with 3 map canvases. I want to set the scale text for a specific map canvas (lets say its ID is "main_view").

In QGIS 2.14. I can use the normal scale bar and set its style to "numeric" and link it to my desired map canvas. However I have dynamic text in which the scale text will be integrated like this:

<b>Further Infos:</b> <br>[%"open_info"%]
Created: [% day( now())%].[% month(  now() )%].[% year(  now() )%]
Scale: [%$scale%]

So I can not use the transformed version from the scale bar. The command [%$scale%] yields just a 0 because I dont know how to link to my map specific canvas.

  • I think that this question/answer should solve this for you gis.stackexchange.com/questions/226436/…
    – Ian Turton
    Apr 11 '17 at 13:29
  • thanks @iant for pointing me to this. I worked for my purpose!
    – LaughU
    Apr 11 '17 at 14:33
  • Please post an answer so that others who find this can work out how to do it
    – Ian Turton
    Apr 11 '17 at 14:59

In QGIS 3.0.3 I have insert the scale in a label text with the expression:

map_get(item_variables('**XXX**'), 'map_scale')

or rounded:

'1:'|| round(map_get(item_variables('**XXX**'), 'map_scale'),o)

Where **XXX** correspond to the Item ID of the map that You have to define before


@iant pointed to a working answer I will just sum up the results, which you can find here, and give some additional explanations.

First you need to create a custom python expression function:

The code which worked for me:

from qgis.core import *
from qgis.gui import *
from qgis.utils import iface

@qgsfunction(args='auto', group='Custom')
def getScale(composerName, mapName, feature, parent):
    # dictionary to store QgsComposerView.composition() items by name
    compDict = {}
    for comp in iface.activeComposers():
        # workaround to get name: read it from window title
        compDict[comp.composerWindow().windowTitle()] = comp.composition()
    mapScale = 0 # default to be returned if scale not found
    if composerName in compDict:
        mapItem = compDict[composerName].getComposerItemById(mapName)
        if mapItem:
            mapScale = mapItem.scale()
    return mapScale

you insert this into the python expression see the qgis-tutorials for a detailed look. after this you can insert the following code into your label:

'scale' || getScale('Composer 1', 'Map 0')

The "Composer 1" argument is derived from the name under which you saved your print composer. The argument "Map 0" is the name of the map you want to see the scale text. If you want an integer instead of a float. you can return int(mapScale)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.