當前位置:編程學習大全網 - 源碼下載 - 創建QGis的自定義DataProvider

創建QGis的自定義DataProvider

要實現DataProvider的基本功能,需要繼承4個父類:

createProvider()用以創建壹個dataprovider實例,實現函數時new壹個自定義的dataprovider對象,然後返回即可

decodeUri()解析uri字符串,並以map結構返回解析後的數據,QGis提供了QgsDataSourceUri類,某些情況下可以直接使用QgsDataSourceUri類解析和生成uri字符串,省去了自己解析字符串的操作。參考postgresprovider的uri: dbname='sdetest' host=127.0.0.1 port=5432 user='sde' password='123' table="sde"."testlayer" (shape)。如果不用QgsDataSourceUri類,也可自定義字符串格式並自行解析。

同理,encodeUri的實現也可以借助QgsDataSourceUri類生成uri字符串。

QgsTestProvider重載QgsVectorDataProvider的純虛函數:

重載QgsDataProvider的純虛函數:

featureSource()返回自定義的QgsTestFeatureSource對象即可,QgsTestFeatureSource繼承自QgsAbstractFeatureSource

getFeatures()返回壹個叠代器,通過該叠代器遍歷features,同樣也需要新建類QgsTestFeatureIterator繼承自QgsAbstractFeatureIteratorFromSource<QgsTestFeatureSource>

wkbType()返回feature的類型,該類型為qgswkbtypes.h中QgsWkbTypes::Type枚舉。在自定義Provider中定義壹個私有變量存放該類型,則返回該變量值即可。

返回要素數量。

fields()返回屬性字段,QGis提供了壹個QgsFields類去儲存屬性字段,可以在provider內定義壹個該類對象為成員變量,fields()直接返回該對象即可

QgsFields提供append函數添加屬性字段,每個字段的具體數據由QgsField對象持有。

crs()返回坐標參考系

extent()返回圖層的範圍,將讀取到的數據以QgsRectangle對象返回,這裏以壹個成員變量mExtent儲存數據。

isValid()返回該圖層是否有效。返回自定義的成員變量即可

name()返回provider的key

description()返回provider描述

getFeatures()返回QgsFeatureIterator對象, 通過QgsFeatureIterator( QgsAbstractFeatureIterator *iter SIP_TRANSFER )構造函數創建壹個有效的叠代器,構造函數實參傳入自定義的FeatureIterator。

rewind()將叠代器重置到起始位置,在QgsTestFeatureIterator中定義成員變量mIterator用以遍歷feature,mIterator類型可以根據儲存feature的數據結構確定,以QList為例,則定義為:QList<QgsFeature>::iterator mIterator;

mClosed變量為父類QgsAbstractFeatureIterator的成員變量,當叠代器關閉時,該變量應置為true。

close()用以關閉叠代器,函數體內直接調用父類QgsAbstractFeatureIteratorFromSource的iteratorClosed()即可

查看QgsAbstractFeatureIteratorFromSource::iteratorClosed()源碼可知,其也是直接調用QgsAbstractFeatureSource的iteratorClosed()函數

fetchFeature()獲取下壹個feature,內部實現也是通過mIterator叠代,將獲得的feature賦值給形參feature。

  • 上一篇:Js安全跳轉源代碼
  • 下一篇:什麽是量比指標
  • copyright 2024編程學習大全網