Qt+QGIS二次开发:读取矢量元素及其属性
1 概述
矢量图层内矢量元素组成,矢量图层的加载由驱动实现,驱动必须实现对矢量图层内元素的读写操作功能。
2 原理
矢量元素包含几何和属性两部分组成。几何部分用于提供图形相关内容。属性部分提供与几何相关联的属性内容。属性包含属性名和属性值。
3 方法
QgsFeature是矢量元素的抽象。QgsGeometry是几何部分的抽象。属性部分的属性名由QgsFields(是QgsField的集合操作类)抽象。属性值由QgsAttributes抽象。
1) 在矢量图层获取元素时,QgsVectorLayer::getFeature()完成操作。getFeature()会返回元素操作对象(QgsFeatureIterator)。
2) QgsFeatureIterator是一个QgsAbstractFeatureInterator的包装类,由其组成(不是继承)。
3) 为了获取矢量图层元素,需要构造一个QgsAbstractFeatureIterator的子类对象,来构造QgsFeatureIterator。而驱动提供的,能够获取元素的类只有QgsAbstractFeatureSource的子类。QgsAbstractFeatureFromSource<T>则是一个继承自 QgsAbstractFeatureIterator,操作QgsAbstractFeatureSource的类。所以此时,需要生成一个QgsAbstractFeatureIteratorFromSource的子类对象来构造。
4) 由矢量图层驱动实现的QgsAbstractFeatureIterator子类(其实是QgsAbstractFeatureIteratorFromSource的子类)QgsVectorLayerFeatureIterator操作QgsAbstractFeatureSource子类QgsVectorLayerFeatureSource。从而可以构造QgsFeatureIterator。
4 示例
1) 添加相应的action和界面元素
2) 添加相应的slot处理函数
//xx.h voidfeatureio(void);
3) 将action的signal和slot连接
//xx.cpp connect(ui->actionFeatureio,SIGNAL(triggered()),this,SLOT(featureio()));
4) 实现SLOT
//xx.cpp voidMainWindow::featureio() { QgsVectorLayer*pVectorLayer=(QgsVectorLayer*)m_pMapCanvas->currentLayer(); QgsFeatureIteratorfeatureIt=pVectorLayer->getFeatures(); featureIt.rewind(); QgsFeatureIdsids; QgsFeaturef; while(featureIt.nextFeature(f)) { constQgsFields*pFields=f.fields(); ids<<f.id(); for(inti=0;i<pFields->size();++i) { qDebug()<<"Feild["<<i<<"]="<<pFields->at(i).name()<<endl; qDebug()<<"Attribute["<<i<<"]="<<f.attribute(i).toString()<<endl; } } }
原文链接:Qgis开发12-读取矢量元素