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

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. SQL Server 基本SELECT语句

    1.SELECT 和 FROM 语句 SELECT表示执行的是查询,接着需要更知道从哪边查询数据,FROM就是限制读取的数据在哪一个表或哪几个表中,这样就构成了一个基本语句. SELECT * FRO ...

  2. jquery之商城菜单

    实现效果:悬浮总菜单,显示分类菜单,移走隐藏总菜单,悬浮分类菜单,显示商品种类,移走隐藏商品种类和分类菜单,悬浮商品种类,显示商品种类和分类菜单,移走隐藏商品菜单和分类菜单. 代码如下: <!D ...

  3. Python 线程同步变量,同步条件,列队

    条件变量同步 有一类线程需要满足条件之后才能够继续执行,Python提供了threading.Condition 对象用于条件变量线程的支持,它除了能提供RLock()或Lock()的方法外,还提供了 ...

  4. 【读书笔记】iOS-MVC

    用户的每一个动作都是以一个View的Action方式传递给Controller,然后,Controller再发送消息通知Model做出响应的逻辑处理,当Model层面上的业务逻辑处理有了结果之后,Mo ...

  5. python之操作系统介绍,进程的创建

    操作系统(英语:operating system,缩写作 OS)是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石.操作系统需要处理如管理与配置内存.决定系统资源供需的优先次序.控 ...

  6. maven 技巧

    M2Eclipse Releases maven eclipse插件最新安装地址 Full Version Tag 1.0 2011-06-22 http://download.eclipse.org ...

  7. 华为交换机MSTP+VRRP配置实例说明文档

    华为交换机MSTP+VRRP配置实例说明文档 拓扑图 IP地址规划表 设备名称 设备接口 对端设备 对端接口 VLAN VLAN /接口地址 备注 SW0 GE0/0/23 SW2 GE0/0/23 ...

  8. Openlayer3之空间参考扩展

    Openlayers默认了两种空间参考,一个是EPSG4326,一个是EPSG3857,其它的空间参考需要进行扩展才能使用.所以我们初始化时进行了如下操作: 1.将配置数据库中所有的空间参考读取出来, ...

  9. 《Inside C#》笔记(九) 表达式和运算符

    赋值和比较操作是一门语言最基本的功能. 一 基本概念 a)基本的运算符有加.减.乘.除.取余.赋值. 运算结果需要保存在内存的某个区域,有时直接保存在操作数本身,不管怎样,如果没有保存运算结果,编译器 ...

  10. LeetCode题解之Second Minimum Node In a Binary Tree

    1.题目描述 2.问题分析 使用set. 3.代码 set<int> s; int findSecondMinimumValue(TreeNode* root) { dfs(root); ...