使用QGIS 2.12.2,如何设置图层标签以避免将标签放置在已经存在另一图层要素的位置?
例如,如果我有一个包含湖泊“中心线” 的河流/河流折线图层,并且按绘制顺序在其上方放置了一个“湖泊” 多边形图层,则我不希望河流图层在湖泊内部放置标签。取而代之的是,我宁愿将河流标记在湖外(根据需要)。这样,我可以从湖泊层放置标签,而不会遇到标签冲突。
使用QGIS 2.12.2,如何设置图层标签以避免将标签放置在已经存在另一图层要素的位置?
例如,如果我有一个包含湖泊“中心线” 的河流/河流折线图层,并且按绘制顺序在其上方放置了一个“湖泊” 多边形图层,则我不希望河流图层在湖泊内部放置标签。取而代之的是,我宁愿将河流标记在湖外(根据需要)。这样,我可以从湖泊层放置标签,而不会遇到标签冲突。
Answers:
自动标注是一个非常困难的问题,但是要素几何还不错。
即使您可以在大多数时间都能正常工作,也可能会有例外。您会注意到其中的一些,并且也许可以解决。制作大型地图或图块时您不会注意到的其他对象,因为您无法以各种比例将地图的每一英寸倒在上面。从制图的角度来看,几乎总是希望您手动移动一些自动放置的标签。
正如我在评论中所建议的那样,我可以使标签引擎的问题更容易解决。在这种情况下,我可以通过将河流定义为表格视图*来实现此目的,并修剪河流的几何形状以尊重湖泊边界。这样一来,在湖泊内部就没有河流特征需要标记,也不会发生标记碰撞。
*为了方便起见,我假设这里使用的是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;
将视图添加到您的布局:
尽管在我的示例中问题是有意制造的,但是两个河流图层(原始图层和视图图层)中的样式相同,并且按照绘制顺序放置在湖顶。更新湖泊或河流的几何图形时,除了刷新渲染之外,您不需要做太多事情。
在QGIS> = 2.12中,可以将“湖”面图层设置为标签障碍物。这是通过“标签”部分下的“湖”层的层属性完成的。将顶部的组合框从“ 无标签 ” 更改为“ 不鼓励其他标签覆盖此层的要素 ”。
我发现一般来说,加标签非常困难,至少要产生令我的制图师满意的标签。虽然自动贴标签功能在80%的时间内都能正常工作,但在某些情况下,例如河水/湖水贴标签问题,它并不能产生很好的标签。自动标记通常与特征的几何形状相关,例如,一行中有多少个零件,因此首先要标记所有零件。当然,QGIS可以防止重复标注,这也取决于当前地图视图的比例。
好吧,无论如何,我的技巧不是一个快速的解决方案。我经常创建一个专门用于标记的图层,以便更轻松地控制我的标签。通常,用于制图表达的要素几何可能会与用于标注的良好几何相冲突。因此,我建议创建一个新的图层,使溪流不穿过湖泊,这样您就可以完全避开该问题。拥有额外的标签层还可以帮助防止出现标签方向不符合预期方向的问题,因为标签方向与几何图形的创建方式有关。
好吧,我担心我的小费不是您期望的,但是我希望我的替代方法能以某种方式对您有所帮助。
有一个名为“ Mask ” 的插件,可用于基于多边形过滤标签。
但是,正如我之前的评论中所提到的,如果您可以在与湖泊相交处分割线(这将在此处查看不同的方法)会容易得多。然后,您可以为湖中的线段定义大小为零的标签(“图层”>“标签”>“数据定义的设置”>“大小”,然后选择存储标签大小的列)。拆分保留了河网的大多数属性,并且通过溶解是可逆的,因此您可以继续使用单个图层(如果需要,将总长度存储在特定的属性表中)。