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

摘要:
不过多的废话了,直接上源码:addChartlayers()方法时“打开海图”按钮的triggered()信号所绑定的槽函数。基名称:即不包含路径又不包含扩展名的文件名//步骤2:创建QgsVectorLayer类QgsVectorLayer*layer=newQgsVectorLayer;if(!layerGeometryType.isEmpty()&&layerGeometryType=="Polygon"&&sLayerDefs[1]=="LNDARE")//LNDARE是我的*.000数据中,我打算显示的那个子图层的图层名称{composedURI+="|geometrytype="+layerGeometryType;//设置海图子图层的完全字符串名称layerTemp=newQgsVectorLayer;if(!

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

addChartlayers()方法时“打开海图”按钮的triggered()信号所绑定的槽函数。
//添加海图数据小按钮槽函数
voidMainWindow::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( newQgsSingleSymbolRendererV2(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); deletelayer; } } //步骤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)电子海图数据,并设置多边形要素的显示风格》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Qt QPixmap QImage 图片等比例缩放到指定大小uniapp开发支付宝小程序,ios软键盘会把底部fixed定位的输入框覆盖掉有效解决方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

继承QAbstractTableModel QStyledItemDelegate实现自定义表格,添加进度条和选中框。

由于项目要求,需要实现一个列表目录显示信息,并且需要实现每一项提供进度条和选项框功能,所以需要继承QAbstractTableModel和QStyledItemDelegate进行自定义。 -自定义数据 itemdata.h #ifndef ITEMDATA_H #define ITEMDATA_H #include <QMetaType> #...

PIE-SDK For C++打开静止卫星数据

1.功能简介    静止卫星是位于地球赤道上空约3.58万km处,与地面始终保持相对静止的卫星,静止卫星的特点是覆盖区域广,具有很强的机动灵活性,能够对特定区域进行分钟级高重复观测,可快速监测灾害目标的动态变化。目前风云2系列、风云4系列、葵花(Himawari)系列、高分4卫星均为静止卫星。 [静止卫星位置示意图] [卫星运行轨迹图] [F...

Qt开发串口

首先,在工程文件里面, QT += serialport 在头文件里面, #include <QSerialPort> 1、配置打开串口 QSerialPort* myserial = new QSerialPort(): this->myserial->setPortName("COM1");//待打开的串口号 this->...

域函数(Qt)深受QByteArray的陷害

这段时间一直在学习域函数之类的问题,下午正好有机会和大家讨论一下.     这两天在护维前以写的一个服务端件软,这件软应用Qt发开的。     调试了2天,于终找到了案答。原因正是我太相信Qt的接口,QByteArray类供提了转换成char *的接口,可以这么转换: QByteArray arr; arr.toLatin1().data();     ...

QCefView实现与JS的交互

Cef主动向JS通信主要有一种方法:首先在Cef中 QCefEvent event ( const QString& eventName ); //定义一个CEF事件 event.setStringProperty ( const QString& key, const QString& msg ); //为事件添加参数 board...

Qt将表格table保存为excel(odbc方式)

首先是保存excel的方法,可参照: http://dzmlmszp.blog.163.com/blog/static/179271962014819111812531/ ok,进入正题。 现在我有一个table,如图: 图中的table可以是QTableWidget或QTableView 但是我需要隐藏最后一列,不要让用户看到,则在代码中加入: ui-...