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

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. MapReduce核心 - - - Shuffle

    大数据名词(1) -Shuffle     Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce, Shuffle是必须要了解的.我看过很多相关的资料,但每 ...

  2. php编程规范整理

    该规范对其他语言,部分是通用的标准....好吧,废话不多说啦,直入正题: 1.PHP 编程规范与编码习惯最主要的有以下几点: 1 文件说明 2 function 函数体说明 3 代码缩进 4 if省略 ...

  3. 数据库编程Case when

    数据库编程题 1. 姓名 日期 是否上班 张三 星期二 是 张三 星期三 是 李四 星期一 是 王五 星期二 是 张三 星期二 是 写出一条SQL语句输出下列结果 姓名 星期一 星期二 星期三 张三 ...

  4. 数组式访问-ArrayAccess

    以前对ArrayAccess不是很熟悉,现在整理下下有关ArrayAccess相关的知识,ArrayAccess接口就是提供像访问数组一样访问对象的能力的接口. 接口内容如下: ArrayAccess ...

  5. NIO学习笔记四 :SocketChannel 和 ServerSocketChannel

    Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道.可以通过以下2种方式创建SocketChannel: 打开一个SocketChannel并连接到互联网上的某台服务器. ...

  6. 【作业一】Android开发环境以及开发前的准备

    对于Android平台的开发工具,我知道的就是Eclipse和Android Studio(后面简称AS).之前在学习JAVA时,渐渐习惯了Eclipse,后来要搭建Android的开发环境时,本来也 ...

  7. userDefineFunc.js

    var scareMe = function(){ console.log("cynthia") scareMe = function(){ console.log("w ...

  8. 【读书笔记】iOS-流式音频与Pandora Radio之路

    复杂性是不可避免的,而且只会随时间增长,所以在增加特性时一定要为重构和代码简化留出时间.真正遇到问题这前先不要担心性能.iPhone非常强壮,你可能永远也不会遇到预想的性能问题. 能过互联网向一个设备 ...

  9. 【读书笔记】iOS-优化iOS Web应用

    一,代码优化: 代码优化是任何优化技术的第一步,因为归根结底网页上的一切都是构建在代码之上的.优秀的代码可以节省宽带,减少渲染延迟,以及提高页面的可读性和长远的可维护性.下面列出了一些在Web应用中编 ...

  10. 消除2个按钮之间1px细节引起的冲突

    1.代码 <!doctype html> <html lang="en"> <head> <meta charset="UTF- ...