Inilah cara yang agak mendekati (tapi mudah-mudahan efektif) untuk melakukannya.
Pertama beberapa matematika. Kita perlu mencari tahu berapa banyak karakter pada ukuran font tertentu yang dapat berisi fitur. Berikut hal-hal / asumsi yang perlu diketahui:
- dengan asumsi satuan metrik, (menambahkan sedikit perubahan di bawah ini yang mungkin membuat ini berhasil bagi kami, kaki)
- ukuran font adalah ukuran ketinggian font. Sebagian besar font sekitar setengah lebarnya.
- menggunakan pt untuk ketinggian font, 1pt adalah 0,035CM
- dengan asumsi paket Anda kira-kira persegi panjang / reguler
Untuk mengetahui berapa lama suatu item ada di layar / cetak, kita dapat menggunakannya dengan dimensi terpanjang (panjang atau tinggi, atau hanya panjang jika label Anda hanya horisontal) / skala * 100 (untuk beralih dari M ke CM)
Lalu kita bisa melihat apakah label kita cocok.
Anda bisa melakukan semuanya di mesin ekspresi, tetapi ekspresi python khusus akan lebih efisien. Berikut ini tutorial tentang cara membuatnya.
Ekspresi khusus saya:
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
Kemudian gunakan saja ungkapan itu di label:
if(labelFits( "yourAttribute" , 8 , @map_scale ), "yourAttribute",$id)
Anda harus memasukkan atribut apa pun yang sebenarnya Anda gunakan, dan mengubah ukuran font dari 8 menjadi apa pun yang Anda gunakan. Juga, karena font sedikit berbeda, Anda mungkin perlu mengubah sedikit sampai terlihat benar.
Anda juga bisa menggunakan ungkapan itu untuk melakukan hal-hal seperti mengubah warna berdasarkan apakah labelnya cocok atau tidak.
Untuk menggunakan ungkapan ini di luar kanvas peta (yaitu dalam label komposer atau tabel atribut) kita perlu cara untuk secara programatik mendapatkan skala dari item peta yang diberikan. Saya telah memposting kode untuk menyelesaikannya di jawaban lain di sini
. Metode di sana memberi kami ekspresi getScale ('composername', 'mapname') sehingga untuk memasukkannya ke dalam ekspresi kami:
if(
labelFits( "yourAttribute" , 8 , getScale('composername','mapname')),
"yourAttribute",$id)