İşte bunu yapmak için biraz yaklaşık (ama umarım etkili) bir yol.
Önce biraz matematik. Bir özelliğin yazı tipi boyutunda kaç karakter içerebileceğini bulmamız gerekir. İşte bilinmesi gereken şeyler / varsayımlar:
- metrik birimler varsayarak, (ayak krizi için bu işe yarayabilecek küçük bir değişiklik eklendi.)
- yazı tipi boyutu yazı tipi yüksekliğinin bir ölçüsüdür. Çoğu yazı tipi yüksek olduğu kadar yarı genişliğindedir.
- yazı tipi yüksekliği için pt kullanarak, 1pt titizlikle 0.035CM
- parsellerin kabaca dikdörtgen / düzenli olduğunu varsayarsak
Bir öğenin ekranda / baskıda ne kadar süre kaldığını bulmak için en uzun boyutunu (uzunluk veya yükseklik veya etiketleriniz yalnızca yataysa uzunluk) kullanabiliriz / ölçek * 100 (M'den CM'ye gitmek için)
Sonra etiketimizin uygun olup olmadığını görebiliriz.
Hepsini ifade motorunda yapabilirsiniz, ancak özel bir python ifadesi daha verimli olacaktır. İşte nasıl oluşturulacağına dair bir eğitim.
Özel ifadem:
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
Ardından etikette bu ifadeyi kullanın:
if(labelFits( "yourAttribute" , 8 , @map_scale ), "yourAttribute",$id)
Tabii ki kullandığınız herhangi bir özelliği takmanız ve yazı tipi boyutunu 8'den kullandığınız özelliğe değiştirmeniz gerekir. Ayrıca, yazı tipleri biraz değiştiğinden, doğru görünene kadar biraz düzeltmeniz gerekebilir.
Bu ifadeyi, etiketin uyup uymadığına bağlı olarak rengi değiştirmek gibi şeyler yapmak için de kullanabilirsiniz.
Bu ifadeyi harita tuvalinin dışında kullanmak için (yani bir besteci etiketinde veya nitelik tablosunda) belirli bir harita öğesinin ölçeğini programlı olarak almanın bir yoluna ihtiyacımız vardır. Burada başka bir cevapta bunu gerçekleştirmek için kod yayınladım Burada
yöntem bize bir ifade getScale ('composername', 'mapname') verir, böylece ifademize dahil etmek için:
if(
labelFits( "yourAttribute" , 8 , getScale('composername','mapname')),
"yourAttribute",$id)