您的位置:首页 > 编程语言 > C语言/C++

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

2017-08-26 13:37 435 查看
//拷贝属性字段
/***
思路:以源图层、目标图层的对应Feature,源图层、目标图层字段列表及字段地图列表为参数,逐一对每个Feature相应的字段进行赋值
步骤:
1.遍历目标图层与源图层所要进行属性拷贝的字段列表
2.通过字段名称查找源图层与目标图层中属性表中对应的字段索引
3.通过源图层索引查找该源图层的某个Feature中某个特定字段的值
4.将源图层某个Feature对应的字段值,通过更新图层索引赋值给更新图层Feature对应字段
*/
QgsFeature attributecopyclass::copyattributes(QgsFeature srcFeature,QgsFields *srcFields, QgsFeature targetFeature,QgsFields *targetFields,QMap<QString,QString> *fieldMap)
{
if(!targetFeature.isValid()||!srcFeature.isValid())return false;
int fieldSize = srcFeature.fields()->size();
if(fieldMap->size()>=1)
fieldSize = fieldMap->size();
targetFeature.initAttributes(fieldSize);
/*QList<QString> srcFieldsList = fieldMap->keys();*/
//1,循环用户配置的字段信息
for(int i=0;i<fieldMap->count()/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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ QGIS 属性拷贝