এটি করার জন্য এখানে কিছুটা আনুমানিক (তবে আশাকরি কার্যকর) উপায়।
প্রথমে কিছু গণিত। আমাদের নির্দিষ্ট ফন্ট আকারে কতগুলি অক্ষর থাকতে পারে তা নির্ধারণ করতে হবে need জানার জন্য এখানে জিনিস / অনুমান:
- ধরে নেওয়া মেট্রিক ইউনিট, (নীচে সামান্য পরিবর্তন যুক্ত করা হয়েছে যা আমাদের পায়ের জন্য সিআরটি তৈরি করতে পারে))
- হরফ আকার হরফ উচ্চতার একটি পরিমাপ। বেশিরভাগ হরফগুলির উচ্চতা প্রায় অর্ধেক প্রশস্ত।
- ফন্টের উচ্চতার জন্য পিটি ব্যবহার করে, 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 থেকে যা ব্যবহার করছেন তা পরিবর্তন করতে হবে। এছাড়াও, যেহেতু হরফগুলি বেশ খানিকটা পরিবর্তিত হয় আপনার ডানদিকটি সঠিক হওয়া পর্যন্ত এটি কিছুটা টুইট করতে হবে।
আপনি লেবেলটি ফিট করে কিনা তার উপর ভিত্তি করে রঙ পরিবর্তন করার মতো জিনিসগুলি করতে এই অভিব্যক্তিটিও ব্যবহার করতে পারেন।
মানচিত্রের ক্যানভাসের বাইরে এই অভিব্যক্তিটি ব্যবহার করার জন্য (যেমন কোনও রচয়িতা লেবেল বা বৈশিষ্ট্য সারণীতে) আমাদের প্রদত্ত মানচিত্রের আইটেমটির স্কেল প্রোগ্রামগতভাবে পাওয়ার একটি উপায় প্রয়োজন। আমি এখানে অন্য উত্তরে এটি সম্পাদন করার জন্য কোড পোস্ট করেছি
যাতে সেটিকে আমাদের অভিব্যক্তিতে অন্তর্ভুক্ত করার জন্য সেখানকার পদ্ধতিটি আমাদের একটি এক্সপ্রেশন গেটস্কেল ('রচয়িতা', 'মানচিত্রের নাম') দেয়:
if(
labelFits( "yourAttribute" , 8 , getScale('composername','mapname')),
"yourAttribute",$id)