Voici une façon quelque peu approximative (mais si tout va bien efficace) de le faire.
D'abord un peu de maths. Nous devons déterminer combien de caractères à une certaine taille de police une fonctionnalité peut contenir. Voici les choses / hypothèses à savoir:
- en supposant des unités métriques, (ajout d'un léger changement ci-dessous qui peut faire que cela fonctionne pour nous pieds crs.)
- la taille de police est une mesure de la hauteur de police. La plupart des polices sont environ deux fois plus larges que hautes.
- en utilisant pt pour la hauteur de police, 1pt est approximativement 0,035 cm
- en supposant que vos colis sont à peu près rectangulaires / réguliers
Pour savoir combien de temps un élément est affiché à l'écran / imprimé, nous pouvons utiliser sa dimension la plus longue (longueur ou hauteur, ou simplement la longueur si vos étiquettes sont horizontales uniquement) / échelle * 100 (pour passer de M à CM)
Ensuite, nous pouvons voir si notre étiquette conviendrait.
Vous pouvez tout faire dans le moteur d'expression, mais une expression python personnalisée serait plus efficace. Voici un tutoriel sur la façon d'en créer un.
Mon expression personnalisée:
from qgis.core import *
from qgis.gui import *
@qgsfunction(args='auto', group='Custom')
def labelFits(labelStr, fontPt, scaleM, feature, parent):
# returns true if a label will fit in the feature at a given
# font size and scale
bbox = feature.geometry().boundingBox()
# for CRS in us foot
# fontWidth = fontPt * 0.0875
# for CRS in metric
# 1pt = 0.035CM
fontWidth = fontPt * 0.035 * 0.5
# length of maximum dimension on-screen/print in CM
labelRoom = max(bbox.width(),bbox.height()) / scaleM * 100
# approx length of our label in CM based on font height * 0.5
labelLen = len(labelStr) * fontWidth
if labelRoom > labelLen:
return True
else:
return False
Ensuite, utilisez simplement cette expression dans l'étiquette:
if(labelFits( "yourAttribute" , 8 , @map_scale ), "yourAttribute",$id)
Vous devrez bien sûr brancher l'attribut que vous utilisez réellement, et changer la taille de police de 8 à celle que vous utilisez. De plus, comme les polices varient beaucoup, vous devrez peut-être les modifier un peu jusqu'à ce qu'elles semblent correctes.
Vous pouvez également utiliser cette expression pour faire des choses comme changer la couleur en fonction de l'adéquation ou non de l'étiquette.
Pour utiliser cette expression en dehors du canevas de carte (c'est-à-dire dans une étiquette de compositeur ou une table d'attributs), nous avons besoin d'un moyen d'obtenir par programme l'échelle d'un élément de carte donné. J'ai posté du code pour accomplir cela dans une autre réponse ici
La méthode ici nous donne une expression getScale ('composername', 'mapname') afin de l'intégrer dans notre expression:
if(
labelFits( "yourAttribute" , 8 , getScale('composername','mapname')),
"yourAttribute",$id)