第三讲主要实现了矢量要素的标注(Label)功能,代码是在第二节的基础上进行修改
第一步:在qgis2.h文件中,增加相关头文件,主要三个头文件如下:qgslabel.h,qgslabelattribute.h qgsfield.h文件
具体代码如下所示:
- #include <QtGui/QMainWindow>
- #include "ui_qgis2.h"
- #include <qgsapplication.h>
- #include <qgsproviderregistry.h>
- #include <qgssinglesymbolrenderer.h>
- #include <qgsmapcanvas.h>
- #include <qgsvectorlayer.h>
- #include <qgsmaptool.h>
- #include <QtGui/QVBoxLayout>
- #include <qgsmaplayerregistry.h>
- #include <QtGui/QToolBar>
- #include<qgsmaptoolpan.h>
- #include <qgsmaptoolzoom.h>
- <span style="color:#ff0000;">#include <qgsvectordataprovider.h>
- //标注添加的头文件
- #include <qgslabel.h>//一个用来渲染label的类,label渲染属性可以直接指定或者根据属性值动态指定
- #include <qgslabelattributes.h>//此类保存了label渲染所需要的属性值,比如字大小,位置等属性
- #include <qgsfield.h>//此类用于将字段包装成属性表或者是数据源的形式
- //添加QT 对话框的头文件
- #include <qmessagebox.h>
- #include <qstring.h></span>
第二步:在qgis2.cpp文件,addlayer()函数增加代码,主要代码如下:
- void qgis2::addLayer()
- {
- //读取矢量数据
- QString myLayerPath ="../data";
- QString myLayerBaseName = "test";
- QString myPoviderName="ogr";
- QList<QgsMapCanvasLayer> myLayerSet;
- QgsVectorLayer* myLayer = new QgsVectorLayer(myLayerPath,myLayerBaseName,myPoviderName);
- if (myLayer->isValid())
- {
- QgsSingleSymbolRenderer *myRenderer = new QgsSingleSymbolRenderer(myLayer->geometryType());
- myLayer->setRenderer(myRenderer);
- <span style="color:#ff0000;">QgsLabel * mypLabel;
- //得到关联mylayer的label指针
- mypLabel=myLayer->label();
- QgsLabelAttributes * mypLabelAttributes;
- mypLabelAttributes = mypLabel->layerAttributes();
- //得到矢量图层的字段列表
- //typedef QMap<int,QgsField> QgsFieldMap
- QgsFieldMap myFields = myLayer->dataProvider()->fields();
- for (unsigned int i=0;i<myFields.size();i++)
- {
- QMessageBox::information(NULL,QString(tr("字段信息")),QString(myFields[i].name()).toLocal8Bit(),QMessageBox::Yes);
- }
- //在这里用最后一个字段作为标注的字段
- mypLabel->setLabelField(QgsLabel::Text,myFields.size()-1);
- //设置label的颜色,需要用到labelAttribute对象
- mypLabelAttributes->setColor(Qt::black);
- mypLabelAttributes->setBufferEnabled(true);
- mypLabelAttributes->setBufferColor(Qt::yellow);
- int myType = QgsLabelAttributes::PointUnits;
- mypLabelAttributes->setBufferSize(1,myType);
- //启用标注
- myLayer->enableLabels(true);</span>
- //增加矢量数据到图层注册
- QgsMapLayerRegistry::instance()->addMapLayer(myLayer,true);
- //设置画布的extent
- mpMapCanvas->setExtent(myLayer->extent());
- //设置画布的图层数据集
- myLayerSet.append(QgsMapCanvasLayer(myLayer));
- mpMapCanvas->setLayerSet(myLayerSet);
- }
- else
- {
- return;
- }
- }
- int main(int argc, char *argv[])
- {
- QgsApplication a(argc, argv,TRUE);
- <span style="color:#ff0000;">//设置支持中文显示
- QTextCodec *codec=QTextCodec::codecForName("System");
- QTextCodec::setCodecForLocale(codec);
- QTextCodec::setCodecForCStrings(codec);
- QTextCodec::setCodecForTr(codec);</span>
- qgis2 w;
- w.show();
- return a.exec();
- }