Đây là một cách gần đúng (nhưng hy vọng hiệu quả) để làm điều đó.
Đầu tiên một số toán học. Chúng ta cần tìm hiểu có bao nhiêu ký tự ở một cỡ chữ nhất định mà một tính năng có thể chứa. Ở đây những điều / giả định cần biết:
- giả sử các đơn vị số liệu, (được thêm một chút thay đổi dưới đây có thể giúp chúng tôi hoạt động tốt hơn.)
- cỡ chữ là thước đo chiều cao phông chữ. Hầu hết các phông chữ rộng khoảng một nửa khi chúng cao.
- sử dụng pt cho chiều cao phông chữ, 1pt là 0,035CM
- giả sử bưu kiện của bạn là khoảng hình chữ nhật / thường xuyên
Để tìm thời gian một mục trên màn hình / bản in, chúng ta có thể sử dụng kích thước dài nhất của nó (chiều dài hoặc chiều cao hoặc chỉ chiều dài nếu nhãn của bạn chỉ nằm ngang) / tỷ lệ * 100 (để đi từ M đến CM)
Sau đó, chúng tôi có thể xem nếu nhãn của chúng tôi sẽ phù hợp.
Bạn có thể làm tất cả trong công cụ biểu thức, nhưng một biểu thức python tùy chỉnh sẽ hiệu quả hơn. Đây là một hướng dẫn về cách tạo ra một.
Biểu thức tùy chỉnh của tôi:
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
Sau đó, chỉ cần sử dụng biểu thức đó trong nhãn:
if(labelFits( "yourAttribute" , 8 , @map_scale ), "yourAttribute",$id)
Tất nhiên, bạn sẽ cần phải cắm bất cứ thuộc tính nào bạn thực sự sử dụng và thay đổi kích thước phông chữ từ 8 thành bất cứ thứ gì bạn đang sử dụng. Ngoài ra, vì phông chữ thay đổi khá nhiều, bạn có thể cần phải chỉnh nó một chút cho đến khi nó trông ổn.
Bạn cũng có thể sử dụng biểu thức đó để làm những việc như thay đổi màu sắc dựa trên việc nhãn có phù hợp hay không.
Để sử dụng biểu thức này bên ngoài khung vẽ bản đồ (nghĩa là trong nhãn của nhà soạn nhạc hoặc bảng thuộc tính), chúng ta cần một cách để lập trình lấy tỷ lệ của một mục bản đồ nhất định. Tôi đã đăng mã để thực hiện điều đó trong một câu trả lời khác ở đây
Phương thức này cung cấp cho chúng tôi một biểu thức getScale ('tên người dùng', 'tên bản đồ') để kết hợp nó vào biểu thức của chúng tôi:
if(
labelFits( "yourAttribute" , 8 , getScale('composername','mapname')),
"yourAttribute",$id)