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().split(",", QString::SkipEmptyParts); //得到Excel的字段名
for (int i = ; 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 = -; //每个待插入字段的索引号
int IdIndex = -; // ID字段的索引号
for (int j = ; j < readlist.count(); ++j)
{
QString filed;
QgsChangedAttributesMap changeMap;
QgsAttributeMap changeAttributeMap; QStringList field = readlist.at( j ).split(",", QString::SkipEmptyParts);
for ( int k = ; k < field.count(); ++k)
{
if ( field.at(k) == "Id" )
{
IdIndex = k;
continue;
}
if ( j == ) //第一行时是计算字段在属性表中的index
{
fieldIndex = vectorProvider->fieldNameIndex( field.at(k) );
break;
}
else //不是第一行则插入
{
changeAttributeMap.insert( fieldIndex + k - , QVariant( field.at(k) ) );
}
}
if ( j == )
{
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 = ; i < count; ++i)
{
orignalLayer->featureAtId( i, feature);
const QgsAttributeMap &attributes = feature.attributeMap();
int id = -;
id = attributes[ idIndex].toInt();
idMap.insert( id, feature.id());
}
return idMap;
}
这样字段class的值就添加到shp中去了。结果如图:

参考链接:QGis(四)shp矢量图层添加新字段
Qt+QGIS二次开发:向shp矢量图层中添加新的字段的更多相关文章
- Qt+QGis二次开发:创建临时图层并添加要素
开发环境:Win10 + VS2010 + Qt 4.8.6 + QGis 2.14.4 其实本文实现的功能类似于QGis中“添加文本数据图层”的一个简化版,本文不会涉及到对话框的使用,不通过与用户互 ...
- Qt+QGIS二次开发:自定义类实现查询矢量数据的属性字段值(图查属性)
在GIS领域,有两种重要的查询操作,图查属性和属性查图. 本文主要介绍如何在QGIS中通过从QgsMapToolIdentify中派生自定义类实现查询矢量数据的属性字段值(图查属性). 重点参考资料: ...
- Qt+QGIS二次开发:读取矢量元素及其属性
1 概述矢量图层内矢量元素组成,矢量图层的加载由驱动实现,驱动必须实现对矢量图层内元素的读写操作功能. 2 原理矢量元素包含几何和属性两部分组成.几何部分用于提供图形相关内容.属性部分提供与几何相关 ...
- Qt Qgis 二次开发——鼠标点击识别矢量要素
Qt Qgis 二次开发--鼠标点击识别矢量要素 介绍: 识别矢量要素需要用到QGis的一个工具类:QgsMapToolIdentifyFeature 一个QgsMapTool的子类的子类,官方文档描 ...
- Qt+QGis二次开发:加载栅格图层和矢量图层
一.加载栅格图像 加载栅格图像的详细步骤在下面代码里: //添加栅格数据按钮槽函数 void MainWindow::addRasterlayers() { //步骤1:打开文件选择对话框 QStri ...
- Qt+QGis二次开发:矢量图层的显示样式
原文链接:QGis二次开发基础 -- 矢量图层的显示样式
- Qt+QGIS二次开发:开发环境搭建(超级详细)
原文链接: 1.qgis二次开发环境搭建(超级详细) 2.QGIS开发教程(1)——QGIS开发准备工作 3.QGIS(2.18.15 源码)+Qt(5/5.9.3)+VS2015(X64)编译
- Qt+QGis二次开发:打开S-57格式(*.000)电子海图数据,并设置多边形要素的显示风格
不过多的废话了,直接上源码: addChartlayers()方法时“打开海图”按钮的triggered()信号所绑定的槽函数. //添加海图数据小按钮槽函数 void MainWindow::add ...
- Qt+QGIS二次开发:QGIS中使用QgsRubberBand类创建临时图形
1 概述 临时图形Rubberband主要用于高亮显示.交互绘制等情况下.2 原理 临时图形是在一个底色透明的图层(顶层)上,添加已有的几何元素或者创建一个几何元素(临时图形),可以设置相应的样式, ...
随机推荐
- Ajax提交用FormData()上传文件
1.form声明如下 2.ajax设置如下 var formData = new FormData(document.getElementById("form")); $.ajax ...
- 【协议】5、gossip 协议
Gossip是一种去中心化.容错并保证最终一致性的协议. Background:分布式环境 Gossip是为了解决分布式遇到的问题而设计的.由于服务和数据分布在不同的机器上,节点之间的每次交互都伴随着 ...
- 【github&&git】2、github入门到上传本地项目
[在原文章的基础上,修改了描述的不够详细的地方,对内容进行了扩充,整合了网上的一些资料] [内容主要来自http://www.cnblogs.com/specter45/p/github.html#g ...
- 读 《CSharp Coding Guidelines》有感
目录 基本原则 类设计指南 属性成员设计指南 其他设计指南 可维护性指南 命名指南 性能指南 框架指南 文档指南 布局指南 相关链接 C# 编程指南 前不久在 Github 上看见了一位大牛创建一个仓 ...
- Python 多线程、多进程 (三)之 线程进程对比、多进程
Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.多线程与多进 ...
- javascript:jQuery tablesorter 2.0
https://mottie.github.io/tablesorter/docs/index.html 1.GridView <%@ Page Language="C#" ...
- 微信小程序request同步请求
今天在搞微信小程序的时候顺手用了async,await死活不起作用,后来查了一下子,竟然不支持,那没办法就换了一种实现wx.request同步请求的方案 祭出promise来搞一搞,下面直接贴代码,简 ...
- React中使用styled-components的基础使用
今天准备来给大家分享分享React中styled-components的基础使用,仅仅是我个人的一些理解,不一定全对,有错误还请大佬们指出,496838236这是我qq,有想指点我的大佬随时加我qq好 ...
- VUE路由转场特效,WebAPP的前进与后退
一.效果图 二.思路 1. 定义两个 CSS 过度动画,前进与后退: slide-right-enter 和 slide-left-enter 2. 给路由配置meta信息,设置各个路由的级别 ...
- Python 解决Python安装包时提示Unable to find vcvarsall.bat的问题
解决Python安装包时提示Unable to find vcvarsall.bat的问题 by:授客 QQ:1033553122 问题 Python安装包时,提示Unable to find v ...