これを行うには、多少おおよその(しかしうまくいけば効果的)方法があります。
最初にいくつかの数学。機能に含めることができる特定のフォントサイズの文字数を把握する必要があります。ここで知っておくべきこと/仮定:
- メートル法の単位であると仮定します(これをわずかに変更したため、足のcrsでこれが機能する場合があります)。
- フォントサイズはフォントの高さの尺度です。ほとんどのフォントの幅は、高さの約半分です。
- フォントの高さとしてptを使用すると、1ptはおおよそ0.035CMです
- あなたの区画がおおよそ長方形/規則的であると仮定します
アイテムが画面上にある長さ/印刷を見つけるには、最長寸法(長さまたは高さ、またはラベルが水平方向のみの場合は長さ)/スケール* 100(MからCMに移動)を使用できます。
次に、ラベルが適合するかどうかを確認できます。
すべてを式エンジンで実行できますが、カスタムPython式の方が効率的です。これを作成する方法のチュートリアルです。
私のカスタム表現:
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
次に、その式をラベルで使用します。
if(labelFits( "yourAttribute" , 8 , @map_scale ), "yourAttribute",$id)
もちろん、実際に使用している属性をすべてプラグインし、フォントサイズを8から使用しているものに変更する必要があります。また、フォントはかなり異なるため、正しく表示されるまで少し微調整する必要がある場合があります。
この式を使用して、ラベルが適合するかどうかに基づいて色を変更することなどもできます。
この式をマップキャンバスの外部(つまり、コンポーザーラベルまたは属性テーブル)で使用するには、プログラムで特定のマップアイテムの縮尺を取得する方法が必要です。これを達成するためのコードをここに別の答えで投稿しました
。そこでのメソッドは、式getScale( 'composername'、 'mapname')を与えて、それを式に組み込みます:
if(
labelFits( "yourAttribute" , 8 , getScale('composername','mapname')),
"yourAttribute",$id)