Qt+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); }

參考鏈接:

1、QGis C++ 開發之圖層分類顯示

2、QGis二次開發基礎 -- 矢量圖層的顯示樣式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM