我正在尝试创建要打印的地图,并且多边形的大小差异很大。由于这将是参考地图,因此我需要标记每个多边形,但是某些名称将不适合该多边形。在这些情况下,我想改用功能ID,然后让属性表将ID链接到名称。
我想做的是具有某种表达式,可以用来选择在地图上使用的标签以及在属性表中包括的行。这样的isLabelled
事情将能够考虑地图比例,标签长度,字体大小等。
我正在尝试创建要打印的地图,并且多边形的大小差异很大。由于这将是参考地图,因此我需要标记每个多边形,但是某些名称将不适合该多边形。在这些情况下,我想改用功能ID,然后让属性表将ID链接到名称。
我想做的是具有某种表达式,可以用来选择在地图上使用的标签以及在属性表中包括的行。这样的isLabelled
事情将能够考虑地图比例,标签长度,字体大小等。
Answers:
这是一种近似(但希望有效)的方法。
首先一些数学。我们需要找出某个功能可以包含多少个特定字体大小的字符。这里的事情/假设要知道:
要查找一个项目在屏幕上/打印上的时间,我们可以使用它的最长尺寸(长度或高度,或者如果标签仅水平,则为长度)/比例* 100(从M到CM)
然后,我们可以查看标签是否适合。
您可以在表达式引擎中完成所有操作,但是自定义python表达式会更高效。这是有关如何创建一个的教程。
我的自定义表达式:
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('composername','mapname'),以便将其合并到我们的表达式中:
if(
labelFits( "yourAttribute" , 8 , getScale('composername','mapname')),
"yourAttribute",$id)