空間演算関数は、幾何図形を生成するために使用されます。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()は空値を返します。距離が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)までの線分が残ります。これは、この部分の線分が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:クリッピングに使用される二次元境界ボックス。パラメータ名は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