QGis(四)shp矢量图层添加新字段

本文介绍了一种方法,用于在地理信息系统(GIS)中将新的字段添加到Shapefile(.shp)文件,并从Excel文件中导入相应的数据。此过程包括读取Excel文件、创建新字段以及根据ID匹配更新属性表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

添加一个新的字段到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 中创建和绘制矢量文件 在 QGIS 中,用户可以通过多种方式创建和绘制矢量文件。以下内容详细描述了如何使用 QGIS 创建点、线、面类型的矢量图层,并进行编辑和保存。 #### 1. 创建矢量图层 QGIS 支持创建不同类型的矢量图层,包括 Shapefile、GeoPackage 和 SpatialLite 等格式[^1]。以 Shapefile 格式为例,介绍如何创建新的矢量图层: - 打开 QGIS 软件后,点击菜单栏中的 **Layer** > **Create Layer** > **New Shapefile Layer...**。 - 在弹出的对话框中,选择要创建的几何类型(Point、Line 或 Polygon)[^1]。 - 设置坐标参考系统(CRS),通常选择适合项目区域的投影系统。 - 定义属性字段,例如名称、类型和长度等参数。 - 点击 **OK** 按钮完成图层创建。 #### 2. 绘制矢量要素 创建矢量图层后,可以进入编辑模式开始绘制矢量要素: - 右键单击新创建的图层,在上下文菜单中选择 **Toggle Editing** 进入编辑模式。 - 使用工具栏中的绘图工具(Add Feature)添加点、线或面要素[^1]: - 对于点要素,直接点击地图上的目标位置。 - 对于线要素,依次点击多个点以定义线段路径。 - 对于面要素,围绕目标区域绘制封闭多边形。 - 编辑完成后,右键单击图层并选择 **Save Edits** 保存更改,然后退出编辑模式。 #### 3. 保存矢量文件 完成绘制后,需要将矢量数据保存为所需的格式: - 右键单击图层,选择 **Export** > **Save Features As...**。 - 在保存对话框中,选择输出格式(如 Shapefile、GeoPackage 等)、保存路径以及是否添加到地图中。 - 点击 **OK** 完成保存操作。 #### 示例代码:加载矢量图层 以下是使用 Python 脚本在 QGIS 中加载矢量图层的示例代码: ```python # 导入必要的模块 from qgis.core import QgsVectorLayer, QgsProject # 定义矢量文件路径和图层名称 vector_file_path = "path_to_your_shapefile.shp" layer_name = "My Vector Layer" # 加载矢量图层 vector_layer = QgsVectorLayer(vector_file_path, layer_name, "ogr") # 检查图层是否成功加载 if not vector_layer.isValid(): print("图层加载失败") else: # 将图层添加QGIS 项目中 QgsProject.instance().addMapLayer(vector_layer) ``` 此代码展示了如何通过编程方式加载 Shapefile 格式的矢量图层[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值