空間分析関数は、バッファ分析、結合、クリッピングなどの複雑な空間処理や分析を実行するための関数です。
OceanBaseデータベースが現在サポートしている空間分析関数には、ST_Length()、ST_Centroid()、および _ST_PointOnSurface() が含まれます。
ST_Length
ST_Length(ls[,unit])関数は、線分、折れ線、または曲線などの線形幾何体の長さを計算するために使用されます。この関数は通常、LINESTRINGおよびMULTILINESTRINGタイプのジオメトリオブジェクトに適用されます。
単位変換を有効にするには、ジオメトリlsに関連付けられた空間参照系ID(SRID)があり、そのSRIDが0でない必要があります(SRID=0は通常空間参照がないことを意味します)。
使用する単位は、データベースがサポートする有効な単位であり、データベースがその単位に対応する変換係数を認識できるものである必要があります。
すべての単位とそれに対応する変換係数は以下のとおりです:
+--------------------------------------+---------------------+
| UNIT_NAME | CONVERSION_FACTOR |
+--------------------------------------+---------------------+
| British chain (Benoit 1895 A) | 20.1167824 |
| British chain (Benoit 1895 B) | 20.116782494375872 |
| British chain (Sears 1922 truncated) | 20.116756 |
| British chain (Sears 1922) | 20.116765121552632 |
| British foot (1865) | 0.30480083333333335 |
| British foot (1936) | 0.3048007491 |
| British foot (Benoit 1895 A) | 0.3047997333333333 |
| British foot (Benoit 1895 B) | 0.30479973476327077 |
| British foot (Sears 1922 truncated) | 0.30479933333333337 |
| British foot (Sears 1922) | 0.3047994715386762 |
| British link (Benoit 1895 A) | 0.201167824 |
| British link (Benoit 1895 B) | 0.2011678249437587 |
| British link (Sears 1922 truncated) | 0.20116756 |
| British link (Sears 1922) | 0.2011676512155263 |
| British yard (Benoit 1895 A) | 0.9143992 |
| British yard (Benoit 1895 B) | 0.9143992042898124 |
| British yard (Sears 1922 truncated) | 0.914398 |
| British yard (Sears 1922) | 0.9143984146160288 |
| centimetre | 0.01 |
| chain | 20.1168 |
| Clarke's chain | 20.1166195164 |
| Clarke's foot | 0.3047972654 |
| Clarke's link | 0.201166195164 |
| Clarke's yard | 0.9143917962 |
| fathom | 1.8288 |
| foot | 0.3048 |
| German legal metre | 1.0000135965 |
| Gold Coast foot | 0.3047997101815088 |
| Indian foot | 0.30479951024814694 |
| Indian foot (1937) | 0.30479841 |
| Indian foot (1962) | 0.3047996 |
| Indian foot (1975) | 0.3047995 |
| Indian yard | 0.9143985307444408 |
| Indian yard (1937) | 0.91439523 |
| Indian yard (1962) | 0.9143988 |
| Indian yard (1975) | 0.9143985 |
| kilometre | 1000 |
| link | 0.201168 |
| metre | 1 |
| millimetre | 0.001 |
| nautical mile | 1852 |
| Statute mile | 1609.344 |
| US survey chain | 20.11684023368047 |
| US survey foot | 0.30480060960121924 |
| US survey link | 0.2011684023368047 |
| US survey mile | 1609.3472186944375 |
| yard | 0.9144 |
+--------------------------------------+---------------------+
構文は次のとおりです:
ST_Length(ls[,unit])
パラメータの説明:
ls:入力パラメータで、その長さを計算する線形ジオメトリを表します。unit:(オプション) 長さの単位を指定します。指定されていない場合、長さはデフォルトでメートル(metre)単位となります。関数の実装と空間データベースシステムによって異なりますが、このパラメータでは 'foot'(フィート)、'centimetre'(センチメートル)など、さまざまな長さの単位を指定できます。
例:
obclient> SET @ls = ST_GeomFromText('LineString(1 1,2 2,3 3)', 4326);
Query OK, 0 rows affected
obclient> SELECT ST_Length(@ls, "foot");
+------------------------+
| ST_Length(@ls, "foot") |
+------------------------+
| 1029205.9131247795 |
+------------------------+
1 row in set
obclient> SELECT ST_Length(@ls);
+-------------------+
| ST_Length(@ls) |
+-------------------+
| 313701.9623204328 |
+-------------------+
1 row in set
この例では、最初にST_GeomFromText関数を使用して、3つの点からなる線形ジオメトリ(LineString)を作成しました。各点の座標は、(1,1)、(2,2)、(3,3)の順です。
次に、ST_Length関数を使用してこのLineStringの長さを計算します。まず、長さの単位をフィートと指定すると、長さの結果は1029205.9131247795フィートとなります。次に、ST_Length関数を再度呼び出しますが、単位は指定されていないため、デフォルトの単位であるメートルが使用され、長さの結果は313701.9623204328メートルとなります。
ST_Centroid
ST_Centroid(geometry A) は、指定された幾何体 A の重心(幾何学的中心)を計算するための空間関数です。重心とは、幾何体の各部分のバランス点であり、幾何体の中心位置と見なすことができます。2次元の幾何体、例えば多角形の場合、重心はすべての点の平均位置です。
Aが空の幾何体(どの点もない)場合、関数はNULLまたは無効な結果を返す可能性があります。Aが複雑な幾何体の場合、重心の計算は複雑かつ計算集約的になる可能性があります。特に、幾何体が多くの頂点や内部の穴を持つ場合に顕著です。- 計算された重心点は、元の幾何体上に存在しない場合があります。これは、特に幾何体自体の形状が不規則であったり凹部があったりする場合に起こります。例えば、「U」字型の多角形の場合、重心は凹んだ外部空間に位置する可能性があります。
- 線形幾何体(線分や折れ線など)の場合、重心は線上のすべての点の平均位置ですが、自己交差したり曲がったりする複雑な線形の場合、重心の位置は直感的に理解しにくい場合があります。
構文は以下のとおりです:
ST_Centroid(geometry A)
例は以下のとおりです:
obclient> SELECT ST_AsText(_ST_PointOnSurface(geom)) AS pt_on_surf, ST_AsText(ST_Centroid(geom)) AS centroid FROM (SELECT ST_GeomFromText('POLYGON ((0 0, 0 10, 10 10, 10 8, 2 8, 2 2, 10 2, 10 0, 0 0))') AS geom) AS t;
この例では、複雑な形状を持つ多角形の幾何体を定義し、それに対して2種類の空間分析操作を行っています:
_ST_PointOnSurface 関数は、多角形の表面上にある点を取得するために使用されます。この点は通常、全体の幾何体の位置を表すために使用され、多角形の内部に位置することを保証します。 ST_Centroid 関数は、多角形の重心を計算するために使用されます。これは多角形の各部分のバランス点ですが、必ずしも多角形の内部に位置するとは限りません。 結果は2列に表示されます。1列目の pt_onsurf は多角形の表面上の点の座標であり、2列目の centroid は計算された多角形の重心の座標です。クエリ結果が返されると、多角形の表面上の点は (1, 5) に位置し、重心の座標は (4.076923076923077, 5) です。
実行結果は次のとおりです:
+------------+----------------------------+
| pt_on_surf | centroid |
+------------+----------------------------+
| POINT(1 5) | POINT(4.076923076923077 5) |
+------------+----------------------------+
1 row in set
_ST_PointOnSurface
_ST_PointOnSurface(geometry a)関数は、入力されたジオメトリaから、そのジオメトリの表面に位置する点を返します。これは、ジオメトリの内部に正確に位置する点(多角形やその他の面状ジオメトリの場合)を返すことができ、単なるジオメトリの幾何学的または算術的中心ではありません。
_ST_PointOnSurface関数は通常、線状または点状のジオメトリに対しては内部点の概念が明確ではないか適用されないため、面状ジオメトリ(例えば多角形)に対してのみ意味があります。
この関数は、複数の内部点のいずれも返さず、代わりにジオメトリ全体を表す特定の点(例えば、多角形の角点や辺上の点など)を返す可能性があります。
構文は以下のとおりです:
_ST_PointOnSurface(geometry g1)
例:
obclient> SELECT ST_AsText(_ST_PointOnSurface(geom)) AS pt_on_surf, ST_AsText(ST_Centroid(geom)) AS centroid FROM (SELECT ST_GeomFromText('POLYGON ((0 0, 0 10, 10 10, 10 8, 2 8, 2 2, 10 2, 10 0, 0 0))') AS geom) AS t;
この例では、まずWell-Known Text (WKT)形式の文字列から特定の形状を持つ多角形ジオメトリを作成しました。次に、この多角形に対して_ST_PointOnSurfaceとST_Centroidの2つの関数を使用しました。
_ST_PointOnSurface関数は、多角形の境界上または内部に位置する点を返します。一方、ST_Centroid関数は、多角形の幾何学的中心を計算して返します。
最後に、クエリ結果は2つの列を使用してこれら2つの点の座標を表示します。pt_onsurfは表面の点であり、centroidは重心の座標です。提供された例では、pt_onsurfは座標(1 5)の点を返し、centroidは座標(4.076923076923077 5)の点を返します。
実行結果は次のとおりです:
+------------+----------------------------+
| pt_on_surf | centroid |
+------------+----------------------------+
| POINT(1 5) | POINT(4.076923076923077 5) |
+------------+----------------------------+
1 row in set