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-读取矢量元素

posted @ 2019-02-15 10:59  rainbow70626  阅读(1863)  评论(0编辑  收藏  举报