Aqui está uma maneira aproximada (mas espero que eficaz) de fazer isso.
Primeiro um pouco de matemática. Precisamos descobrir quantos caracteres em um determinado tamanho de fonte um recurso pode conter. Aqui, coisas / suposições a saber:
- assumindo unidades métricas (adicionou uma pequena alteração abaixo, o que pode fazer com que isso funcione para nós pés crs.)
- tamanho da fonte é uma medida da altura da fonte. A maioria das fontes tem metade da largura e é alta.
- usando pt para altura da fonte, 1pt é aproximadamente 0.035CM
- assumindo que suas encomendas são aproximadamente retangulares / regulares
Para descobrir quanto tempo um item está na tela / impressão, podemos usar a sua dimensão mais longa (comprimento ou altura, ou apenas se as etiquetas forem horizontais) / escala * 100 (para passar de M para CM)
Então podemos ver se nosso rótulo se encaixaria.
Você pode fazer tudo isso no mecanismo de expressão, mas uma expressão python personalizada seria mais eficiente. Aqui está um tutorial sobre como criar um.
Minha expressão personalizada:
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
Em seguida, basta usar essa expressão no rótulo:
if(labelFits( "yourAttribute" , 8 , @map_scale ), "yourAttribute",$id)
Você precisará conectar qualquer atributo que esteja usando, é claro, e alterar o tamanho da fonte de 8 para o que estiver usando. Além disso, como as fontes variam bastante, talvez você precise ajustá-las um pouco até que pareça correta.
Você também pode usar essa expressão para fazer coisas como mudar a cor com base se o rótulo se encaixa ou não.
Para usar essa expressão fora da tela do mapa (ou seja, em um rótulo do compositor ou em uma tabela de atributos), precisamos de uma maneira de obter programaticamente a escala de um determinado item do mapa. Eu
publiquei o código para fazer isso em outra resposta aqui. O método nos fornece uma expressão getScale ('composername', 'mapname') para incorporá-lo à nossa expressão:
if(
labelFits( "yourAttribute" , 8 , getScale('composername','mapname')),
"yourAttribute",$id)