数据定义的标签位置在一层以上


9

我正在为我的项目寻找更好的标签解决方案。这似乎很困难-但也许我只是盲目的?

我的项目:我制作印刷的自行车远足书籍。主要比例为1:75k,城市比例为10k,概览比例为200k。因为我喜欢标签放置的“制图”质量,所以我触摸每个标签并将其移到最佳位置。我必须为每个刻度执行此操作因此我的3个刻度的标签列如下所示(“刻度1”代表10k,“刻度2”代表75k,“刻度3”代表200k):

在此处输入图片说明

但是在尝试详细解释之前,我构建了这个简单的Example-Project,您可以在其中查看和测试3种比例的(旧)标签解决方案:http : //www.map-site.de/tmp/LabelingExample.zip

好吧,它正在工作,但是:

  • 您需要每个刻度的标签列
  • 每个刻度都需要一个图层

我正在寻找一种更好的解决方案,没有重复的层和大量的列。我依靠您的创造力!

编辑:我添加了这两个非常密集的地图作为示例:

在此处输入图片说明

“圣保卢斯大教堂”只有一个可能的位置,并且没有任何象限: 在此处输入图片说明

每个标签都必须手动移动。一些标签不在象限中。


标签是否需要满足某些特定条件?我不明白您所说的“最佳职位”是什么意思。
mgri

1
“最佳位置”是指根据制图要求的位置。比较主观。
MAP

2
我发现您的示例使用了我没有的字体“ Noto Sans”,我想其他人也是如此。您可以在此处google.com/get/noto下载字体。安装字体后,必须重新启动QGIS。
TJ洛克菲勒

感谢您添加该链接-这是我的Mint安装的标准字体。
MAP

Answers:


6

我不得不说,您所要求的内容有点复杂,因为您希望标签既可以在小范围内清晰可见,也可以在大范围内(最佳匹配)可见。因此,这里的想法是如何放置在不同比例尺上可见的点。

经过几次测试,我发现除了为每个比例尺范围创建几列并将x和y坐标放置在固定点上之外,您还可以为每个点的优先位置仅创建一列以获得最佳位置,如下所示(I跟随文件中的位置):

在此处输入图片说明

然后,您转到Layer propoerties -> Labels -> Placement -> Offset from pointAround point,都可以,但是我选择了Offset from point

  1. 在“ Quadrant选择”处Data defined override -> Edit,输入以下公式:

    在此处输入图片说明

    CASE 
    WHEN  $scale >= 200000 THEN  "priority"  
    WHEN  $scale < 200000 and $scale >= 75000 THEN  "priority"   
    WHEN  $scale < 75000 and $scale >=10000 THEN  5
    WHEN  $scale < 10000 THEN 2 
    END
    

    此处"Priority"是字段名称中定义的点的位置Priority

  2. 您需要使用offset来移动点以获得更好的可见性,并且我使用以下公式:

    CASE
    WHEN  $scale >= 200000 THEN '0.001,0'
    WHEN  $scale < 200000 and $scale >= 75000 THEN '0.001,0'
    WHEN  $scale < 75000 and $scale >=10000 THEN '0.0005,0'
    WHEN  $scale < 10000 THEN '0.0001,0'
    END
    

这是不同比例的输出:

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

为了查看每个数字[0-8]在哪个位置代表什么,请看以下图片:

在此处输入图片说明

您可以通过添加与每个位置相对应的值来控制标签的位置。但不幸的是,您无法通过“单击并移动”方法来做到这一点。您需要在属性表中执行此操作。

更新:

根据您对9个象限位置的要求,我发现如果您选择Cartography而不是Offset from point,然后选择优先级,如下图所示,您将拥有12个优先级位置,而不是9。您需要创建一个Text类型字段,然后仅将您想要的缩写简称为“ TL”,“ TSL”,“ T” ...等。另外,您可以输入距离以避免标签覆盖该点。

在此处输入图片说明


那是我直到现在才尝试的一种方法。您是否看到通过“单击并移动”将标签放置在象限中的任何方法?
MAP

不幸的是,您不能通过“单击并移动”方法来做到这一点。您需要在属性表中执行此操作。但是,对于每个x,y标度级别,添加1列要好于6列。我更新了答案。
ahmadhanb

1
在最后几天,我也尝试给出解决方案,但我放弃了,因为我认为问题过于主观,无法提供更通用的解决方案。相反,@ ahmadhanb的解决方案似乎足够有创意(尽管我没有对其进行测试)。为我+1。
mgri

我同意你的看法。这里的主观性很高。这主要是关于如何判断标签是否合适的个人看法。
ahmadhanb

1
不要使用识别工具来编辑优先位置,最好使用选择工具。打开属性表,然后仅选择显示所选点。开始编辑会话,并更新位置并保存编辑。如果您已经在“数据定义的替代”中添加了表达式,则优先级位置将直接更新。
ahmadhanb

2

您可以使用表达式摆脱多层。

从我的示例中可以看到,各层之间的主要区别是Data defined Coordinate X Y指向不同比例x,y值的定义。

您可以通过选择X和Y旁边的下拉列表并选择edit ...在单个层中完成此操作,这将弹出一个表达式字符串构建器。

对于X,您可以使用类似

if(@map_scale <=10000, "scale1-x", if(@map_scale <=75000, "scale2-x", "scale3-x"))

对于Y,您可以使用类似

if(@map_scale <=10000,  "scale1-y" , if(@map_scale <=75000, "scale2-y", "scale3-y"))

如果地图比例尺小于或等于1:10,000,则应使用scale1 x,y值;如果地图比例尺小于或等于1:75,000,则应使用比例尺2 x,y;对于大于此比例的任何东西,比例尺应为3 x,y 。

如果必须为每个刻度手动定位,我看不到如何摆脱已定义的每个刻度的scale#-x和scale#-y列。


我对不同重量的标签有很高的期望。我必须手动放置它们,因为没有自动方法能够以“真实的”制图方式进行。而且每年都会打印和更新地图,因此标签必须有些固定。en.wikipedia.org/wiki/Cartographic_labeling#Placement
MAP

@MAP好,所以您知道必须手动定位项目,只需要较少的层和列即可。
TJ洛克菲勒

这有助于只显示一层的3个刻度的标签。但是QGIS无法通过表达式“写回”坐标。因此,如果我使用您提到的scale-expression,则无法再移动标签。
MAP
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.