空間関係関数は、2つの幾何値 g1 と g2 の間の関係を厳密なオブジェクトの形状を用いてテストします。戻り値1と0はそれぞれ真と偽を表し、距離関数が返す距離値を除きます。
OceanBaseデータベースで現在サポートされている空間関係関数には、ST_Intersects()、ST_Contains()、ST_Distance()、ST_Distance_Sphere()、ST_Within()、ST_Crosses()、ST_Overlaps()、_ST_Touches()、および ST_Equals() が含まれます。
ST_Intersects
ST_Intersects() 関数は、g1 が空間的に g2 と交差するかどうかを示すために、1 または 0 を返します。構文は以下のとおりです:
ST_Intersects(g1, g2)
ST_Contains
ST_Contains() 関数は、g1 が g2 を完全に含むかどうかを示すために、1 または 0 を返します。構文は以下のとおりです:
ST_Contains(g1, g2)
ST_Distance
ST_Distance() 関数は、幾何パラメータの空間参照システム (SRS) の長さ単位で測定された g1 と g2 の距離を返します。構文は以下のとおりです:
ST_Distance(g1, g2 [, unit])
ST_Distance() はオプションの unit パラメータをサポートしており、このパラメータは返される距離値の線形単位を指定します。unit パラメータを指定した場合、その単位で測定されます。
いずれかのパラメータが幾何学的に無効な場合、結果は任意の数値を返すか、エラーが発生する可能性があります。中間または最終結果で NaN または負の数が生成された場合、ER_GIS_INVALID_DATA エラーが発生します。 例:
obclient [test]> SET @geo1 = ST_GeomFromText('POINT(1 1)', 4230);
Query OK, 0 rows affected
obclient [test]> SET @geo2 = ST_GeomFromText('POINT(3 3)', 4230);
Query OK, 0 rows affected
obclient [test]> SELECT ST_Distance(@geo1, @geo2);
+---------------------------+
| ST_Distance(@geo1, @geo2) |
+---------------------------+
| 313709.8158791322 |
+---------------------------+
1 row in set
obclient [test]> SELECT ST_Distance(@geo1, @geo2, 'metre');
+------------------------------------+
| ST_Distance(@geo1, @geo2, 'metre') |
+------------------------------------+
| 313709.8158791322 |
+------------------------------------+
1 row in set
obclient [test]> SELECT ST_Distance(@geo1, @geo2, 'foot');
+-----------------------------------+
| ST_Distance(@geo1, @geo2, 'foot') |
+-----------------------------------+
| 1029231.6793934782 |
+-----------------------------------+
1 row in set
ST_Distance_Sphere
ST_Distance_Sphere() 関数は、球面上の点または多点間の最小球面距離をメートル単位で返します。構文は以下のとおりです:
ST_Distance_Sphere(g1, g2 [, radius])
オプションの radius パラメータはメートル単位である必要があります。radius パラメータが存在するが正の数ではない場合、ER_NONPOSITIVE_RADIUS エラーが発生します。距離が倍精度数の範囲を超える場合、ER_STD_OVERFLOW_ERROR エラーが発生します。
2つの幾何パラメータがいずれも地理空間参照系(SRS)内で有効な点または多点値である場合、戻り値は半径 radius の球面上における2つの幾何オブジェクト間の最短距離となります。省略された場合、デフォルトの半径は平均半径に等しく、これは (2a+b)/3 で定義されます。ここで a は SRS の長半軸、b は短半軸です。
ST_Distance_Sphere() でサポートされている幾何パラメータの組み合わせは、点と点、または点と多点(どちらのパラメータの順序でも可)です。少なくとも1つの幾何オブジェクトが点でも多点でもなく、かつその SRID が0の場合、ER_NOT_IMPLEMENTED_FOR_CARTESIAN_SRS エラーが発生します。少なくとも1つの幾何が点または多点ではなく、かつその SRID が地理 SRS を指している場合、ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS エラーが発生します。任意の幾何図形が投影された SRS を参照している場合、ER_NOT_IMPLEMENTED_FOR_ProjectED_SRS エラーが発生します。
例:
obclient [test]> SET @pt1 = ST_GeomFromText('POINT(0 0)');
Query OK, 0 rows affected
obclient [test]> SET @pt2 = ST_GeomFromText('POINT(180 0)');
Query OK, 0 rows affected
obclient [test]> SELECT ST_Distance_Sphere(@pt1, @pt2);
+--------------------------------+
| ST_Distance_Sphere(@pt1, @pt2) |
+--------------------------------+
| 20015042.813723423 |
+--------------------------------+
1 row in set
ST_IsValid
ST_IsValid() 関数のパラメータ幾何が有効な場合、1を返します。パラメータ幾何が無効な場合、0を返します。幾何的有効性は OGC 規格によって定義されています。構文は以下のとおりです:
ST_IsValid(g)
唯一有効な空の幾何オブジェクトは、空の幾何オブジェクトの集合値として表されます。この場合、ST_IsValid() は1を返します。空間データ規格でサポートされている EMPTY 値、例えば POINT EMPTY はサポートされていません。
obclient [test]> SET @ls_test1 = ST_GeomFromText('LINESTRING(0 0,-0.00 0,0.0 0)');
Query OK, 0 rows affected
obclient [test]> SET @ls_test2 = ST_GeomFromText('LINESTRING(0 0, 1 1)');
Query OK, 0 rows affected
obclient [test]> SELECT ST_IsValid(@ls_test1);
+------------------+
| ST_IsValid(@ls1) |
+------------------+
| 0 |
+------------------+
1 row in set
obclient [test]> SELECT ST_IsValid(@ls_test2);
+------------------+
| ST_IsValid(@ls2) |
+------------------+
| 1 |
+------------------+
1 row in set
ST_Within
ST_Within() は、g1 が空間的に g2 の内部にあるかどうかを示すために 1 または 0 を返します。ST_Contains() とは逆の関係です。構文は以下のとおりです:
ST_Within(g1, g2)
ST_Crosses
ST_Crosses 関数は、g1 が空間的に g2 と交差しているかどうかを示すために 1 または 0 を返します。g1 と g2 が交差する場合は 1 を返し、交差しない場合は 0 を返します。また、ST_Crosses 関数は空間インデックスをサポートしています。
ST_Crosses(g1, g2) と ST_Intersects(g1, g2) はどちらも空間関係関数であり、2つの幾何オブジェクトの空間的な関係を判断するために使用されますが、定義と用途は若干異なります。
ST_Intersects(g1, g2)関数は、2つの幾何オブジェクトが空間的に交差しているかどうかを判断するために使用されます。これは、少なくとも1つの共通点(境界や内部を含む)を共有していることを意味します。2つのオブジェクトに点、線、または面のいずれかの重なりがある場合、
ST_Intersects(g1, g2)は 1 を返します。ST_Crosses(g1, g2)関数は、2つの幾何オブジェクトが「交差」しているかどうかを判断するために使用されます。幾何学では特定の定義があります:一方のオブジェクトがもう一方のオブジェクトの内部を部分的に通過している必要があります。
具体的には、2つの線分幾何オブジェクトについて、それらが2点以上で交差し、内部でも交差する場合、ST_Crosses(g1, g2) は 1 を返します。線と面の幾何オブジェクトについて、線が面の内部を通過する場合、ST_Crosses(g1, g2) は 1 を返します。
ST_Intersects(g1, g2) とは異なり、ST_Crosses(g1, g2) は2つのオブジェクトの完全な重なりや境界が接触している場合を考慮しません。
ST_Intersects(g1, g2) は2つの幾何オブジェクトに任意の種類の交差があるかどうかを検出するのに対し、ST_Crosses(g1, g2) は一方のオブジェクトがもう一方のオブジェクトを通過しているかどうかを特別に検出します。例えば、道路が土地を横切っているかどうかを知りたい場合は ST_Crosses(g1, g2) を使用し、その土地を覆ったり接触したりするすべてのルートを見つける必要がある場合は ST_Intersects(g1, g2) を使用します。
構文は以下のとおりです:
ST_Crosses(g1,g2)
例:
obclient > select st_crosses(st_geomfromtext('LINESTRING(1 1, 11 11)'), st_geomfromtext('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'));
この例では、ST_Crosses は線形幾何オブジェクト(この例では点 (1,1) から点 (11,11) までの直線)が多角形幾何オブジェクト(ここでは点 (0,0), (0,10), (10,10), (10,0), (0,0) で構成される正方形)を通過しているかどうかを判断します。結果は 1 で、線が多角形を通過したことを示しています。
結果は次のとおりです:
+------------------------------------------------------------------------------------------------------------------+
| st_crosses(st_geomfromtext('LINESTRING(1 1, 11 11)'), st_geomfromtext('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))')) |
+------------------------------------------------------------------------------------------------------------------+
| 1 |
+------------------------------------------------------------------------------------------------------------------+
1 row in set
ST_Overlaps
ST_Overlaps(g1,g2) 関数は、2つの幾何オブジェクト g1 と g2 が空間的に部分的に重なっているかどうかを判定し、1または0を返します。ただし、互いに完全に含まれるわけではありません。g1 と g2 が重なる場合は1を返し、重ならない場合、または一方がもう一方を完全に含む場合は0を返します。ST_Overlaps(g1,g2) 関数は空間インデックスをサポートしています。
2つの線分幾何オブジェクトについて、共通の線分を持ちながらどちらの線ももう一方を完全には含まない場合、ST_Overlaps(g1,g2) は1を返します。 面幾何オブジェクト(例:ポリゴン)について、2つのポリゴンが少なくとも部分的に重なり、かつ各ポリゴンにはもう一方と重ならない部分がある場合、ST_Overlaps(g1,g2) は1を返します。
構文は以下のとおりです:
ST_Overlaps(g1,g2)
例:
obclient > SELECT ST_OVERLAPS(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0),(2 2,2 4,4 4,4 2,2 2))'), ST_GEOMFROMTEXT('POLYGON((0 0,0 5,5 5,5 0,0 0))'));
この例では、ST_Overlaps 関数が2つのポリゴンが重なっているかどうかを判定します。最初のポリゴン POLYGON((0 0,0 10,10 10,10 0,0 0,0 0),(2 2,2 4,4 4,4 2,2 2)) は10 ✖️ 10の正方形で、内部に2✖️2の穴(空間内の小さな正方形)があります。2番目のポリゴン POLYGON((0 0,0 5,5 5,5 0,0 0)) は5✖️5の正方形で、最初のポリゴンの左下隅に位置します。2番目のポリゴンは最初のポリゴンの内部領域と重なりながらも完全には含まれないため、ST_Overlaps 関数は1を返します。
結果は次のとおりです:
+-------------------------------------------------------------------------------------------------------------------------------------------------+
| ST_OVERLAPS(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0),(2 2,2 4,4 4,4 2,2 2))'), ST_GEOMFROMTEXT('POLYGON((0 0,0 5,5 5,5 0,0 0))')) |
+-------------------------------------------------------------------------------------------------------------------------------------------------+
| 1 |
+-------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set
_ST_Touches
_ST_Touches(geometry A, geometry B) 関数は、2つの幾何オブジェクト A と B の境界に少なくとも1つの共通点があり、かつ内部が互いに交わらないかどうかを判断します。また、_ST_Touches(geometry A, geometry B) 関数は空間インデックスをサポートしています。
ここで注意が必要なのは、2つの幾何オブジェクトがどちらも点(Point)型の場合、_ST_Touches(geometry A, geometry B) 関数は0を返すということです。これは、点幾何オブジェクトに境界がないため、2つの点が「接触」しているとはみなせないからです。それらは同じもの(位置が完全に一致する場合)か、完全に独立したもののいずれかです。
構文は以下のとおりです:
_ST_Touches(geometry A, geometry B)
例:
obclient > SELECT _ST_Touches(st_geomfromtext('LINESTRING(0 0, 1 1, 0 2)'), st_geomfromtext('POINT(0 2)'));
この例では、_ST_Touches 関数は、線形幾何オブジェクト(LineString)と点幾何オブジェクト(Point)が空間的に接触しているかどうかを判断するために使用されています。点 (0 2) は線 (0 0, 1 1, 0 2) の終点であるため、結果1はこれら2つのオブジェクトが接触していることを示しています。
戻り値は以下のとおりです:
+------------------------------------------------------------------------------------------+
| _ST_Touches(st_geomfromtext('LINESTRING(0 0, 1 1, 0 2)'), st_geomfromtext('POINT(0 2)')) |
+------------------------------------------------------------------------------------------+
| 1 |
+------------------------------------------------------------------------------------------+
1 row in set
ST_Equals
ST_Equals(geometry A, geometry B) 関数は、2つの幾何オブジェクト A と B が空間構造上で等しいかどうかを判断します。つまり、これら2つの幾何オブジェクトが同じ点集合を含み、かつ各点の相対的な位置が両方のオブジェクトで同じであることを意味します。ただし、点の順序が完全に同一である必要はありません。
言い換えれば、2つの幾何オブジェクトが全く同じ空間範囲を占め、その形状とサイズが完全に一致している場合、ST_Equals は1を返します。2つの幾何オブジェクトがいかなる点でも異なる場合(サイズや形状のわずかな違いであっても)、ST_Equals 関数は0を返します。
ST_Equals(geometry A, geometry B) 関数は空間インデックスをサポートしています。
構文は以下のとおりです:
ST_Equals(geometry A, geometry B);
例:
obclient > SELECT ST_Equals(ST_GeomFromText('LINESTRING(0 0, 10 10)'), ST_GeomFromText('LINESTRING(0 0, 5 5, 10 10)'));
この例では、ST_Equals 関数を使用して、2本の線が空間的に等しいかどうかを判断します。1本目の線は、点 (0, 0) から点 (10, 10) までの単純な直線です。2本目の線も点 (0, 0) から点 (10, 10) までですが、中間点 (5, 5) を通過します。2本目の線は追加の頂点を含んでいますが、空間的に同じ点集合を覆っているため、ST_Equals はこれら2本の線が空間構造上等しいと判断し、結果1を返します。
結果は次のとおりです:
+------------------------------------------------------------------------------------------------------+
| ST_Equals(ST_GeomFromText('LINESTRING(0 0, 10 10)'), ST_GeomFromText('LINESTRING(0 0, 5 5, 10 10)')) |
+------------------------------------------------------------------------------------------------------+
| 1 |
+------------------------------------------------------------------------------------------------------+
1 row in set
パラメータの注意事項
空間関係関数における幾何パラメータの戻り値は、以下の場合を除き、NULL ではありません:
いずれかのパラメータが
NULLであるか、いずれかの幾何パラメータが空のジオメトリの場合、戻り値はNULLとなります。いずれかの幾何パラメータの構文が正しくない場合、
ER_GIS_INVALID_DATAエラーが発生します。いずれかの幾何パラメータが定義されていない空間参照システム (SRS) に属する場合、
ER_SRS_NOT_FOUNDエラーが発生します。複数の幾何パラメータを使用する関数において、これらのパラメータが同一の SRS に含まれていない場合、
ER_GIS_DIFFERENT_SRIDSエラーが発生します。いずれかの幾何パラメータが無効な場合、結果は True または False になるか、エラーが発生する可能性があります。
地理 SRS の幾何パラメータにおいて、いずれかのパラメータの経度または緯度が範囲を超えた場合(範囲は度単位です。SRS が他の単位を使用する場合は、その単位の対応する値を使用します)、エラーが発生します:
経度値が範囲(-180、180])外にある場合、
ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGEエラーが発生します。緯度値が [−90, 90] の範囲外にある場合、
ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGEエラーが発生します。
空間計算の座標精度は (-9.223e18, 9.223e18) を超えてはなりません。超えた場合、エラーが発生します:
obclient [test]> SELECT ST_CONTAINS(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 1e+19,0 0,0 0,0 1e+19)))'), ST_GEOMFROMTEXT('POLYGON((0 0,0 0,0 0,0 0))')); ERROR 1690 (22003): coordinate value is out of range in 'st_contains'