如果在QGIS中与另一层重叠,应避免使用标注功能?


16

使用QGIS 2.12.2,如何设置图层标签以避免将标签放置在已经存在另一图层要素的位置?

例如,如果我有一个包含湖泊“中心线” 的河流/河流折线图层,并且按绘制顺序在其上方放置了一个“湖泊” 多边形图层,则我不希望河流图层在湖泊内部放置标签。取而代之的是,我宁愿将河流标记在湖(根据需要)。这样,我可以从湖泊层放置标签,而不会遇到标签冲突。

这是一个示例,其中(出于视觉目的,我故意将这些线放在顶部)我希望实现的是在湖面多边形内未显示任何河流中心线标签: 线在多边形内标记


4
您的数据如何存储和提供?与PostGIS一起使用时,我很想用一个视图来定义我的河流,其中与湖泊相交的部分河流被完全剪掉。良好的自动标记是一个难题,而几何图形则不是。
alphabetasoup

这些是shapefile,但是您迁移到PostGIS并即时管理数据问题的想法是一个非常好的想法。我建议您将评论移至“答案”,因为我可以提出一个非常有效的论据,认为这是一个很好的解决方案。
RyanKDalton

Answers:


9

自动标注是一个非常困难的问题,但是要素几何还不错。

即使您可以在大多数时间都能正常工作,也可能会有例外。您会注意到其中的一些,并且也许可以解决。制作大型地图或图块时您不会注意到的其他对象,因为您无法以各种比例将地图的每一英寸倒在上面。从制图的角度来看,几乎总是希望您手动移动一些自动放置的标签。

正如我在评论中所建议的那样,我可以使标签引擎的问题更容易解决。在这种情况下,我可以通过将河流定义为表格视图*来实现此目的,并修剪河流的几何形状以尊重湖泊边界。这样一来,在湖泊内部就没有河流特征需要标记,也不会发生标记碰撞。

*为了方便起见,我假设这里使用的是RDBMS,例如PostgreSQL / PostGIS,并且只能更新您的权威数据源,并且视图本身可以工作而无需您干预。但是,您也可以预先处理静态文件以裁剪和删除要素,但是如果您打算重新访问地图,建议您不要这样做。

例:

从河流和湖泊的两个shapefile(可能是数据库表)开始,河流与湖泊相交并引起标签问题,这些问题很难完全自信地解决:

在此处输入图片说明

如果需要使用shp2pgsql请将它们带入Postgres :

shp2pgsql -s 4326 /data/lake public.lakes | psql -d mydb

shp2pgsql -s 4326 /data/river public.rivers | psql -d mydb

然后使用ST_Difference定义一个视图:

CREATE OR REPLACE VIEW rivers_clipped AS
SELECT r.id, ST_Difference(r.geom, l.geom) AS geom, r.name
FROM public.rivers AS r, public.lakes AS l;

将视图添加到您的布局:

在此处输入图片说明

尽管在我的示例中问题是有意制造的,但是两个河流图层(原始图层和视图图层)中的样式相同,并且按照绘制顺序放置在湖顶。更新湖泊或河流的几何图形时,除了刷新渲染之外,您不需要做太多事情。

在此处输入图片说明


2
虽然我没有直接使用DB层,但是该解决方案对我来说最有意义,因为它不需要编辑初始数据源的几何形状(除了将它们加载到DB中)。这是一个很好的示例,可以在shapefile和应用程序限制之外进行思考,并通过组合应用程序和DB逻辑来找到针对该问题的创造性解决方案。
RyanKDalton '16

13

在QGIS> = 2.12中,可以将“湖”面图层设置为标签障碍物。这是通过“标签”部分下的“湖”层的层属性完成的。将顶部的组合框从“ 无标签 ” 更改为“ 鼓励其他标签覆盖此层的要素 ”。


1
谢谢。我一直在寻找类似的东西,并且之前没有注意到该下拉选项。但是,我想说这只是中等程度的成功。1)它只阻止了River图层中的“种类繁多”标签(它们仍然显示在湖中,但不太常见),以及2)现在我没有我的Lake名称标签:(我还尝试过设置河流标签>障碍物“使标签无法覆盖要素”(没有成功),并设置权重为低和高(没有成功),以及设置展示位置>优先级=低和高(没有成功)
RyanKDalton

嗯,也许我误会了。如果您在湖层上有标签,请确保选中“渲染”选项卡下的“阻止覆盖特征的标签”复选框。您可能需要使用“重量”滑块和该组中的其他选项才能获得所需的结果。
ndawson '16

1
不,您绝对是在正确的轨道上。我玩弄了权重(在湖上的多边形上高权重+“最小化在要素内部上放置标签,在河上的权重最低))并靠近,但从未真正达到河上标签不在湖上的地步。问题似乎与多边形内外的线相关联
RyanKDalton

4
为什么在标注时不删除(或拆分)这些行?无论如何,它们对您的地图没有用。
radouxju

4

我发现一般来说,加标签非常困难,至少要产生令我的制图师满意的标签。虽然自动贴标签功能在80%的时间内都能正常工作,但在某些情况下,例如河水/湖水贴标签问题,它并不能产生很好的标签。自动标记通常与特征的几何形状相关,例如,一行中有多少个零件,因此首先要标记所有零件。当然,QGIS可以防止重复标注,这也取决于当前地图视图的比例。

好吧,无论如何,我的技巧不是一个快速的解决方案。我经常创建一个专门用于标记的图层,以便更轻松地控制我的标签。通常,用于制图表达的要素几何可能会与用于标注的良好几何相冲突。因此,我建议创建一个新的图层,使溪流不穿过湖泊,这样您就可以完全避开该问题。拥有额外的标签层还可以帮助防止出现标签方向不符合预期方向的问题,因为标签方向与几何图形的创建方式有关。

好吧,我担心我的小费不是您期望的,但是我希望我的替代方法能以某种方式对您有所帮助。


您提出了一个可以创建一个新数据集的有效点(在这种情况下这很容易...只需删除多边形下的线要素),将数据集加倍听起来并不太吸引人或难以管理,除非您使用数据库驱动的方法,例如@Richard Law。
RyanKDalton

我明白了你的意思,也理解了两次创建相似数据集的犹豫。以我的经验,标签层通常与原始数据层有更多不同。例如,为了坚持您的河流示例,您可能需要进一步更改河流的几何形状以合并或分割要素部分,以创建更好的标签,使其更可靠地重复。至少在我处理OSM道路时(例如,有时组织得很随意),这对我来说通常是这样。
Frank Frank

3

有一个名为“ Mask ” 的插件,可用于基于多边形过滤标签。

但是,正如我之前的评论中所提到的,如果您可以在与湖泊相交处分割线(这将在此处查看不同的方法)会容易得多。然后,您可以为湖中的线段定义大小为零的标签(“图层”>“标签”>“数据定义的设置”>“大小”,然后选择存储标签大小的列)。拆分保留了河网的大多数属性,并且通过溶解是可逆的,因此您可以继续使用单个图层(如果需要,将总长度存储在特定的属性表中)。


谢谢,该插件听起来很有前途,所以我将尝试一下。
RyanKDalton
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.