空間分析関数は、バッファ分析、結合、クリッピングなどの複雑な空間処理と分析を実行するために使用されます。
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:(オプション)長さの単位を指定します。指定しない場合、長さはデフォルトでメートル単位となります。関数の実装と空間データベースシステムによっては、このパラメータは '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つの点 (1,1)、(2,2)、(3,3) で構成される線形ジオメンタル(LineString)を作成します。
次に、ST_Length 関数を使用してこの LineString の長さを計算します。まず、長さの単位をフィートに指定すると、得られた長さは 1029205.9131247795 フィートとなります。その後、再度 ST_Length 関数を呼び出しますが、今回は単位を指定しません。そのため、デフォルトの単位であるメートルが使用され、得られた長さは 313701.9623204328 メートルとなります。
ST_Centroid
ST_Centroid(geometry A) は、指定されたジオメトリ A の重心(幾何的中心)を計算する空間関数です。重心はジオメトリの各部分のバランス点であり、ジオメトリの中心位置と見なすことができます。二次元ジオメトリ、例えば多角形の場合、重心はすべての点の平均位置です。
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