Qgis從數(shù)據(jù)庫讀數(shù)據(jù)到渲染當前視圖

一视粮、有關渲染的類

QgsVectorLayerRenderer類:(渲染矢量圖層要素)

????{

??????drawRendererV2( QgsFeatureIterator& fit ) ?渲染要素遍歷器中的單個要素

??????setGeometryCachePointer( QgsGeometryCache* cache ) ?建立緩存,存儲要渲染的幾何對象

??????render()?

??????stopRendererV2( QgsSingleSymbolRendererV2* selRenderer ) 結束渲染

?????}

QgsFeatureRendererV2類:子類(QgsSingleSymbolRendererV2、Qgs25DRenderer西轩、QgsCategorizedSymbolRendererV2、 QgsGraduatedSymbolRendererV2脑沿、QgsHeatmapRenderer藕畔、QgsInvertedPolygonRenderer、 QgsNullSymbolRenderer庄拇、 QgsPointDisplacementRenderer ) ??

??????QgsSingleSymbolRendererV2類:

????????{

??????????startRender( QgsRenderContext& context, const QgsFields& fields )

????????}

QgsVectorLayer類:矢量圖層類功能(圖層數(shù)據(jù)調(diào)度注服、圖層要素操作、選擇要素操作措近、圖層渲染操作溶弟、要素節(jié)點操作、添加要素操作瞭郑、)

QgsVectorLayerFeatureIterator類:圖層要素遍歷操作()

??????{

??????????fetchFeature( QgsFeature& f )//獲取feature

??????????fetchNextChangedGeomFeature( QgsFeature& f ) //遍歷編輯過的feature

??????????fetchNextChangedAttributeFeature( QgsFeature& f )

??????????fetchNextAddedFeature( QgsFeature& f )

???????}

QgsVectorLayerEditBuffer類:緩存矢量圖層編輯(存儲編輯的要素(要素操作辜御、節(jié)點操作 ))


QgsSettingsTree類: ?????

QgsMapRendererSequentialJob類:畫布操作(創(chuàng)建QImage畫布、在畫布渲染)?

QgsMapRendererJob類:子類(QgsMapRendererCustomPainterJob類屈张、QgsMapRendererQImageJob類擒权、)

QgsMapRendererCustomPainterJob類:(渲染工作的準備)

QgsOgrFeatureIterator類:

?????{

???????QgsOgrFeatureIterator( QgsOgrFeatureSource*source, bool ownSource, const?

???????QgsFeatureRequest& request )// 根據(jù)圖層索引號從數(shù)據(jù)庫獲取該圖層及信息

???????nextFeatureFilterExpresson( QgsFeature& f )

???????fetchFeature( QgsFeature& feature ) //獲取下個要素、

????????fetchFeatureWithId( QgsFeatureId id, QgsFeature& feature ) const

????????readFeature( OGRFeatureH fet, QgsFeature& feature ) // 將OgrFeatue 轉(zhuǎn)QgisFeature

????????rewind()// 重置以開始讀取下一個要素

????????getFeatureAttribute( OGRFeatureH ogrFet, QgsFeature & f, int attindex ) //將OgrFeatueAttribute 轉(zhuǎn)QgisFeatureAttribute

??????} ??


QgsOgrFeatureSource類:

?????????{

???????????virtual QgsFeatureIterator getFeatures( const QgsFeatureRequest& request ) override//將數(shù)據(jù)庫獲取的數(shù)據(jù)存儲到Qgs要素遍歷器中

?????????}


QgsOpenVectorLayerDialog類:加載數(shù)據(jù)對話框

QgisApp類:Qgis窗口的操作(添加矢量柵格圖層阁谆、設置地圖窗口大小碳抄、放大縮小、移動场绿、地圖編輯操作)

????????{

???????????askUserForOGRSublayers( QgsVectorLayer *layer ) //

????????}

QgsVectorDataProvider類:

二剖效、操作流程:

QgsVectorLayerRenderer::render() //圖層渲染

?{

????????//從數(shù)據(jù)庫中獲取當前視圖窗口的要素


??????????QgsFeatureIterator fit = mSource->getFeatures( featureRequest );

???}

//////////////////如果編輯要素,獲取編輯的要素;否則獲取當前視圖窗口顯示的要素//////////////////// ????????

???????????????????????????????????↓

QgsVectorLayerFeatureSource::getFeatures( const QgsFeatureRequest& request ) //獲取改變節(jié)點的要素列表璧尸、添加的要素列表劝贸、改變屬性的要素列表?

????{

????????????// return feature iterator that does not own this source

??????????????return QgsFeatureIterator( new QgsVectorLayerFeatureIterator( this, false, request ) );

?????}? ? ? ? ? ? ??

QgsVectorLayerFeatureIterator::QgsVectorLayerFeatureIterator( QgsVectorLayerFeatureSource* source, bool ownSource, const QgsFeatureRequest& request )

??: QgsAbstractFeatureIteratorFromSource( source, ownSource, request ) ??

