Label 这个功能是为了更直观的将矢量数据的属性信息显示在地图上,方便用户在浏览地图的时候查看。几乎每个 Gis 系统都会有这个基础功能,QGis 的 Label 更是非常漂亮,不仅支持标注的轮廓缓冲区功能,还可以给标注绘制上阴影效果等。今天就来说一说 QGis 二次开发中的文字标注功能的实现。
在这里补充一点:如果你的 QGis 显示出的矢量图层中文是乱码,不论是属性表里面的乱码还是 Label 上显示的乱码,都是字符编码的问题。
照下面的图,在图层属性里面,打开“通用”面板,设置“数据源编码”为“GBK”或者“GBK2312”就可以了。
本文包含两个部分,第一是直接实现 Label 功能,第二则是教大家直接把 QGis 的 Label 配置面板拿过来用。
实现思路
首先我们注意到,QgsVectorLayer 这个类当中,有一个 enableLabels() 方法。先好奇的将它设置为 true.
QgsVectorLayer* layer = (QgsVectorlayer*)this->activeLayer(); // 替换成任何一种获取矢量图层的方式
layer->enableLabels(true);
m_mapCanvas->refresh();
发现有如下的效果:
OK,Done!谢谢阅读。
哈哈,开个玩笑。
上图所示的结果,仅仅是打开了 Label 这个功能,它非常简单,但是到现在还没有任何配置。例如,我们要显示的字段,显示出来的样子等等。
可是我们确实已经实现了标注的功能,即在地图界面中显示出了文字信息。
于是我们发现,重点应该是如何配置这个标注的显示。
QgsPalLayerSettings
如果某个对象有一大堆属性需要设置,最好的方式就是新建另一个对象,来负责设置这些属性。QgsPalLayerSettings 这个类正是这样的存在,它负责矢量图层的相关设置。看一看 API 文档,不难发现,这里面定义的几乎全都是属性。
我相信配置属性对于大家来说都不会是一个难点,无非就是给不同的属性赋上不同的值而已。下面我会通过代码注释,来直接给出使用方法。
// 首先是定义一个 QgsPalLayerSettings 变量,并启用他的属性设置
QgsPalLayerSettings layerSettings;
layerSettings.enabled = true;
// 然后就可以开始根据API文档中的属性,进行自定义配置了
layerSettings.fieldName = layer->pendingFields()[3].name(); // 设置Label图层
layerSettings.centroidWhole = true; // 设置位置参考的中心点
// Label 字体设置
layerSettings.textColor = QColor( 0, 0, 0 ); // 设置字体颜色
layerSettings.textFont = QFont( "Times", 12 ); // 设置字体和大小
// Label 轮廓buffer设置
layerSettings.bufferDraw = true;
layerSettings.bufferColor = QColor( 255, 0, 0