इसे करने के लिए कुछ हद तक अनुमानित (लेकिन उम्मीद के मुताबिक प्रभावी) तरीका है।
पहले कुछ गणित। हमें यह पता लगाने की जरूरत है कि एक निश्चित फ़ॉन्ट-आकार में कितने वर्णों में एक विशेषता हो सकती है। यहाँ जानने के लिए बातें / धारणाएँ:
- मीट्रिक इकाइयाँ ग्रहण करते हुए, (नीचे थोड़ा परिवर्तन किया गया है जो हमारे लिए फुट क्रैस का काम कर सकता है।)
- फ़ॉन्ट आकार फ़ॉन्ट ऊंचाई का एक माप है। ज्यादातर फॉन्ट उतने ही चौड़े होते हैं जितने ऊंचे होते हैं।
- फ़ॉन्ट ऊंचाई के लिए pt का उपयोग करते हुए, 1pt को 0.035CM माना जाता है
- यह मानते हुए कि आपके पार्सल लगभग आयताकार / नियमित हैं
यह जानने के लिए कि स्क्रीन / प्रिंट पर कोई आइटम कितनी देर तक है, हम इसका सबसे लंबे आयाम (लंबाई या ऊँचाई, या सिर्फ लंबाई का उपयोग कर सकते हैं यदि आपके लेबल केवल क्षैतिज हैं) / स्केल * 100 (एम से सीएम तक जाने के लिए)
तब हम देख सकते हैं कि क्या हमारा लेबल फिट होगा।
आप यह सब अभिव्यक्ति इंजन में कर सकते हैं, लेकिन एक कस्टम अजगर अभिव्यक्ति अधिक कुशल होगी। यहाँ कैसे एक बनाने के लिए एक ट्यूटोरियल है।
मेरी कस्टम अभिव्यक्ति:
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 ('चित्रण', 'mapname') देती है ताकि इसे हमारी अभिव्यक्ति में शामिल किया जा सके:
if(
labelFits( "yourAttribute" , 8 , getScale('composername','mapname')),
"yourAttribute",$id)