[原创]Qt C++下进行QGIS二次开发打开S-57格式(*.000)电子海图数据,并设置多边形要素的显示风格

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

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 >= 1 )
        {
            for(int i=0;i<subLayersCount;i++)
            {
                //注册添加矢量数据,并个并添加到画布中
                QStringList sLayerDefs = sublayers[i].split( ‘:‘ );//.000文件中的子图层的字符串名称结构:如0:DSID:Unknown:None和1:BUAARE:15:Point等
                QString composedURI = filename + "|layerid=" + sLayerDefs[0] ;
                QString layerName =basename+"@"+sLayerDefs[1];

                QString layerGeometryType = sLayerDefs[3];//图层类型

                QgsVectorLayer* layerTemp;
                if( !layerGeometryType.isEmpty() && layerGeometryType=="Polygon" && sLayerDefs[1]=="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(100,100,160,255));
                    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);
}

原文地址:https://www.cnblogs.com/rainbow70626/p/10372145.html

时间: 2024-07-30 20:38:59

[原创]Qt C++下进行QGIS二次开发打开S-57格式(*.000)电子海图数据,并设置多边形要素的显示风格的相关文章

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

在GIS领域,有两种重要的查询操作,图查属性和属性查图. 本文主要介绍如何在QGIS中通过从QgsMapToolIdentify中派生自定义类实现查询矢量数据的属性字段值(图查属性). 重点参考资料: 1.QGis二次开发基础 -- 属性识别工具的实现 2.QGis(三)查询矢量图层的要素属性字段值 原文地址:https://www.cnblogs.com/rainbow70626/p/10383034.html

JAVA环境下利用solrj二次开发SOlR搜索的环境部署常见错误

问题一:出现控制台坏的响应错误一Bad request 控制台出现错误如下: Bad Request request: http://hostIP:8983/solr/update?wt=javabin&version=1 解决方法: 出现以上错误的原因是,solr服务器上配置的Field和javabean提交的Field不能对应, 导致solr服务器找不到域,拒绝访问. 打开SOLR_HOME下的conf文件夹找到schema.xml文件,在其中添加对应的域. 例如以下代码添加了:title,

研究QGIS二次开发笔记(一)

为了在QT程序中嵌入一个地图,最终选择了QGIS来干这件事.选型阶段真是呵呵.我折腾的是QGIS2.4.0. 首先,到官方网站下载安装QGIS.如果你跟我一样懒的话,可能希望下载一个已经编译好的windows版的QGIS.但是这里有个陷阱.咱们是要做二次开发的,千万不要下载安装那个看上去很美的QGIS Chugiak安装包,那里面缺lib库啊我摔!!一定要用那个在线安装下载的osgeo4w.下载选择advance install,在选择下载项时注意把libjpeg_ipp那个库取消掉,安装没有i

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

一.加载栅格图像 加载栅格图像的详细步骤在下面代码里: //添加栅格数据按钮槽函数 void MainWindow::addRasterlayers() { //步骤1:打开文件选择对话框 QString filename=QFileDialog::getOpenFileName(this,tr("打开栅格数据"),"","remote sensing image(*.tif *.tiff);;image(*.jpg *.jpeg *.png *.bmp)

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

1  概述 临时图形Rubberband主要用于高亮显示.交互绘制等情况下.2 原理 临时图形是在一个底色透明的图层(顶层)上,添加已有的几何元素或者创建一个几何元素(临时图形),可以设置相应的样式,并在图层的最上层叠加显示.3 使用方法 QgsRubberBand用于显示临时图形.可以显示点.线.面等所有类型.由于在交互绘制时,可能需要高亮显示节点,所以本类也可以设置不同的IconType来显示不同的节点样式(只能在点类型时起作用). 生成对象后可以完成操作所有的属性,如几何元素.样式等. s

NX二次开发-遍历当前part所有component,把装配子部件设置成工作部件

1 NX11+VS2013 2 3 #include <uf.h> 4 #include <uf_disp.h> 5 #include <uf_modl.h> 6 #include <uf_part.h> 7 #include <uf_obj.h> 8 #include <uf_assem.h> 9 #include <uf_ui.h> 10 #include <string.h> 11 #include &l

NX二次开发-打开弹出当前part所在的文件夹

1 #include <uf.h> 2 #include <uf_part.h> 3 #include <atlstr.h> 4 #include <iostream> 5 #include <sstream> 6 7 using std::string; 8 9 10 UF_initialize(); 11 12 //获取当前part的tag 13 tag_t WorkPart = UF_PART_ask_display_part(); 14

QGIS C++二次开发环境

网上看了一下QGIS C++的二次开发环境大部分都还停留在QGIS2.9之前的版本和QT4的基础上,应该是三年前的版本吧,而且多数使用的是RelWithDebInfo.模式,个人感觉那种模式是QGIS开发社区为学习QGIS代码的人提供的一种折中模式,并不是合真正的应用开发,而且,当用这种版本调试时很多DEBUG信息也显示不出来,因此出错时也很难判断错误的原因.现在QGIS3的版本已经正式发布了,与2.9之前的版本比较变化很大无论是功能还是接口.例如:增加XYZ图层支持可以直接加载高德.谷歌等TM

QGIS 二三维效果

提示:所有环境环境所使用的QGIS SDK ,包括:QGIS FOR ANDRIOD.androidQGIS FOR LINUX.androidQGIS FOR LINUX.QGISSERVER.QGIS与OSGEARTH集成的二三维开发环境等QGIS二次开发扩展环境为同一套QGIS底层开发环境,可以为你利用开源平台进行快速开发提供服务,同时承接各类GIS项目开发,欢迎您咨询回顾.联系:315022850 原文地址:http://blog.51cto.com/osgis/2110917