Qt+QGIS二次开发:向shp矢量图层中添加新的字段

添加一个新的字段到shp文件中,并且从Excel里导入数据到该字段。原shp文件里的字段ID应该与Excel里的字段ID一一对应才能正确的导入。下图分别是shp的字段和Excel的字段

将class字段添加到shp中去:

(1)从Excel中读取数据(为了读取方便,存为.csv或者txt文件)

QStringList readFromCSV(QString mfilename)
{
    QStringList readlist;
     if (mfilename !="")
    {
        QFileInfo csvFI(mfilename);
        QString ext = csvFI.suffix();
        if ( ext == "csv" || ext == "txt")
        {
            QFile *importFile = new QFile(mfilename);
            if ( !importFile->open(QIODevice::ReadOnly | QIODevice::Text))
            {
                QMessageBox::information(NULL, "error", "Cannot open import file !", QMessageBox::Yes | QMessageBox::No);
                return readlist;
            }
            readlist.clear();
            QTextStream readIn(importFile);//读入文件
            while ( !readIn.atEnd()) //读取每一行
            {
                readlist.push_back(readIn.readLine());
            }
 
            importFile->close();
        }
    }
    return readlist;
}

返回的readlist是所有行的数据,下面要根据Id来将每一行后面的class字段插入shp文件

(2)插入class字段及值到shp

首先要创建新字段名,然后再插入值

bool ImportLandInfo::insertInfo(QString mShpfile)
{
 
    QgsVectorLayer * newLayer;
 
    newLayer = new QgsVectorLayer(mShpfile, fileinfo.baseName(), "ogr");
    if ( newLayer != NULL)
    {
        qDebug("newLayer is valid");
    }
    else
    {
        return false;
    }
    QStringList readlist = readFromCSV(“F:\\data.csv”);//Excel文件
 
    //创建新字段
    QList<QgsField> newFieldList;
    QStringList fields = readlist.at(0).split(",", QString::SkipEmptyParts);  //得到Excel的字段名
    for (int i = 0; i < fields.count(); ++i)
    {
        QString fieldname;
        if ( fields.at(i) == "Id" )
        {
            continue;
        }
        else
        {
            fieldname = fields.at(i);
        }
        QgsField shpField( fieldname, QVariant::String);
        newFieldList.push_back( shpField );
        
    }
    QgsVectorDataProvider* vectorProvider = newLayer->dataProvider();
    vectorProvider->addAttributes( newFieldList );
    
    //新字段中插入值
    QMap<int, int> idmap = generateIdIndex(); //由原shp图层得到QMap<ID, featureId>
    int fieldIndex = -1;  //每个待插入字段的索引号
    int IdIndex = -1;    // ID字段的索引号
    for (int j = 0; j < readlist.count(); ++j)
    {
        QString filed; 
        QgsChangedAttributesMap changeMap;
        QgsAttributeMap changeAttributeMap;
 
        QStringList field = readlist.at( j ).split(",", QString::SkipEmptyParts);
        for ( int k = 0; k < field.count(); ++k)
        {
            if (  field.at(k) == "Id" )
            {    
                IdIndex = k;
                continue;
            }            
            if ( j == 0)  //第一行时是计算字段在属性表中的index
            {    
                fieldIndex = vectorProvider->fieldNameIndex( field.at(k) );
                break;
            }
            else  //不是第一行则插入
            {
                changeAttributeMap.insert( fieldIndex + k - 1, QVariant( field.at(k) ) );
            }
        }
        if ( j == 0)
        {
            continue;
        }
         int ID = field.at(IdIndex).toInt();
        
        QMap<int, int>::iterator i = idmap.find( ID); //找到指定ID对应的要素id(featureId)
        int featureId = i.value();
        changeMap.insert( featureId, changeAttributeMap );
        vectorProvider->changeAttributeValues( changeMap );
    }
    delete vectorProvider;
    return true;
}

generateIdIndex()是为了得到Id对应的FeatureID,因为属性字段Id和要素的FeatureID是不一致的。

QMap<int, int> ImportLandInfo::generateIdIndex()
{
    QMap<int, int> idMap;
    QgsVectorLayer * orignalLayer;
    QFileInfo fileinfo(moriginalShpfile);
    orignalLayer = new QgsVectorLayer(moriginalShpfile, fileinfo.baseName(), "ogr");
    if ( orignalLayer != NULL)
    {
        qDebug("newLayer is valid");
    }
    QgsVectorDataProvider* vectorProvider = orignalLayer->dataProvider();
     QgsFeature feature;
 
    int idIndex = vectorProvider->fieldNameIndex( "Id" );
    int count = orignalLayer->featureCount();
    for ( int i = 0; i < count; ++i)
    {
        orignalLayer->featureAtId( i, feature);
        const QgsAttributeMap &attributes = feature.attributeMap();
        int id = -1;
        id = attributes[ idIndex].toInt();
        idMap.insert( id, feature.id());
    }    
    return idMap;
}

这样字段class的值就添加到shp中去了。结果如图:

参考链接:QGis(四)shp矢量图层添加新字段

转载于:https://www.cnblogs.com/rainbow70626/p/10382226.html

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QGIS是一个功能强大的开源地理信息系统软件,它提供了许多二次开发的机会,包括导出SHP文件。下面是关于如何在QGIS中进行二次开发并导出SHP文件的步骤。 首先,在进行二次开发之前,确保你已经安装了QGIS软件和开发工具。 其次,打开QGIS软件,导入你想要导出为SHP文件的地理数据。这可以通过点击菜单栏中的“添加矢量图”按钮,然后选择你的数据文件来完成。 然后,在QGIS中创建一个自定义插件或使用Python编写一个脚本来导出SHP文件。这可以通过在QGIS插件开发环境中创建一个的插件或创建一个的Python脚本来实现。确保你熟悉使用Python编程语言和QGIS的开发文档。 接下来,编写代码来导出SHP文件。这可以通过使用QGIS提供的矢量文件编写工具和方法来实现。例如,你可以使用`QgsVectorFileWriter`来创建一个的矢量文件写入器对象,并使用`writeAsVectorFormat()`方法将数据导出为SHP文件。 最后,运行你的插件或脚本来导出SHP文件。这可以通过在QGIS中加载你的插件或使用Python脚本工具来运行你的脚本来实现。 通过遵循以上步骤,你就可以在QGIS中进行二次开发,并使用自定义插件或脚本实现导出SHP文件的功能。这样,你可以根据自己的需求定制导出过程,并将地理数据导出为SHP格式,方便在其他地理信息系统软件中使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值