24. 等同性

24.1. 等同性

在空间数据处理中,几何对象的等同性判断可能较为复杂。PostGIS 提供三种不同的函数来实现不同级别的等同性判断,为明确起见,我们采用以下定义。以下面这组多边形为例进行说明。

_images/polygon-table.png

以下命令用于加载这些多边形数据。

CREATE TABLE polygons (id integer, name varchar, poly geometry);

INSERT INTO polygons VALUES
  (1, 'Polygon 1', 'POLYGON((-1 1.732,1 1.732,2 0,1 -1.732,
      -1 -1.732,-2 0,-1 1.732))'),
  (2, 'Polygon 2', 'POLYGON((-1 1.732,-2 0,-1 -1.732,1 -1.732,
      2 0,1 1.732,-1 1.732))'),
  (3, 'Polygon 3', 'POLYGON((1 -1.732,2 0,1 1.732,-1 1.732,
      -2 0,-1 -1.732,1 -1.732))'),
  (4, 'Polygon 4', 'POLYGON((-1 1.732,0 1.732, 1 1.732,1.5 0.866,
      2 0,1.5 -0.866,1 -1.732,0 -1.732,-1 -1.732,-1.5 -0.866,
      -2 0,-1.5 0.866,-1 1.732))'),
  (5, 'Polygon 5', 'POLYGON((-2 -1.732,2 -1.732,2 1.732,
      -2 1.732,-2 -1.732))');
_images/start13.png

24.1.1. 完全相等

精确相等性通过逐顶点顺序比对两个几何图形的位置是否完全一致来确定。以下示例展示了该方法的局限性。

SELECT a.name, b.name,
  CASE WHEN ST_OrderingEquals(a.poly, b.poly)
       THEN 'Exactly Equal'
       ELSE 'Not Exactly Equal' END
  FROM polygons AS a, polygons AS b;
_images/start14.png

在示例中,这些多边形仅与自身相等,而不会与其他看似相同的多边形相等(例如多边形 1 到 3 的情况)。对于多边形 1、2 和 3,它们的顶点位置相同,但定义顺序不同。而多边形 4 在六边形的边上包含共线(因此是多余的)顶点,导致它与多边形 1 不相等。

24.1.2. 空间相等

如前述所示,精确相等性检测并未考虑几何图形的空间特性。为此,系统专门提供:command:`ST_Equals`函数,用于检测几何图形间的空间相等性或等价关系。

SELECT a.name, b.name,
  CASE WHEN ST_Equals(a.poly, b.poly)
       THEN 'Spatially Equal'
       ELSE 'Not Equal' END
  FROM polygons AS a, polygons AS b;
_images/start15.png

这一结果更符合我们对"相等性"的直观理解——多边形1至4因其包围的区域完全相同而被判定为相等。需特别注意:多边形的绘制方向、定义起点或顶点数量均不影响判定,关键在于多边形是否占据相同的空间范围。

24.1.3. 边界相等

精确相等性检测在最坏情况下需要逐顶点比对几何图形的所有坐标点,这种计算可能较慢,尤其不适用于海量几何数据的比对。为提升比对效率,系统提供了边界相等运算符 ~=,该运算符仅对比几何图形的外包矩形(边界框),确保几何体占据相同的二维空间范围,但不保证实际空间位置完全一致。

SELECT a.name, b.name,
  CASE WHEN a.poly ~= b.poly
       THEN 'Equal Bounds'
       ELSE 'Non-equal Bounds' END
  FROM polygons AS a, polygons AS b;
_images/start17.png

如图所示,所有空间相等的几何图形必然具有相等的边界框。但值得注意的是,多边形5在此测试中也会被判定为相等——因其边界框与其他图形重合。这种机制的实用价值在于:虽然后续将详细阐述,但简而言之,它能利用空间索引在数据连接或过滤时,将海量比对集快速缩减至更易处理的区块规模。