不过多的废话了,直接上源码:

addChartlayers()方法时“打开海图”按钮的triggered()信号所绑定的槽函数。
//添加海图数据小按钮槽函数
void MainWindow::addChartlayers()
{
  m_mapCanvas->freeze(true);//冻结或解冻地图画布对象,frozen (true) or thawed (false). Default is true.
//步骤1:打开文件选择对话框
QString filename=QFileDialog::getOpenFileName(this,tr("打开海图数据"),"","*.000");
if(filename.isNull())//如果未选择文件则返回
{
return;
}
QFileInfo fi(filename);
QString basename=fi.baseName();//获取文件基名称。基名称:即不包含路径又不包含扩展名的文件名
//步骤2:创建QgsVectorLayer类
QgsVectorLayer* layer=new QgsVectorLayer(filename,basename,"ogr",false);
if(!layer->isValid())//如果图层不合法
{
QMessageBox::critical(this,"error","图层无效!");
return;
}
else
{
     //QStringList sEncodings = QgsVectorDataProvider::availableEncodings();
layer->setProviderEncoding( "System" );//设置图层的编码格式
QStringList sublayers = layer->dataProvider()->subLayers();//获取用户选择的电子海图所包含的全部子图层的字符串名称
int subLayersCount=sublayers.count();// If the newly created layer has more than 1 layer of data available, we show the sublayers selection dialog so the user can select the sublayers to actually load.
if ( subLayersCount >= )
{
for(int i=;i<subLayersCount;i++)
{
//注册添加矢量数据,并个并添加到画布中
QStringList sLayerDefs = sublayers[i].split( ':' );//.000文件中的子图层的字符串名称结构:如0:DSID:Unknown:None和1:BUAARE:15:Point等
QString composedURI = filename + "|layerid=" + sLayerDefs[] ;
QString layerName =basename+"@"+sLayerDefs[]; QString layerGeometryType = sLayerDefs[];//图层类型 QgsVectorLayer* layerTemp;
if( !layerGeometryType.isEmpty() && layerGeometryType=="Polygon" && sLayerDefs[]=="LNDARE" )//LNDARE是我的*.000数据中,我打算显示的那个子图层的图层名称
{
composedURI += "|geometrytype=" + layerGeometryType;//设置海图子图层的完全字符串名称
layerTemp=new QgsVectorLayer(composedURI,layerName,"ogr",false); if(!layerTemp->isValid())//如果图层不合法
{
QMessageBox::critical(this,"error","海图子图层无效!");
return;
}
QgsMapLayerRegistry::instance()->addMapLayer(layerTemp,true,true);
            //设置该图层的单一渲染风格
QgsSymbolV2* symbol = QgsSymbolV2::defaultSymbol(layerTemp->geometryType());//QGis::GeometryType::Polygon
symbol->setColor(QColor(,,,));
layerTemp->setRendererV2( new QgsSingleSymbolRendererV2(symbol) ); m_mapCanvasLayerSet.append(layerTemp);
m_mapCanvas->setExtent(layerTemp->extent());//设置显示范围
}
else
{
continue;
}
}
delete layer;// The first layer loaded is not useful in that case.
}
else
{
QString msg = tr( "%1 doesn't have any layers" ).arg( basename );
QMessageBox::critical(this,"Invalid Data Source",msg);
delete layer;
}
}
//步骤3:将图层集合添加到画布中
m_mapCanvas->setLayerSet(m_mapCanvasLayerSet);//设置图层集合
m_mapCanvas->setVisible(true);//设置是否可见
m_mapCanvas->freeze(false);//解冻图层
m_mapCanvas->refresh();//刷新
//在状态条设置地图的比例尺
double dCurrScale= m_mapCanvas->scale();
QString sCurrScale=this->m_scaleEdit->toString(dCurrScale);
this->m_scaleEdit->setScaleString(sCurrScale);
}

参考链接:

1、QGis C++ 开发之图层分类显示

2、QGis二次开发基础 -- 矢量图层的显示样式

