Qgis开发3-加载矢量、栅格图层

本文介绍了QGIS加载矢量和栅格图层的原理及步骤。通过QgsProviderRegistry管理驱动,QgsMapLayerRegistry管理图层数据,QgsLayerTreeGroup管理状态,并在QgsMapCanvas显示。加载矢量图层时需要冻结QMapCanvas,加载后解冻并刷新。同样方法可加载栅格图层。

Qgis开发3-加载矢量、栅格图层

 

sf2gis@163.com

2014年8月12日

 

 

本文主要阐明Qgis如何加载矢量图层。

1  原理

加载矢量数据,首先要指明此数据的类型及其驱动程序。

加载相关数据。

在主窗口中进行显示。

2  QGIS图层数据管理方式

2.1 驱动

QGIS中,所有驱动由QgsProviderRegistry类统一管理(单例)。提供对当前工程中驱动的管理。

2.2 数据管理

QGIS中,所有图层数据由QgsMapLayerRgistry类统一管理(单例)。监测图层的加载、删除,维护所有图层的内存指针列表。

2.3 状态管理

QGIS中,所有图层的状态,由QgsLayerTreeGroup(QgsLayerTreeNode的容器)进行管理。

2.4 连接显示

所有显示都在主窗口QgsMapCanvas中进行。QgsMapCanvas通过QgsLayerTreeMapCanvas进行连接显示。

3  加载矢量地图

添加矢量图层前需要将QgsMapCanvas 先冻结,加载完成后再解冻,refresh()就可以显示了。注意,要zoomToFullExtent()才能显示全图。

