空間演算関数は、幾何図形を生成するために使用されます。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番目の線分を1番目の線分から差し引いた後、残るのは点(50, 150)から点(50, 200)までの線分です。これは、この部分の線分が2番目のLineStringには存在せず、最初の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 ジオメトリオブジェクトを返します。1つの線分は (50 100) から (50 200) へ、もう1つの線分は (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:クリッピングに使用される2次元境界ボックスです。パラメータ名は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