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. 空間相等

如上所述,完全相等並沒有考慮幾何體的空間特質。有一個函式恰當地命名為 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

正如您所見,我們的所有空間相等幾何形狀也有相等的界線。很不幸的是,此測試下五邊形也被視為相等,因為它與其他幾何形狀共享相同的邊界盒。那這有什麼用呢?儘管這將在後續章節詳細介紹,簡短的回答是,這樣可以對空間索引進行使用,而這在連結或過濾資料時可以將龐大的比對集合快速縮減成較小的區塊。