处理无效的几何(QGIS3)¶
使用矢量数据层时,可能会遇到几何错误。在运行地理处理,数字化,编辑或数据转换后,这些错误通常会成为数据的一部分。QGIS3带有内置工具和算法,可以检测和修复无效的几何形状。本教程将向您展示处理数据中无效几何图形的典型工作流程。
注解
不同的软件系统实现不同的几何有效性概念。但是,用于GIS的几何模型的主要标准是OGC Simple Features Specifications (SFS)。在本教程中,我们将使用GEOS库检查使用此标准的几何有效性。This post 很好地概述了OGC标准定义的常见几何错误。
获取数据¶
Datameet 为印度提供了社区创建的行政边界shapefile。
下载 India - State Boundaries shapefile。下载的档案包含多个文件夹。提取档案并使用 States/
文件夹中的文件。
资料来源:[DATAMEET] _
程序¶
在QGIS浏览器中浏览到下载的
India-States.zip
文件。将其展开并将India-States.shp
文件拖到地图画布上。
您将在 Layers 面板中看到一个新的
India-States
层。进入 。
我们将尝试在输入层上运行处理算法,以演示无效的几何形状如何在地理处理操作期间引起问题。搜索并找到
算法。双击以启动它。
在 Topological coloring 对话框中,选择
India-States
作为 Input layer。将所有其他参数保留为默认值,然后单击 Run。
注解
拓扑着色 算法实现了对地图进行着色的算法,以使相邻的多边形都不具有相同的颜色。这是一种有用的制图技术,Four Color Theorem 指出4种颜色足以实现此结果。该定理有一个图论版本,称为 Five color theorem。QGIS算法的实现基于图形,因此在实践中您将看到诸如此类的复杂多边形层最多需要5种颜色。
随着算法的运行,您会在 Log 标签中看到警告。输入图层中的1个要素的几何无效,并且在处理过程中被跳过。处理工具箱中用于处理无效几何的默认设置位于 ,并设置为
Skip (ignore) features with invalid geometries
。这是一个很好的默认设置,但是如果输入很大,您可能会错过此警告,并且可能不知道已跳过输入功能。您可能需要将值更改为Stop algorithm execution when a geometry is invalid
。
回到QGIS主窗口中,您将看到一个新的
Colored
层添加到 Layers 面板中。请注意,新图层缺少几何无效的状态。现在我们知道这个特定的状态多边形具有无效的几何形状,但是我们不知道是什么原因。我们可以很容易地发现这一点。搜索并找到 算法。
在 Check Validity 对话框中,选择
India-States
作为 Input layer。选择GEOS
作为 Method。点击 Run。
当算法完成处理后,您将在 Layers 面板中看到3个新层-
Valid output
,Invalid output
和Error output
。Error output
层包含几何错误的位置和描述。右键单击它,然后选择 Open Attribute Table。
您会看到错误消息是 Ring self-intersection。选择该行,然后单击 Zoom map to selected features 按钮。放大时,您将看到几何错误的根本原因。
QGIS带有内置算法,可自动修复几何错误。搜索并找到
算法。双击运行它。
在 Fix Geometries 对话框中,选择
India-States
作为 Input layer ,然后单击 Run。
一个新的图层
Fixed Geometries
将被添加到 Layers 面板中。至此,几何错误已修复,您可以在此层上运行任何处理算法而不会出现问题。但是我们可以看到,相邻多边形之间仍然存在间隙,这是无法预料的,并且可能导致线下的拓扑错误。我们也可以通过编辑多边形来解决此问题。在 Digitizing Toolbar 中单击 Toggle Editing 按钮。选择 Vertex Tool,然后从下拉列表中选择Vertex Tool (Current Layer)
。
激活顶点工具后,单击一个顶点将其选中。您可以按 Delete 键删除一个顶点或拖动它以移动它。您可以移动顶点,以使多边形边缘现在接触相邻的多边形。
完成后,再次单击 Toggle Editing 按钮,然后单击 Save。
让我们再次运行
算法。
在 Topological Coloring 对话框中,确保选择
Fixed Geometries
作为 Input layer。点击 Run。
您将看到算法运行无误,并且将新图层
Colored
添加到 Layers 面板中。请注意,该算法不会单独为图层着色,而是通过向每个多边形添加一个称为color_id
的新列来工作,该列可用于分配与相邻多边形不同的唯一颜色。选择Colored
图层,然后单击 Open the Layer Styling Panel 按钮。
选择
Categorized
渲染器并选择color_id
列作为 Value 的值。单击 Classify。现在,您将看到彩色地图,以便相邻的多边形具有不同的颜色。