<think>我们之前讨论了栅格图的处理,现在用户转向了矢量的要素删除。根据用户的要求,我们需要使用C++和QGISAPI来删除矢量的特定要素。在QGIS中,矢量(QgsVectorLayer)提供了编辑和修改要素的能力。删除特定要素的一般步骤包括:1.将图置于编辑模式。2.找到要删除的要素(例如,通过属性条件或空间位置)。3.删除这些要素。4.提交更改(或保存到文件)。注意:删除要素后,如果数据源支持事务(如地理数据库),则需要提交更改;如果是文件(如Shapefile),则保存即可。代码示例:```cpp#include<qgsvectorlayer.h>#include<qgsfeatureiterator.h>#include<qgsproject.h>//假设我们有一个矢量指针,以及一个用于选择要删除要素的条件(这里以属性条件为例)voiddeleteFeatures(QgsVectorLayer*layer,constQString&attributeName,constQVariant&value){if(!layer||!layer->isValid()){return;}//开启编辑模式if(!layer->startEditing()){//处理错误return;}//构建请求:选择指定属性值的要素QgsFeatureRequestrequest;request.setFilterExpression(QString("\"%1\"=&#39;%2&#39;").arg(attributeName).arg(value.toString()));//获取要素迭代器QgsFeatureIteratorit=layer->getFeatures(request);QgsFeaturefeature;QVector<QgsFeatureId>featureIds;//收集满足条件的要素IDwhile(it.nextFeature(feature)){if(feature.isValid()){featureIds.append(feature.id());}}//删除这些要素if(!featureIds.isEmpty()){if(layer->deleteFeatures(featureIds)){//提交更改if(layer->commitChanges()){//成功提交}else{//提交失败,回滚layer->rollBack();}}else{//删除失败,回滚layer->rollBack();}}else{//没有要删除的要素,结束编辑而不做更改layer->rollBack();}}```说明:1.使用`startEditing()`进入编辑模式。2.使用`QgsFeatureRequest`构建查询条件,这里使用属性条件(也可使用空间条件)。3.通过`getFeatures`获取满足条件的要素,收集要素ID。4.调用`deleteFeatures`删除这些要素(传递要素ID列表)。5.提交更改(`commitChanges()`)或回滚(`rollBack()`)。注意:如果数据源不支持事务,则编辑操作可能会立即写入,但仍需调用`commitChanges()`来确认。另一种方法是使用`QgsVectorLayerUtils::QgsVectorLayerUtils`,但直接使用图的方法更为常见。另外,如果要素数量大,使用`QgsFeatureRequest`和`QgsFeatureIterator`效率较高。在QGIS中,矢量支持通过表达式选择要素,也支持空间位置选择。如果需要通过空间关系删除(比如在某个几何图形内部),可以使用`setFilterRect`或空间谓词表达式。生成相关问题:1.如何通过空间位置选择并删除矢量要素?2.QGIS矢量编辑事务的处理机制是怎样的?3.如何撤销对矢量的编辑操作?4.删除要素后如何刷新地图显示?根据以上思路,我们可以组织回答。</think> ### 在 C++中使用 QGIS API删除矢量要素的方法 在 QGIS二次开发中,删除矢量要素需要操作`QgsVectorLayer`对象,主要包括以下步骤: #### 1. 获取要素ID ```cpp // 根据属性值获取要删除的要素ID QVector<QgsFeatureId> featureIds; QgsFeatureIterator it = layer->getFeatures( QgsFeatureRequest().setFilterExpression("\"field_name\"=&#39;target_value&#39;") // field_name替换为字段名 ); QgsFeature feat; while (it.nextFeature(feat)) { if (feat.isValid()) { featureIds << feat.id(); // 收集符合条件的要素ID } } ``` 使用`QgsFeatureRequest`和`setFilterExpression()`通过SQL表达式筛选目标要素[^3] #### 2. 执行删除操作 ```cpp if (!featureIds.isEmpty()) { if (!layer->startEditing()) { qDebug() << "无法进入编辑模式"; // 检查编辑模式 return; } if (!layer->deleteFeatures(featureIds)) { qDebug() << "要素删除失败"; layer->rollBack(); // 操作回滚 } else { if (!layer->commitChanges()) { // 提交更改 qDebug() << "提交更改失败:" << layer->commitErrors(); layer->rollBack(); } else { qDebug() << "成功删除" << featureIds.size() << "个要素"; layer->triggerRepaint(); // 触发图重绘 } } } ``` #### 3. 完整示例流程 ```cpp void deleteVectorFeatures(QgsVectorLayer* layer, const QString& fieldName, const QVariant& targetValue) { if (!layer || !layer->isValid()) return; // 1. 获取要素ID QVector<QgsFeatureId> featureIds; QgsFeatureRequest req; req.setFilterExpression(QString("\"%1\"=&#39;%2&#39;").arg(fieldName).arg(targetValue.toString())); QgsFeatureIterator it = layer->getFeatures(req); QgsFeature feat; while (it.nextFeature(feat)) { featureIds.append(feat.id()); } // 2. 执行删除 if (featureIds.isEmpty()) return; if (!layer->startEditing()) return; if (!layer->deleteFeatures(featureIds)) { layer->rollBack(); return; } if (!layer->commitChanges()) { qDebug() << "提交错误:" << layer->commitErrors().join(";"); layer->rollBack(); return; } layer->triggerRepaint(); // 更新显示 } ``` #### 关键说明 1. **编辑模式**:必须通过`startEditing()`进入编辑模式才能修改数据 2. **事务处理**: - `commitChanges()`将修改写入数据源 - `rollBack()`在失败时撤销操作 3. **表达式语法**: - 字段名需要双引号:`"field_name"` - 字符串值需要单引号:`&#39;value&#39;` - 支持SQL表达式:`"population">1000 AND "type"=&#39;city&#39;` 4. **数据源限制**:某些数据源(如只读Shapefile)可能不支持编辑操作 > **最佳实践**:对于大型数据集,使用`QgsFeatureRequest.setLimit(1000)`分批处理避免内存溢出[^1]。 --- ###
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弗里曼的小伙伴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值