一视粮、有關渲染的類
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;
}