空間演算関数は、幾何図形を生成するために使用されます。OceanBaseデータベースで現在サポートされている空間演算関数は、ST_BUFFER(), ST_BUFFER_STRATEGY(), ST_Transform(), ST_difference(), ST_union(), ST_symDifference(), および _ST_ClipByBox2D() です。
ST_BUFFER
ST_BUFFER() は、幾何値 g からの距離が距離パラメータ d 以下のすべての点を返します。結果は幾何パラメータと同じ SRS 内にあります。構文は以下のとおりです:
ST_Buffer(g, d [, strategy1 [, strategy2 [, strategy3]]])
d パラメータは 0.1 より小さくすることはできません。そうである場合はエラーが発生します。パラメータが空の場合、ST_BUFFER() は NULL 値を返します。距離が 0 の場合、ST_BUFFER() は幾何パラメータ g を返します。
例:
obclient [test]> SET @pt = ST_GeomFromText('POINT(1 1)');
Query OK, 0 rows affected
obclient [test]> SELECT ST_AsText(ST_Buffer(@pt, 0));
+------------------------------+
| ST_AsText(ST_Buffer(@pt, 0)) |
+------------------------------+
| POINT(1 1) |
+------------------------------+
1 row in set
ST_BUFFER() では、距離パラメータ d の後に最大 3 つのオプションの strategy パラメータを指定できます。これらの戦略はバッファ計算に影響します。これらのパラメータは、点、接続、終端戦略に使用される ST_BUFFER_Strategy() 関数によって生成されたバイト文字列です:
- 点戦略は点および多点ジオメトリに適用されます。点戦略が指定されていない場合、デフォルトは
ST_BUFFER_Strategy('point_circle', 32)です。 - 接続戦略は LineString、MultiLineString、Polygon、MultiPolygon に適用されます。接続戦略が指定されていない場合、デフォルトは
ST_BUFFER_Strategy('join_round', 32)です。 - 終端戦略は LineString および MultiLineString に適用されます。終端戦略が指定されていない場合、デフォルトは
ST_BUFFER_Strategy('end_round', 32)です。
各タイプにつき最大 1 つの戦略を指定でき、順序は問いません。
バッファ戦略が無効な場合、ER_wrong_ARGUMENTS エラーが発生します。以下のいずれかの場合、戦略は無効です:
- 指定したタイプに対して複数の戦略(点、接続、または終端)を指定した場合。
strategyパラメータに戦略の値(例:任意のバイナリ文字列や数値)以外のものを渡した場合。Point戦略を渡したにもかかわらず、ジオメトリにPointまたはMultiPoint値が含まれていない場合。- 終端または接続戦略を渡したにもかかわらず、ジオメトリに
LineString、Polygon、MultiLinestring、またはMultiPolygon値が含まれていない場合。
例:
obclient [test]> SET @pt_strategy = ST_Buffer_Strategy('point_square');
Query OK, 0 rows affected
obclient [test]> SELECT ST_AsText(ST_Buffer(@pt, 1, @pt_strategy));
+--------------------------------------------+
| ST_AsText(ST_Buffer(@pt, 1, @pt_strategy)) |
+--------------------------------------------+
| POLYGON((-1 -1,1 -1,1 1,-1 1,-1 -1)) |
+--------------------------------------------+
1 row in set
obclient [test]> SET @ls = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)');
Query OK, 0 rows affected
obclient [test]> SET @end_strategy = ST_Buffer_Strategy('end_flat');
Query OK, 0 rows affected
obclient [test]> SET @join_strategy = ST_Buffer_Strategy('join_round', 5);
Query OK, 0 rows affected
obclient [test]> SELECT ST_AsText(ST_Buffer(@ls,3, @end_strategy, @join_strategy));
+------------------------------------------------------------------------------------+
| ST_AsText(ST_Buffer(@ls,3, @end_strategy, @join_strategy)) |
+------------------------------------------------------------------------------------+
| POLYGON((3 2,5 2,5 8,0 8,-2.1213203435596424 7.121320343559643,-3 5,-3 0,3 0,3 2)) |
+------------------------------------------------------------------------------------+
1 row in set
ST_BUFFER_STRATEGY
ST_BUFFER_STRATEGY() 関数は、ST_BUFFER() のバッファ計算に使用されるストラテジーの文字列を返します。
ST_Buffer_Strategy(strategy [, points_per_circle])
最初のパラメータは、ストラテジーオプションを示す文字列でなければなりません:
- ポイントストラテジーでは、
point_circleとpoint_squareを指定できます。 - 接続ストラテジーでは、
join_roundとjoin_miterを指定できます。 - 終端ストラテジーでは、
end_roundとend_flatを指定できます。
最初のパラメータが point_circle、join_round、join_miter、または end_round の場合、points_per_circle パラメータは正の数値でなければなりません。points_per_circle の最大値はシステム変数 max_points_in_geometry の値です。
ST_BUFFER_STRATEGY() のパラメータについて、さらに注意が必要な点は以下の通りです:
- いずれかのパラメータが無効な場合、
ER_wrong_ARGUMENTSエラーが発生します。 - 最初のパラメータが
point_squareまたはend_flatの場合、points_per_circleパラメータを指定することはできません。指定した場合、ER_wrong_ARGUMENTSエラーが発生します。
ST_Transform
ST_Transform() 関数は、幾何オブジェクトをある空間参照系(SRS)から別の空間参照系に変換するために使用されます。戻り値は、入力幾何オブジェクトと同じ型の幾何オブジェクトであり、すべての座標がターゲットSRID、すなわち target_srid に変換されています。この関数の変換サポートは地理SRSに限定されており、幾何パラメータのSRIDがターゲットSRID値と同じ場合にのみ、有効なSRIDを持つ入力オブジェクトを直接返します。
ST_Transform() のパラメータについては、以下の点に注意してください:
- 地理SRSのSRID値を持つ幾何パラメータはエラーを発生させません。
- 几何またはターゲットSRIDパラメータが定義されていない空間参照系(SRS)のSRID値を参照している場合、
ER_SRS_NOT_FOUNDエラーが発生します。 - 几何オブジェクトが
ST_Transform()で変換できないSRSにある場合、ER_TRANSFORM_SOURCE_SRS_NOT_SUPPORTEDエラーが発生します。 - ターゲットSRIDが
ST_Transform()で変換できないSRSにある場合、ER_TRANSFORM_TARGET_SRS_NOT_SUPPORTEDエラーが発生します。 - 几何オブジェクトがWGS 84以外のSRSにあり、かつTOWGS84句がない場合、
ER_TRANSFORM_SOURCE_SRS_MISSING_TOWGS84エラーが発生します。 - ターゲットSRIDがWGS 84以外のSRSにあり、かつTOWGS84句がない場合、
ER_TRANSFORM_TARGET_SRS_MISSING_TOWGS84エラーが発生します。
ST_SRID(g, target_srid) と ST_Transform(g, target_srid) の違いは以下の通りです:
ST_SRID()は幾何SRID値を変更しますが、座標は変換しません。ST_Transform()はSRID値を変更するだけでなく、幾何座標も変換します。
例:
obclient [test]> SET @pt = ST_GeomFromText('POINT(52.381389 13.064444)', 4326);
Query OK, 0 rows affected (
obclient [test]> SELECT ST_AsText(@pt);
+----------------------------+
| ST_AsText(@pt) |
+----------------------------+
| POINT(52.381389 13.064444) |
+----------------------------+
1 row in set
obclient [test]> SET @pt = ST_Transform(@pt, 4230);
Query OK, 0 rows affected
obclient [test]> SELECT ST_AsText(@pt);
+---------------------------------------------+
| ST_AsText(@pt) |
+---------------------------------------------+
| POINT(52.38208611407426 13.065520672345304) |
+---------------------------------------------+
1 row in set
ST_Difference
ST_Difference(g1, g2) 関数は、ある幾何オブジェクト g1 から別の幾何オブジェクト g2 と交差する部分を引くために使用され、A - ST_Intersection(A, B) と同じです。この関数は、幾何オブジェクト g1 のうち、幾何オブジェクト g2 と交差しない部分を返します。
制限事項:
- 几何オブジェクト
g1とg2は同一の座標空間に存在していなければなりません。 g1とg2は有効な幾何オブジェクトでなければなりません。- もし
g1とg2が交差しない場合、ST_Difference(g1, g2)はg1の完全なコピーを返します。 - もし
g1がg2の完全な部分集合である場合、ST_Difference(g1, g2)は空の幾何オブジェクトを返します。
構文は以下のとおりです:
ST_Difference(geometry g1, geometry g2)
例:
obclient > SELECT ST_AsText(ST_Difference(ST_GeomFromText('LINESTRING(50 100, 50 200)'),ST_GeomFromText('LINESTRING(50 50, 50 150)')));
この例では、ST_Difference 関数を用いて、2つの線形幾何オブジェクトの差集合を計算します。ここでは、最初の LineString は点 (50 100) から点 (50 200) まで、2番目の LineString は点 (50 50) から点 (50 150) までです。これら2つの線分には、点 (50 100) から点 (50 150) までの重なる領域があります。
2番目の線分を最初の線分から引くと、残るのは点 (50 150) から点 (50 200) までの線分です。これは、この部分の線分が最初の LineString にのみ存在し、2番目の LineString には存在しないためです。クエリ結果は ST_AsText 関数を使用して WKT 形式の文字列に変換されます。
結果は次のとおりです:
+----------------------------------------------------------------------------------------------------------------------+
| ST_AsText(ST_Difference(ST_GeomFromText('LINESTRING(50 100, 50 200)'),ST_GeomFromText('LINESTRING(50 50, 50 150)'))) |
+----------------------------------------------------------------------------------------------------------------------+
| LINESTRING(50 150,50 200) |
+----------------------------------------------------------------------------------------------------------------------+
1 row in set
ST_Union
ST_Union(g1, g2) 関数は、2つの幾何オブジェクト g1 と g2 の空間的内容を結合し、これら2つの幾何オブジェクトの和集合を返します。和集合とは、g1 または g2 に属する、あるいは両方に属するすべての点の集合です。
ST_Union 関数は、g1 と g2 に含まれるすべての点を含む新しい幾何オブジェクトを作成します。g1 と g2 が交差するか隣接するポリゴンの場合、結果は結合されたポリゴンになります。線分や点の集合である場合、結果にはすべての線分と点が含まれます。
制限事項:
g1とg2は同じ座標空間に存在している必要があります。g1とg2は有効な幾何オブジェクトでなければなりません。つまり、自己交差やその他の不正な幾何構造がないことが必要です。g1とg2が非連続な幾何オブジェクトの場合、結果はMULTIPOLYGONやMULTILINESTRINGなどのマルチジオメトリ (MultiGeometry) オブジェクトになります。
構文は以下のとおりです:
ST_Union(geometry g1, geometry g2)
例:
obclient > SELECT ST_AsText(ST_Union(ST_GeomFromText('LINESTRING(50 100, 50 200)'),ST_GeomFromText('LINESTRING(50 50, 50 150)')));
この例では、ST_Union 関数を使用して、2つの線形幾何オブジェクトの和集合を計算します。最初の LineString は点 (50 100) から点 (50 200) へ、2番目の LineString は点 (50 50) から点 (50 150) へと続きます。これら2つの線分には、点 (50 100) から点 (50 150) までの重なり領域があります。
ST_Union 関数はこれら2つの線分を結合し、2つの非重複の線分を含む MULTILINESTRING ジオメトリオブジェクトを返します。一方の線分は (50 100) から (50 200) へ、もう一方の線分は (50 50) から (50 100) へと続きます。これら2つの線分が合わさって、元の線分が覆っていた空間範囲を形成します。クエリ結果は、ST_AsText 関数を使用して WKT 形式の文字列に変換されます。
実行結果は次のとおりです:
+-----------------------------------------------------------------------------------------------------------------+
| ST_AsText(ST_Union(ST_GeomFromText('LINESTRING(50 100, 50 200)'),ST_GeomFromText('LINESTRING(50 50, 50 150)'))) |
+-----------------------------------------------------------------------------------------------------------------+
| MULTILINESTRING((50 100,50 200),(50 50,50 100)) |
+-----------------------------------------------------------------------------------------------------------------+
1 row in set
ST_SymDifference
ST_SymDifference 関数は、対称差(Symmetric Difference)を表し、2つの幾何オブジェクト geomA と geomB の重ならない部分を返します。対称差とは、geomA または geomB に属するが、両者の共通部分には属さないすべての点の集合を指します。
この関数の結果は、まず geomA と geomB の和集合 (ST_Union(geomA, geomB)) を計算し、次にその和集合から共通部分 (ST_Intersection(geomA, geomB)) を引くことで得られます。すなわち、ST_Difference(ST_Union(geomA, geomB), ST_Intersection(geomA, geomB)) となります。
制限事項:
geomAとgeomBは同じ座標参照システム(CRS)を使用している必要があります。geomAとgeomBは有効な幾何オブジェクトでなければならず、自己交差やその他のトポロジー的エラーがあってはなりません。
対称差は、元の幾何型とは異なる結果を生じる可能性があります。例えば、2つの重なり合う多角形の対称差は、2つの分離した多角形、あるいは多重多角形(MULTIPOLYGON)になる場合があります。
geomA と geomB に重なりがない場合(つまり共通部分が空の場合)、対称差はそれらの単純な結合と同じになります。
geomA と geomB が完全に同じ場合、対称差は空の幾何オブジェクトになります。
構文は以下のとおりです:
ST_SymDifference(geometry geomA, geometry geomB)
例:
obclient > SET @g1 = ST_GeomFromText('MULTIPOINT(5 0,15 10,15 25)');
Query OK, 0 rows affected (0.001 sec)
obclient > SET @g2 = ST_GeomFromText('MULTIPOINT(1 1,15 10,15 25)');
Query OK, 0 rows affected (0.001 sec)
obclient > SELECT ST_AsText(ST_SymDifference(@g1, @g2));
この例では、まず ST_GeomFromText 関数を使用して2つの MULTIPOINT 型の幾何オブジェクトを作成し、変数 @g1 と @g2 に格納します。これら2つの幾何オブジェクトはそれぞれ MULTIPOINT(5 0,15 10,15 25) と MULTIPOINT(1 1,15 10,15 25) です。
次に、ST_SymDifference 関数を使用して @g1 と @g2 の対称差を計算します。これは、2つの MULTIPOINT 几何オブジェクトで共有されていない点を見つけることを意味します。この例では、点 (15 10) と (15 25) は共有されているため、対称差には含まれません。
最後に、ST_AsText 関数を使用して幾何オブジェクトをWKT形式に変換します。クエリの結果は MULTIPOINT((1 1),(5 0)) であり、@g1 と @g2 の唯一の違いは点 (1 1) と (5 0) にあることを示しています。これらはまさに共有されていない点です。
実行結果は以下のとおりです:
+---------------------------------------+
| ST_AsText(ST_SymDifference(@g1, @g2)) |
+---------------------------------------+
| MULTIPOINT((1 1),(5 0)) |
+---------------------------------------+
1 row in set
_ST_ClipByBox2D
_ST_ClipByBox2D 関数は、幾何学的クリッピングに使用されます。この関数は、入力された幾何オブジェクト geom を二次元バウンディングボックス(box2d)box と交差させ、交差部分を新しい幾何オブジェクトとして返します。この操作は、まるで「はさみ」でバウンディングボックスに沿って幾何オブジェクトを切り抜くようなものです。
_ST_ClipByBox2D は高速なクリッピング関数であり、高性能なクリッピング操作を提供することを目的としていますが、そのためにいくつかの制限事項と注意点があります:
使用上の制限:
この関数は入力された幾何体 geom の正当性をチェックしません。そのため、入力された幾何オブジェクト自体が無効な場合、出力結果も無効になる可能性があります。 同様に、この関数は出力される幾何体が正当であることを保証するものではないため、出力された幾何オブジェクトはさらなる処理を必要とする場合があります。 高速なクリッピングのため、精密なクリッピングが必要な場合や、クリッピング結果が必ずしも正当な幾何体である必要があるシナリオには適用できない場合があります。
構文は以下のとおりです:
_ST_ClipByBox2D(geometry geom, box2d box);
パラメータの説明:
geom:クリッピング対象の元の幾何オブジェクト。box:クリッピングに使用される二次元バウンディングボックス。パラメータ名は box2d ですが、実際には任意の幾何オブジェクトを受け付け、関数はそれを対応するバウンディングボックスに変換します。
例:
obclient > SELECT ST_ASTEXT(_ST_ClipByBox2D(ST_GEOMFROMTEXT('POLYGON((-2 -2, -2 11, 11 11, 11 -2, -2 -2))'), _ST_MakeEnvelope(0,0,10,10)));
この例では、まず ST_GeomFromText を使用して、4辺からなる多角形の幾何オブジェクトを作成します。この多角形は、(-2 -2) から始まり、(-2 11)、(11 11)、そして (11 -2) を経て、(-2 -2) で閉じます。
次に _ST_MakeEnvelope を使用して、座標 (0, 0) と (10, 10) の間に長方形を定義するバウンディングボックスを作成します。
その後、_ST_ClipByBox2D 関数が作成したバウンディングボックスを使用して多角形をクリッピングし、バウンディングボックスと交差する部分のみを保持します。
最後に、ST_AsText 関数がクリッピング後の多角形を WKT 形式の文字列に変換します。クエリの結果、クリッピング後の多角形も長方形であり、その辺はバウンディングボックスと一致していることが確認できます。すなわち、左下が (0, 0)、右上が (10, 10) の長方形です。
戻り値は以下のとおりです:
+--------------------------------------------------------------------------------------------------------------------------+
| ST_ASTEXT(_ST_ClipByBox2D(ST_GEOMFROMTEXT('POLYGON((-2 -2, -2 11, 11 11, 11 -2, -2 -2))'), _ST_MakeEnvelope(0,0,10,10))) |
+--------------------------------------------------------------------------------------------------------------------------+
| POLYGON((0 0,0 10,10 10,10 0,0 0)) |
+--------------------------------------------------------------------------------------------------------------------------+
1 row in set