空間関係関数は、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() 関数は、g1 と g2 の距離を、幾何パラメータの空間参照システム (SRS) の長さ単位で測定して返します。構文は以下のとおりです:
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本目の線には余分な頂点が1つ含まれていますが、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'