?, mFetchedFid( false )

?, mInterruptionChecker( nullptr )

{

???......

???????if ( mSource->mHasEditBuffer )

?是否編輯要素(添加、修改) ???

?????????????{


???????????????mChangedFeaturesIterator?= mSource->mProviderFeatureSource->getFeatures( mChangedFeaturesRequest );


?????????????} else{

?mProviderIterator = mSource->mProviderFeatureSource->getFeatures( mProviderRequest );

? }

??????rewindEditBuffer(); //mSource里編輯的要素存到QgsVectorLayerFeatureIterator

}

???????????????????????????????????????????????↓

QgsOgrFeatureSource::getFeatures( const QgsFeatureRequest& request )

?????{ ???????????

????????????return QgsFeatureIterator( new QgsOgrFeatureIterator( this, false, request ) ); ???????????????

?????}

???????????????????????????????????????????????↓

//從數(shù)據(jù)庫獲取當前視圖窗口的額要素

QgsOgrFeatureIterator::QgsOgrFeatureIterator( QgsOgrFeatureSource* source, bool ownSource, const QgsFeatureRequest& request )

: QgsAbstractFeatureIteratorFromSource( source, ownSource, request ) ?

, mFeatureFetched( false )

, mConn( nullptr )

, ogrLayer( nullptr )

?, mSubsetStringSet( false )

?, mFetchGeometry( false )

?, mExpressonCompiled( false )

, mFilterFids( mRequest.filterFids() )

, mFilterFidsIt( mFilterFids.constBegin() )

{

.......

??if ( mSource->mLayerName.isNull() )

??{ ??

??//根據(jù)索引號(圖層序列號)獲取圖層

??ogrLayer = OGR_DS_GetLayer( mConn->ds, mSource->mLayerIndex );

??int LayerCount =OGR_L_GetFeatureCount(ogrLayer,1);

??QgsDebugMsg( QString( "LayerCount = %1 ?OGR_L_GetRefCount = %2 " ).arg( LayerCount ).arg( OGR_L_GetRefCount(ogrLayer)) ); ?

????}

?.........

//獲取試圖窗口范圍內(nèi)的要素

if ( !mRequest.filterRect().isNull() )

???{?

????const QgsRectangle& rect = mRequest.filterRect();

????OGR_L_SetSpatialFilterRect( ogrLayer, rect.xMinimum(), rect.yMinimum(), rect.xMaximum(), rect.yMaximum() );

????}

else

??{

????OGR_L_SetSpatialFilter( ogrLayer, nullptr );

??}

.......獲取屬性...

}

//////////////////////////////////////遍歷要素渲染到當前視圖窗口/////////// ???????????????????

QgsVectorLayerRenderer::render() //圖層渲染

?{

?????//從數(shù)據(jù)庫中獲取當前視圖窗口的要素

?????QgsFeatureIterator fit = mSource->getFeatures( featureRequest );

?????.......

?????//渲染要素

?????if (( mRendererV2->capabilities() & QgsFeatureRendererV2::SymbolLevels ) && mRendererV2->usingSymbolLevels() )

????????drawRendererV2Levels( fit );

?????else

????????drawRendererV2( fit );

???}

QgsVectorLayerRenderer::drawRendererV2( QgsFeatureIterator& fit )

{

????while ( fit.nextFeature( fet ) ) ?

????{

??????渲染 fet要素

????}

}

???????????????????????????????????????????????????↓

inline bool?QgsFeatureIterator::nextFeature( QgsFeature& f )

{

??return mIter ? mIter->nextFeature( f ) : false;

}

bool?QgsAbstractFeatureIterator::nextFeature( QgsFeature& f )

{?

??.........

??????????dataOk = fetchFeature( f );

??????????????????break;

???????????????}

???????????}?

?????????if ( dataOk ) ???

????????????mFetchedCount++; ?

????????return dataOk;

}

bool?QgsVectorLayerFeatureIterator::fetchFeature( QgsFeature& f )

{

???f.setValid( false );

???if ( mClosed )?

??????return false;

??if ( mRequest.filterType() == QgsFeatureRequest::FilterFid ) ?

??{

???if ( mFetchedFid )

????????return false;

??????bool res = nextFeatureFid( f );


??????mFetchedFid = true;


??????return res;


???}


??//遍歷改變的要素

??if ( !mRequest.filterRect().isNull() )


??{


?????????if ( fetchNextChangedGeomFeature( f ) )


????????????return true;

????// no more changed geometries


???}

??//遍歷改變要素屬性

??if ( mRequest.filterType() == QgsFeatureRequest::FilterExpresson )


??{

????if ( fetchNextChangedAttributeFeature( f ) )


??????????return true;

????// no more changed features


??}

???//遍歷添加的要素

??while ( fetchNextAddedFeature( f ) )


???{

????return true;

??}


??//先清空ogrlayer,重新從數(shù)據(jù)庫中加載當前視圖窗口數(shù)據(jù)?

??if ( mProviderIterator.isClosed() )


??{

????mChangedFeaturesIterator.close();


?????mProviderIterator = mSource->mProviderFeatureSource->getFeatures( mProviderRequest );


?????mProviderIterator.setInterruptionChecker( mInterruptionChecker )

?}

//遍歷ogrlayer中沒有被編輯的要素 ?mProviderIterator.nextFeature( f )

// → QgsOgrFeatureIterator::fetchFeature( QgsFeature& feature ) (在下面詳細介紹

??)

