ต่อไปนี้เป็นวิธีโดยประมาณ (แต่หวังว่าจะมีประสิทธิภาพ)
ก่อนอื่นคณิตศาสตร์บางอย่าง เราจำเป็นต้องทราบว่าคุณลักษณะหนึ่งตัวสามารถบรรจุได้กี่ตัวอักษร นี่คือสิ่ง / สมมติฐานที่ควรทราบ:
- สมมติว่าหน่วยการวัด (เพิ่มการเปลี่ยนแปลงเล็กน้อยด้านล่างซึ่งอาจทำให้การทำงานนี้สำหรับเราเริ่มไปแล้ว)
- ขนาดตัวอักษรเป็นการวัดความสูงของตัวอักษร แบบอักษรส่วนใหญ่มีความกว้างประมาณครึ่งหนึ่งเท่าที่สูง
- การใช้ pt สำหรับความสูงของตัวอักษร 1 พอยต์จะได้รับ 0.035CM
- สมมติว่าพัสดุของคุณมีลักษณะเป็นสี่เหลี่ยม / ปกติ
เพื่อค้นหาระยะเวลาที่รายการบนหน้าจอ / การพิมพ์เราสามารถใช้มันเป็นมิติที่ยาวที่สุด (ความยาวหรือสูงหรือเพียงแค่ความยาวหากป้ายของคุณเป็นแนวนอนเท่านั้น) / มาตราส่วน * 100 (ไปจาก M ถึง CM)
จากนั้นเราสามารถดูว่าฉลากของเราเหมาะสมหรือไม่
คุณสามารถทำได้ทั้งหมดในเอ็นจิ้นนิพจน์ แต่นิพจน์หลามแบบกำหนดเองจะมีประสิทธิภาพมากกว่า นี่คือการสอนเกี่ยวกับวิธีการสร้าง
การแสดงออกที่กำหนดเองของฉัน:
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)