Hier ist eine etwas ungefähre (aber hoffentlich effektive) Möglichkeit, dies zu tun.
Zuerst etwas Mathe. Wir müssen herausfinden, wie viele Zeichen bei einer bestimmten Schriftgröße ein Feature enthalten kann. Hier Dinge / Annahmen zu wissen:
- unter der Annahme von metrischen Einheiten (hinzugefügte geringfügige Änderung, die dazu führen kann, dass dies für uns Fuß-Crs funktioniert.)
- Die Schriftgröße ist ein Maß für die Schrifthöhe. Die meisten Schriftarten sind etwa halb so breit wie hoch.
- Bei Verwendung von pt für die Schrifthöhe beträgt 1pt ungefähr 0,035 cm
- Angenommen, Ihre Pakete sind ungefähr rechteckig / regelmäßig
Um herauszufinden, wie lange ein Artikel auf dem Bildschirm / Druck angezeigt wird, können Sie die längste Abmessung (Länge oder Höhe oder nur Länge, wenn Ihre Etiketten nur horizontal sind) / Skala * 100 (von M nach CM) verwenden.
Dann können wir sehen, ob unser Etikett passt.
Sie könnten alles in der Ausdrucks-Engine tun, aber ein benutzerdefinierter Python-Ausdruck wäre effizienter. Hier ist ein Tutorial zum Erstellen eines solchen.
Mein benutzerdefinierter Ausdruck:
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
Verwenden Sie dann einfach diesen Ausdruck im Etikett:
if(labelFits( "yourAttribute" , 8 , @map_scale ), "yourAttribute",$id)
Sie müssen natürlich jedes Attribut einfügen, das Sie tatsächlich verwenden, und die Schriftgröße von 8 auf das ändern, was Sie verwenden. Da die Schriftarten sehr unterschiedlich sind, müssen Sie sie möglicherweise ein wenig anpassen, bis sie richtig aussehen.
Sie können diesen Ausdruck auch verwenden, um beispielsweise die Farbe zu ändern, je nachdem, ob das Etikett passt oder nicht.
Um diesen Ausdruck außerhalb des Kartenbereichs (dh in einer Komponistenbeschriftung oder Attributtabelle) zu verwenden, benötigen wir eine Möglichkeit, den Maßstab eines bestimmten Kartenelements programmgesteuert abzurufen. Ich habe Code veröffentlicht, um dies in einer anderen Antwort hier zu erreichen.
Die dortige Methode gibt uns einen Ausdruck getScale ('composername', 'mapname'), um ihn in unseren Ausdruck aufzunehmen:
if(
labelFits( "yourAttribute" , 8 , getScale('composername','mapname')),
"yourAttribute",$id)