while ( mProviderIterator.nextFeature( f ) ) ?

??{????

????????//判斷修改的featureID列表是否包括f.id()

????????if ( mFetchConsidered.contains( f.id() ) ) ?

?????????????continue;

????????// TODO[MD]: just one resize of attributes

f.setFields( mSource->mFields );

// update attributes?

if ( mSource->mHasEditBuffer ) ?

updateChangedAttributes( f );?

if ( mHasVirtualAttributes ) ???

addVirtualAttributes( f ); ?

if ( mRequest.filterType() == QgsFeatureRequest::FilterExpresson && mProviderRequest.filterType() != QgsFeatureRequest::FilterExpresson )?

{ ??//filtering by expresson, and couldn't do it on the provider side ???

???mRequest.expressonContext()->setFeature( f );

?????if ( !mRequest.filterExpresson()->evaluate( mRequest.expressonContext() ).toBool() ) ?

?????{

????????//feature did not match filter ?????

????????????????????????continue; ???

???????}

??}

// update geometry

?// TODO[MK]: FilterRect check after updating the geometry ???

if ( !( mRequest.flags() & QgsFeatureRequest::NoGeometry ) ) ????

updateFeatureGeometry( f );

?????return true;

???}

??close();

??return false;

}

三逗宁、附加:??????????????????????????????????????????????????????????????????????????????????

bool?QgsOgrFeatureIterator::fetchFeature( QgsFeature& feature )

{

??feature.setValid( false );

??if ( mClosed || !ogrLayer )

????return false;

??if ( mRequest.filterType() == QgsFeatureRequest::FilterFid )

??{

????bool result = fetchFeatureWithId( mRequest.filterFid(), feature );

????close(); // the feature has been read or was not found: we have finished here

????return result;

??}

??else if ( mRequest.filterType() == QgsFeatureRequest::FilterFids )

??{

????while ( mFilterFidsIt != mFilterFids.constEnd() )

????{

??????QgsFeatureId nextId = *mFilterFidsIt;

??????mFilterFidsIt++;

??????if ( fetchFeatureWithId( nextId, feature ) )

????????return true;

????}

????close();

????return false;

??}

??OGRFeatureH fet;

??//遍歷ogrLayer

??while (( fet = OGR_L_GetNextFeature( ogrLayer ) ) )

??{

//將ogrfeature 轉(zhuǎn) qgisFeature

????if ( !readFeature( fet, feature ) )

??????continue;

????else

??????OGR_F_Destroy( fet );

????if ( !mRequest.filterRect().isNull() && !feature.constGeometry() )

??????continue;

QgsDebugMsg( QString( "ogrLayer -- featureID = %1 " ).arg( feature.id() ) );

????// we have a feature, end this cycle

????feature.setValid( true );

????return true;

??} // while

??close();

??return false;

}

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末映九,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瞎颗,更是在濱河造成了極大的恐慌件甥,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哼拔,死亡現(xiàn)場離奇詭異引有,居然都是意外死亡,警方通過查閱死者的電腦和手機倦逐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門譬正,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人檬姥,你說我怎么就攤上這事曾我。” “怎么了健民?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵抒巢,是天一觀的道長。 經(jīng)常有香客問我秉犹,道長蛉谜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任崇堵,我火速辦了婚禮型诚,結果婚禮上,老公的妹妹穿的比我還像新娘鸳劳。我一直安慰自己狰贯,他們只是感情好,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布棍辕。 她就那樣靜靜地躺著暮现,像睡著了一般。 火紅的嫁衣襯著肌膚如雪楚昭。 梳的紋絲不亂的頭發(fā)上栖袋,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機與錄音抚太,去河邊找鬼塘幅。 笑死昔案,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的电媳。 我是一名探鬼主播踏揣,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼匾乓!你這毒婦竟也來了捞稿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤拼缝,失蹤者是張志新(化名)和其女友劉穎娱局,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咧七,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡衰齐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了继阻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耻涛。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瘟檩,靈堂內(nèi)的尸體忽然破棺而出抹缕,到底是詐尸還是另有隱情,我是刑警寧澤芒帕,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布歉嗓,位于F島的核電站,受9級特大地震影響背蟆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜哮幢,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一带膀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧橙垢,春花似錦垛叨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至喂击,卻和暖如春剂癌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背翰绊。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工佩谷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留旁壮,地道東北人。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓谐檀,卻偏偏與公主長得像抡谐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子桐猬,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容