QGIS二次开发第三讲
2012-07-09 20:38
471 查看
第三讲主要实现了矢量要素的标注(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> #include <qgsvectordataprovider.h> //标注添加的头文件 #include <qgslabel.h>//一个用来渲染label的类,label渲染属性可以直接指定或者根据属性值动态指定 #include <qgslabelattributes.h>//此类保存了label渲染所需要的属性值,比如字大小,位置等属性 #include <qgsfield.h>//此类用于将字段包装成属性表或者是数据源的形式 //添加QT 对话框的头文件 #include <qmessagebox.h> #include <qstring.h>
第二步:在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); 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); //增加矢量数据到图层注册 QgsMapLayerRegistry::instance()->addMapLayer(myLayer,true); //设置画布的extent mpMapCanvas->setExtent(myLayer->extent()); //设置画布的图层数据集 myLayerSet.append(QgsMapCanvasLayer(myLayer)); mpMapCanvas->setLayerSet(myLayerSet); } else { return; } }第三步:修改main.cpp文件,使其支持中文显示,具体代码如下:
int main(int argc, char *argv[]) { QgsApplication a(argc, argv,TRUE); //设置支持中文显示 QTextCodec *codec=QTextCodec::codecForName("System"); QTextCodec::setCodecForLocale(codec); QTextCodec::setCodecForCStrings(codec); QTextCodec::setCodecForTr(codec); qgis2 w; w.show(); return a.exec(); }最后程序执行效果如下图所示:
相关文章推荐
- QGIS二次开发第三讲
- Qt4.8.6+mingw+Qgis2.4.0基于QGis的二次开发
- QGIS二次开发第二讲
- QGIS(PYTHON3.5、QT5.7.1、QGIS3)系列二次开发环境
- QGIS二次开发第四讲
- QGIS二次开发基础 -- 编码规范
- QGis二次开发基础 -- 文字标注
- Qgis图例处理栏(二次开发)
- qgis二次开发环境
- QGis二次开发基础 -- 属性识别工具的实现
- qgis二次开发之编译
- QGis二次开发基础 -- 栅格图像增强显示
- QGis二次开发基础 -- 矢量图层属性图表显示
- 研究QGIS二次开发笔记(一)
- QGIS(PYTHON3.5、QT5.7.1、QGIS3)系列二次开发环境
- QGIS二次开发教程(一)
- QGis二次开发基础 -- 构建图层管理器
- Qt4.8.6+mingw+Qgis2.4.0基于QGis的二次开发
- QGIS2.0编译与二次开发遇到问题记录
- QGis二次开发基础 -- 根据属性查询要素