幾何属性関数は、幾何オブジェクトの定性的または定量的な属性にアクセスするために使用されます。OceanBaseデータベースの現在のバージョンでサポートされている幾何属性関数には、ST_Area、ST_SRID()、ST_Latitude()、ST_Longitude()、ST_X()、および ST_Y() が含まれます。
点はX座標とY座標で構成されており、それぞれ ST_X() と ST_Y() 関数を使用して取得できます。地理空間参照システム (SRS) を持つPointオブジェクトの場合、経度と緯度はそれぞれ ST_Longitude() と ST_Latitude() 関数を使用して取得できます。
ST_Area
ST_Area() 関数は、PolygonおよびMultiPolygon空間オブジェクトの空間座標系における面積を計算するために使用され、他のタイプの空間オブジェクトの入力はサポートされていません。構文は以下のとおりです:
ST_Area({poly|mpoly})
例:
obclient> SELECT ST_Area(ST_GEOMFROMTEXT('POLYGON((0 0, 0 1, 1 1, 0 0))'));
+-----------------------------------------------------------+
| ST_Area(ST_GEOMFROMTEXT('POLYGON((0 0, 0 1, 1 1, 0 0))')) |
+-----------------------------------------------------------+
| 0.5 |
+-----------------------------------------------------------+
1 row in set
ST_Area() 関数は、0次元(点)または1次元(線分)の空間オブジェクトの面積計算をサポートしていません。
obclient> SELECT ST_Area(ST_GEOMFROMTEXT('LINESTRING(0 0, 0 1)'));
ERROR 3516 (22S01): POLYGON/MULTIPOLYGON value is a geometry of unexpected type LINESTRING in st_area.
MultiPolygon空間オブジェクトに対して、ST_Area() 関数が返す結果は、集合内のPolygonの面積の合計です。
obclient> SELECT ST_Area(ST_GEOMFROMTEXT('MultiPolygon(((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1)))'));
+-----------------------------------------------------------------------------------------+
| st_area(ST_GEOMFROMTEXT('MultiPolygon(((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1)))')) |
+-----------------------------------------------------------------------------------------+
| 8 |
+-----------------------------------------------------------------------------------------+
1 row in set
ST_SRID
ST_SRID() は、g に関連付けられた空間参照システム (SRS) のIDを示す整数を返します。構文は以下のとおりです:
ST_SRID(g [, srid])
オプションの srid パラメータは有効なSRID値を表し、ST_SRID() の戻り値は最初のパラメータと同じ型であり、SRID値は2番目のパラメータと等しいです。この関数はオブジェクトのSRID値を設定するだけで、座標値の変換は行いません。単一パラメータの場合、ST_SRID() は幾何SRIDを返します。未定義のSRSを参照しても ER_SRS_NOT_FOUND エラーは発生しません。
ST_SRID(g, target_srid) と ST_Transform(g, target_srid) の違いは以下のとおりです:
ST_SRID()は幾何SRID値を変更しますが、座標は変換しません。ST_Transform()はSRID値を変更するだけでなく、幾何座標も変換します。
obclient [test]> SET @geo = ST_GeomFromText('LineString(1 1,2 2)', 0);
Query OK, 0 rows affected
obclient [test]> SELECT ST_SRID(@geo);
+---------------+
| ST_SRID(@geo) |
+---------------+
| 0 |
+---------------+
1 row in set
obclient [test]> SET @geo = ST_SRID(@geo, 4230);
Query OK, 0 rows affected
obclient [test]> SELECT ST_SRID(@geo);
+---------------+
| ST_SRID(@geo) |
+---------------+
| 4230 |
+---------------+
1 row in set
ST_Latitude
ST_Latitude() 関数は、地理空間参照システム (SRS) を持つ有効な Point オブジェクト p の緯度値を表す倍精度数を返します。構文は以下のとおりです:
ST_Latitude(p [, new_latitude_val])
パラメータ new_latitude_val はオプションで、有効な緯度値を表します。このパラメータを使用する場合、ST_Latitude() は、その緯度が2番目のパラメータに等しい Point オブジェクトを返します。
Point オブジェクトが有効であるが地理 SRS を持たない場合、ER_SRS_NOT_GEOGRAPHIC エラーが発生します。
obclient [test]> SET @pit = ST_GeomFromText('POINT(45 90)', 4326);
Query OK, 0 rows affected
obclient [test]> SELECT ST_Latitude(@pit);
+-------------------+
| ST_Latitude(@pit) |
+-------------------+
| 45 |
+-------------------+
1 row in set
obclient [test]> SELECT ST_AsText(ST_Latitude(@pit, 30));
+----------------------------------+
| ST_AsText(ST_Latitude(@pit, 30)) |
+----------------------------------+
| POINT(30 90) |
+----------------------------------+
1 row in set
ST_Longitude
ST_Longitude() 関数は、地理空間参照システム (SRS) を持つ有効な Point オブジェクト p の経度値を表す倍精度数を返します。構文は以下のとおりです:
ST_Longitude(p [, new_longitude_val])
パラメータ new_longitude_val はオプションで、有効な経度値を表します。このパラメータを使用する場合、ST_Longitude() は、その経度が2番目のパラメータに等しい Point オブジェクトを返します。 Point オブジェクトが有効であるが地理 SRS を持たない場合、ER_SRS_NOT_GEOGRAPHIC エラーが発生します。
obclient [test]> SET @pit = ST_GeomFromText('POINT(45 90)', 4326);
Query OK, 0 rows affected
obclient [test]> SELECT ST_Longitude(@pit);
+--------------------+
| ST_Longitude(@pit) |
+--------------------+
| 90 |
+--------------------+
1 row in set
obclient [test]> SELECT ST_AsText(ST_Longitude(@pit, 30));
+-----------------------------------+
| ST_AsText(ST_Longitude(@pit, 30)) |
+-----------------------------------+
| POINT(45 30) |
+-----------------------------------+
1 row in set
ST_X
ST_X() 関数は、有効な Point オブジェクト p の X 座標値を表す倍精度数を返します。X 座標は、点空間参照システム (SRS) の定義で最初に現れる軸と見なされます。構文は以下のとおりです:
ST_X(p [, new_x_val])
パラメータ new_x_val はオプションです。このパラメータを使用する場合、ST_X() は、その X 座標が2番目のパラメータに等しい Point オブジェクトを返します。Point オブジェクトに地理 SRS が含まれる場合、2番目のパラメータは経度または緯度の有効範囲内でなければなりません。
obclient [test]> SELECT ST_X(Point(53.7, 56.34));
+--------------------------+
| ST_X(Point(53.7, 56.34)) |
+--------------------------+
| 53.7 |
+--------------------------+
1 row in set
obclient [test]> SELECT ST_AsText(ST_X(Point(53.7, 56.34), 15.5));
+-------------------------------------------+
| ST_AsText(ST_X(Point(53.7, 56.34), 15.5)) |
+-------------------------------------------+
| POINT(15.5 56.34) |
+-------------------------------------------+
1 row in set
ST_Y()
ST_Y() 関数は、有効な Point オブジェクト p の Y 座標値を表す倍精度数を返します。Y 座標は、点空間参照システム (SRS) の定義で2番目に現れる軸と見なされます。構文は以下のとおりです:
ST_Y(p [, new_y_val])
パラメータ new_y_val はオプションです。このパラメータを使用する場合、ST_Y() は、その Y 座標が2番目のパラメータに等しい Point オブジェクトを返します。Point オブジェクトに地理 SRS が含まれる場合、2番目のパラメータは経度または緯度の有効範囲内でなければなりません。
obclient [test]> SELECT ST_Y(Point(53.7, 56.34));
+--------------------------+
| ST_Y(Point(53.7, 56.34)) |
+--------------------------+
| 56.34 |
+--------------------------+
1 row in set
obclient [test]> SELECT ST_AsText(ST_Y(Point(53.7, 56.34), 15.5));
+-------------------------------------------+
| ST_AsText(ST_Y(Point(53.7, 56.34), 15.5)) |
+-------------------------------------------+
| POINT(53.7 15.5) |
+-------------------------------------------+
1 row in set
パラメータ説明
幾何属性関連関数において、幾何パラメータの戻り値が NULL 以外の場合は以下の例外があります:
- いずれかのパラメータが
NULLであるか、いずれかの幾何パラメータが空のジオメトリの場合、戻り値はNULLとなります。 - いずれかの幾何パラメータの構文が正しくない場合、
ER_GIS_INVALID_DATAエラーが発生します。 - いずれかの幾何パラメータが定義されていない空間参照システム (SRS) に属する場合、
ER_SRS_NOT_FOUNDエラーが発生します。 - いずれかの SRID パラメータが32ビット符号なし整数の範囲外である場合、
ER_DATA_OUT_OF_RANGEエラーが発生します。 - いずれかのSRIDパラメータが定義されていないSRSを参照する場合、
ER_SRS_NOT_FOUNDエラーが発生します。
ST_Latitude()、ST_Longitude()、ST_X()、および ST_Y() 関数については、以下の点にも注意してください:
- いずれかの幾何パラメータが有効な幾何形状であるもののPointオブジェクトではない場合、
ER_UNEXPECTED_GEOMETRY_TYPEエラーが発生します。 - XまたはY座標パラメータが指定され、その値が
-inf、+inf、またはNaNの場合、ER_DATA_OUT_OF_RANGEエラーが発生します。 - 経度または緯度の値が範囲を超えた場合(範囲は度単位です。SRSが他の単位を使用する場合は、その単位における対応する値を使用します)、エラーが発生します。
- 経度の値が範囲 (-180, 180] 内にない場合、
ER_LONGITUDE_OUT_OF_RANGEエラーが発生します。 - 緯度の値が範囲 [−90, 90] 内にない場合、
ER_LATITUDE_OUT_OF_RANGEエラーが発生します。
- 経度の値が範囲 (-180, 180] 内にない場合、