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

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. php编程规范整理

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

  2. 用idea搭建SSM项目,原来这么简单

    目录 前言 软件环境 创建项目 数据库文件 配置文件 pom.xml log4j.properties jdbc.properties applicationContext.xml spring-mv ...

  3. 【原】Spring AOP实现对Redis的缓存同步

    前言:刚开始采用spring cache作为缓存数据,到后面发现扩展性不灵活,于是基于sprig cache原理自定义一套规则用于缓存数据. 请求过程: 根据请求参数生成Key,后面我们会对生成Key ...

  4. Javassm连接数据库报错129 ERROR [com.alibaba.druid.pool.DruidDataSource] - {dataSource-1} init error

    Javassm连接数据库报错129 ERROR [com.alibaba.druid.pool.DruidDataSource] - {dataSource-1} init error 发现jdbc这 ...

  5. vue实现双向绑定的简单原理: defineProperty

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. cf1130E. Wrong Answer(构造)

    题意 题目链接 Sol 对构造一无所知... 题解的方法比较神仙,,设第一个位置为\(-1\),\(S = \sum_{i=1}^n a_i\) 那么我们要让\(N * S - (N - 1) * ( ...

  7. 【代码笔记】Web-HTML-表单

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  8. 【读书笔记】iOS-iCloud介绍

    iCloud是一种面向消费者市场的云存储服务,苹果公司已经做了大量的工作让用户能够平滑过渡到iCloud,不过对开发者而言这意味着新的负担. 怎样使用iCloud? 你可以使用2种方式在你的应用中使用 ...

  9. js+bootstrap实现分页页码

    制作page.jsp,在其他页码引入,只需把最外层的form标签的id设置为myForm: 其中 totalPages:共有多少页:totalElements:共有有多少条记录:currentPage ...

  10. map标签

    map和area 标签配合img标签制作分区超链接效果 http://www.w3school.com.cn/tiy/t.asp?f=html_areamap