创建QGis的自定义DataProvider

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建QGis的自定义DataProvider相关的知识,希望对你有一定的参考价值。

参考技术A 要实现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。

flex 覆盖公共函数集数据

【中文标题】flex 覆盖公共函数集数据【英文标题】:flex override public function set data 【发布时间】:2011-02-18 03:52:36 【问题描述】:

我在 datagridcolumn 中有一个带有 itemRenderer 的数据网格作为我的自定义组件 (c1)。我通过覆盖 set data 函数来获取自定义组件中的 dataprovider 数据,这很好。但是现在我的自定义组件(c1)也有另一个自定义组件(c2)。

现在的疑问是——如何获取c2组件中的dataprovider数据?

提前致谢。

【问题讨论】:

对不起,这不是很清楚。 c1 是项目渲染器吗?数据网格? c1 '有另一个自定义组件'怎么样? 【参考方案1】:

假设 c1 是项目渲染器,而 c2 是 itemRenderer 的子组件,您需要做的就是将子组件的数据属性绑定到父组件的数据属性,或者只传入必要的数据。您可能无法在 set data 函数中执行此操作,因为子组件可能尚不存在,因此您可能需要添加检查以确保子组件存在并在创建子组件时设置数据。

<mx:Canvas>
   <mx:Script>
     <![CDATA[
         override public function set data(value:Object):void
               super.data = value;
               //do whatever w/ the data
         
      ]]>
    </mx:Script>
    <components:MyCustomComponent id="c2" data="data" />
</mx:Canvas>

(注意这是伪代码,可能也充满了拼写错误)

【讨论】:

以上是关于创建QGis的自定义DataProvider的主要内容,如果未能解决你的问题,请参考以下文章

QGIS入门实战精品教程3.4:QGIS创建连接打包GeoPackage数据库及数据入库案例详解

QGIS入门实战精品教程5.2:QGIS自定义坐标系案例教程

QGIS入门实战精品教程5.2:QGIS自定义坐标系案例教程

QGIS入门实战精品教程3.3:QGIS如何打开ArcGIS创建的文件数据库(GDB)?

QGIS入门实战精品教程3.2:QGIS如何打开ArcGIS创建的个人数据库(MDB)?

QGIS 自定义坐标系