Qt+QGis二次开发:打开S-57格式(*.000)电子海图数据,并设置多边形要素的显示风格的更多相关文章

  1. Qt Qgis 二次开发——鼠标点击识别矢量要素

    Qt Qgis 二次开发--鼠标点击识别矢量要素 介绍: 识别矢量要素需要用到QGis的一个工具类:QgsMapToolIdentifyFeature 一个QgsMapTool的子类的子类,官方文档描 ...

  2. Qt+QGIS二次开发:开发环境搭建(超级详细)

    原文链接: 1.qgis二次开发环境搭建(超级详细) 2.QGIS开发教程(1)——QGIS开发准备工作 3.QGIS(2.18.15 源码)+Qt(5/5.9.3)+VS2015(X64)编译

  3. Qt+QGis二次开发:加载栅格图层和矢量图层

    一.加载栅格图像 加载栅格图像的详细步骤在下面代码里: //添加栅格数据按钮槽函数 void MainWindow::addRasterlayers() { //步骤1:打开文件选择对话框 QStri ...

  4. Qt+QGIS二次开发:自定义类实现查询矢量数据的属性字段值(图查属性)

    在GIS领域,有两种重要的查询操作,图查属性和属性查图. 本文主要介绍如何在QGIS中通过从QgsMapToolIdentify中派生自定义类实现查询矢量数据的属性字段值(图查属性). 重点参考资料: ...

  5. Qt+QGis二次开发:矢量图层的显示样式

    原文链接:QGis二次开发基础 -- 矢量图层的显示样式

  6. Qt+QGis二次开发:创建临时图层并添加要素

    开发环境:Win10 + VS2010 + Qt 4.8.6 + QGis 2.14.4 其实本文实现的功能类似于QGis中“添加文本数据图层”的一个简化版,本文不会涉及到对话框的使用,不通过与用户互 ...

  7. Qt+QGIS二次开发:QGIS中使用QgsRubberBand类创建临时图形

    1  概述 临时图形Rubberband主要用于高亮显示.交互绘制等情况下.2 原理 临时图形是在一个底色透明的图层(顶层)上,添加已有的几何元素或者创建一个几何元素(临时图形),可以设置相应的样式, ...

  8. Qt+QGIS二次开发:读取矢量元素及其属性

    1  概述矢量图层内矢量元素组成,矢量图层的加载由驱动实现,驱动必须实现对矢量图层内元素的读写操作功能. 2 原理矢量元素包含几何和属性两部分组成.几何部分用于提供图形相关内容.属性部分提供与几何相关 ...

  9. Qt+QGIS二次开发:向shp矢量图层中添加新的字段

    添加一个新的字段到shp文件中,并且从Excel里导入数据到该字段.原shp文件里的字段ID应该与Excel里的字段ID一一对应才能正确的导入.下图分别是shp的字段和Excel的字段 将class字 ...

随机推荐

  1. 【Java并发编程】6、volatile关键字解析&内存模型&并发编程中三概念

    volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以 ...

  2. Perfect hashing (And Minimal perfect hashing)

    Perfect Hashing: A hash function that is injective-that is, maps each valid input to a different has ...

  3. Python全栈学习_day005作业

    ,有如下变量(tu是个元祖),请实现要求的功能 tu = (, , {,,)}, ]) a. 讲述元祖的特性 b. 请问tu变量中的第一个元素 "alex" 是否可被修改? c. ...

  4. React 入门学习笔记整理(三)—— 组件

    1.定义组件 1)函数组件 function GreateH(props){ return <div> <h2>hello,{props.name}</h2> &l ...

  5. cve-list

    dlink CVE-2018-17786 CVE-2018-17787 CVE-2018-17880 CVE-2018-17881 mongoose CVE-2018-10945 openwrt CV ...

  6. Python参数传递(传值&传引用)

    # 测试参数是传值还是传引用def test(arg): print("test before") print(id(arg)) arg[1]=30 # 测试可变对象 # arg[ ...

  7. 洗礼灵魂,修炼python(10)--有趣的判断分支+从实例中掌握循环语句

    所有的编程语言里都有判断语句和循环语句. 判断语句则是用来分支程序流程的 循环语句则是为了实现一个效果,让程序的规律性的重复操作 不用说,分支和循环自然在python里也是有的 一,条件判断:if,i ...

  8. python第六十三天-- 第十一周作业

    题目:基于RabbitMQ rpc实现的主机管理 需求: 可以对指定机器异步的执行多个命令例子:>>:run "df -h" --hosts 192.168.3.55 ...

  9. python第三十天-类

    编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很 ...

  10. Sql_server基本操作

    使用Sql_server创建表,视图,触发器,存储过程,函数等基本操作. create table test1( /* 创建一个表 */ num int ) alter table test1 /* ...