ST_SymDifference — ジオメトリー A とジオメトリー B がインタセクトしていない部分を表現するジオメトリーを返します。
geometry ST_SymDifference(geometry geomA, geometry geomB, float8 gridSize = -1);
ジオメトリー A とジオメトリー B がインタセクトしていない部分を表現するジオメトリーを返します。この関数は、ST_Union(A,B) - ST_Intersection(A,B)と同じです。SymDifference (対象差) と呼ばれるのはST_Union(A,B) - ST_Intersection(A,B)だからです。
任意パラメーター gridSize が与えらえれると (GEOS-3.9.0 が必要です)、全ての結果の頂点が指定サイズのスナップ用グリッドに落ちることが保証されます。グリッド上で行われる処理は、グリッドに揃える際に意図しない小さな変更が発生する可能性があることに注意して下さい。ST_ReducePrecision を参照して下さい。
GEOS モジュールで実現しています。
Enhanced: 3.1.0 gridSize パラメータを受け付けるようになりました。
gridSize パラメータを使うには GEOS 3.9.0以上が必要です
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.1.3
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.21
この関数は3次元に対応し、Z値を削除しません。 ただし、結果は XY のみを使用して計算されます。結果の Z 値は複写するか、平均値になるか、補間されます。
この例では二つの LINESTRING について 2次元で正しく処理できる対称差を示します。
SELECT ST_SymDifference('LINESTRING(50 100,50 200)',
'LINESTRING(50 50,50 150)'
);
MULTILINESTRING((50 150,50 200),(50 50,50 100))
3次元では、この例で期待した結果が得られません。
SELECT ST_SymDifference('LINESTRING(1 2 1,1 4 2)',
'LINESTRING(1 1 3,1 3 4)');
MULTILINESTRING((1 3 4,1 4 2),(1 1 3,1 2 1))