QGIS【实例 01】筛选范围内的数据相交intersection工具使用及Feature (347897) has invalid geometry问题处理

本文介绍了如何在QGIS中利用矢量覆盖工具筛选特定城市的路网数据,以郑州为例,通过相交工具完成数据提取,并强调了文件编码设置和导出字段的选择。同时,针对遇到的Invalid Geometry错误,提出了解决方案,即使用修正集合图形工具,并使用修正后的图层作为输入。所有操作基于QGIS 3.12.2版本,不同版本可能有所差异。

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

1.筛选某个城市的路网数据

主要使用到的是处理工具箱里的矢量覆盖->相交(intersection)工具,需要注意的是:

  • 输入图层是被筛选的数据(举例使用的是全国路网数据);
  • 叠加图层是筛选工具(举例使用的是区划区域郑州如果叠加图层已经是个小范围了,就不用再勾选仅选中的要素。

经过图中的几步操作得出的临时图层相交(intersection)就是郑州市的路网数据

在这里插入图片描述

这里需要注意的是,更改文件编码选项如果图层数据使用的编码比较特殊,这里要进行设置。

在这里插入图片描述

如果要导出相交(intersection)图层的数据,这里要注意导出字段(有一些字段属于计算字段)。

在这里插入图片描述

2.报错问题处理

Feature (347897) has invalid geometry. Please fix the geometry or change the Processing setting to the "Ignore invalid input features" option.

在这里插入图片描述
下边解决问题:使用工具修正集合图形

在这里插入图片描述
执行完成后回创建临时图层:

在这里插入图片描述
再次使用时要选择已修正集合图形图层当作输入图层。

在这里插入图片描述

3.总结

以上内容均以QGIS 3.12.2版本进行说明,不同版本可能存在差异。

在C++和QGIS(一个开源的地理信息系统软件)环境下,计算两个线图层的交叉点可以通过以下步骤实现: 1. **加载线图层**:使用QGIS的API加载两个线图层。 2. **创建交叉点图层**:创建一个新的点图层用于存储交叉点。 3. **遍历线要素**:遍历两个线图层中的每一个线要素,计算它们的交叉点。 4. **添加交叉点到新图层**:将计算得到的交叉点添加到新创建的点图层中。 以下是一个简单的示例代码,展示了如何在C++中使用QGIS API计算两个线图层的交叉点: ```cpp #include <QgsVectorLayer.h> #include <QgsFeature.h> #include <QgsGeometry.h> #include <QgsFeatureIterator.h> #include <QgsProject.h> #include <QgsVectorFileWriter.h> bool calculateIntersections(const QString& layer1Path, const QString& layer2Path, const QString& outputPath) { // 加载线图层 QgsVectorLayer* layer1 = new QgsVectorLayer(layer1Path, "Layer 1", "ogr"); QgsVectorLayer* layer2 = new QgsVectorLayer(layer2Path, "Layer 2", "ogr"); if (!layer1->isValid() || !layer2->isValid()) { qDebug("One of the layers is invalid"); return false; } // 创建交叉点图层 QgsVectorLayer* intersectionLayer = new QgsVectorLayer("Point", "Intersections", "memory"); QgsFeatureList features; // 遍历第一个图层的要素 QgsFeatureIterator it1 = layer1->getFeatures(); QgsFeature f1; while (it1.nextFeature(f1)) { QgsGeometry geom1 = f1.geometry(); // 遍历第二个图层的要素 QgsFeatureIterator it2 = layer2->getFeatures(); QgsFeature f2; while (it2.nextFeature(f2)) { QgsGeometry geom2 = f2.geometry(); // 计算交叉点 QgsGeometry intersectGeom = geom1.intersection(geom2); if (intersectGeom.isNull()) { continue; } QgsFeature newFeature; newFeature.setGeometry(intersectGeom); features.append(newFeature); } } intersectionLayer->dataProvider()->addFeatures(features); // 保存交叉点图层 QgsVectorFileWriter::writeAsVectorFormat(intersectionLayer, outputPath, "UTF-8", intersectionLayer->crs(), "ESRI Shapefile"); return true; } int main(int argc, char *argv[]) { QString layer1Path = "path/to/layer1.shp"; QString layer2Path = "path/to/layer2.shp"; QString outputPath = "path/to/output.shp"; if (calculateIntersections(layer1Path, layer2Path, outputPath)) { qDebug("Intersections calculated successfully"); } else { qDebug("Failed to calculate intersections"); } return 0; } ``` ### 代码说明: 1. **加载线图层**:使用`QgsVectorLayer`加载两个线图层。 2. **创建交叉点图层**:创建一个新的内存中的点图层。 3. **遍历线要素**:使用`QgsFeatureIterator`遍历两个图层的要素,并计算它们的交叉点。 4. **添加交叉点到新图层**:将计算得到的交叉点添加到新图层中。 5. **保存交叉点图层**:使用`QgsVectorFileWriter`将交叉点图层保存为Shapefile文件。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

yuanzhengme.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值