创建QGis的自定义DataProvider

创建QGis的自定义DataProvider,第1张

要实现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。

arcgis批量给一字段赋值步骤如下:

1、如图,在Arcmap的一个图层中,画了几个图形。

2、右击图层park名称,选择open attribute table。

3、在table表中,这里还有两列是空的,所属地区和代码。

4、现在我们将这六个图形的所属地区全部赋予一个值。右击所属地区,选择field calculator。

5、然后在field calculator下写上代码,如果是汉字的话,一定要记得加上英文输入法下的引号。

6、点击OK,回到table表中,这时候所属地区那一列已经全部被赋值为滨江新区了。

7、如果是纯数字的,就不需要加引号了,比如在代码的field calculator下直接输入数字。

8、点击OK之后回到table表中,这个代码已经全部被赋值了。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/7863507.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存