基于开源C++的QGIS二次开发学习(一)——属性拷贝

//拷贝属性字段
/***
 思路:以源图层、目标图层的对应Feature,源图层、目标图层字段列表及字段地图列表为参数,逐一对每个Feature相应的字段进行赋值
 步骤:
 1.遍历目标图层与源图层所要进行属性拷贝的字段列表
 2.通过字段名称查找源图层与目标图层中属性表中对应的字段索引
 3.通过源图层索引查找该源图层的某个Feature中某个特定字段的值
 4.将源图层某个Feature对应的字段值,通过更新图层索引赋值给更新图层Feature对应字段
*/
QgsFeature attributecopyclass::copyattributes(QgsFeature srcFeature,QgsFields *srcFields, QgsFeature targetFeature,QgsFields *targetFields,QMap *fieldMap)
{
    if(!targetFeature.isValid()||!srcFeature.isValid())return false;
    int fieldSize = srcFeature.fields()->size();
    if(fieldMap->size()>=1)
    fieldSize = fieldMap->size();
    targetFeature.initAttributes(fieldSize);
    /*QList srcFieldsList = fieldMap->keys();*/
    //1,循环用户配置的字段信息
    for(int i=0;icount()/2;i++)
    {
        //由于手动选择所要进行赋值的字段时,字段名称可能有所不同,固将所要进行赋值的两个图层的对应两个字段(无论名称是否相同)
        //都放入字段映射列表中,目标图层字段在前,源图层字段在后,故取值时分别以奇偶数为索引
        QString targetFld = fieldMap->value(QString::number(2*i+1));
        QString srcField=fieldMap->value(QString::number(2*i));
        if(targetFld.isNull()||targetFld.isEmpty())continue;
        //获取字段序号信息
        int srcFldIndx ;
        int targetFldIndx;
        QgsField targetField;
        QVariant val;
        //获取字段序号信息
        srcFldIndx = srcFields->fieldNameIndex(srcField);
        targetField = targetFields->field(targetFld);
        targetFldIndx = targetFields->fieldNameIndex(targetField.name());
        if(srcField.isNull()||srcField.isEmpty())
        {
            targetFeature.setAttribute(targetFldIndx,"");
        }
        else
        {
            //根据目标数据类型构建值
            //取出原始用户设置的值
            val = srcFeature.attribute(srcFldIndx);
            //将原始值按字段类型重新设置给目标要素图层
            targetFeature.setAttribute(targetFldIndx,val);
        }

    }
    return targetFeature;
}

你可能感兴趣的:(QGIS,C++,QGIS,属性拷贝)