空間形式変換関数は、幾何オブジェクトをテキストやバイナリ形式に変換するなど、異なる空間データ表現形式間での変換に使用されます。
OceanBaseデータベースで現在サポートされている空間形式変換関数には、ST_AsGeoJSON、_ST_AsMVT、および ST_AsMVTGeom が含まれます。
ST_AsGeoJSON
ST_AsGeoJSON 関数は、幾何オブジェクト(geometry)を GeoJSON 形式の文字列に変換するために使用されます。GeoJSON は、JSON(JavaScript Object Notation)に基づく地理空間データ交換形式です。GeoJSON 標準で主にサポートされている幾何型は、点(Point)、複数点(MultiPoint)、線分(LineString)、複数線分(MultiLineString)、ポリゴン(Polygon)、および複数ポリゴン(MultiPolygon)です。
構文は以下のとおりです:
ST_AsGeoJSON(g [, max_dec_digits [, options]])
パラメータの説明:
g:この関数の主要なパラメータで、GeoJSON に変換する幾何オブジェクトを表します。幾何オブジェクトgは有効である必要があります。max_dec_digits(オプション):出力される GeoJSON 文字列の精度、つまり座標点の小数点以下に表示される最大桁数を制御します。- 指定しない場合、デフォルトで最大値 (232 - 1) が適用されます。
- 最小指定値は 0 です。
options(オプション):3 つのビットスイッチで、Json に境界ボックス (bounding box)、CRS などの情報を出力するかどうかを制御します。- 0:デフォルト値で、すべてを無効にします。
- 1:Bbox 出力を有効にします。
- 2:CRS 簡略形式の出力 (
EPSG:srid) を有効にします。 - 4:CRS 象徴形式の出力 (
urn:ogc:def:crs:EPSG::srid) を有効にします。長形式と短形式の両方を同時に有効にした場合、出力は長形式になります。
以下の例では、ST_AsGeoJSON 関数が幾何オブジェクトを GeoJSON 形式の文字列に変換します。異なるクエリは、ST_AsGeoJSON 関数の flag パラメータを使用して出力される GeoJSON 文字列を制御する方法を示しています。
例1は以下のとおりです:
-- flag パラメータを使用して GeoJSON 出力のオプションを制御します。flag の値は 0 (バイナリ 000) から 7 (バイナリ 111) までです。
obclient> SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(11.11111 12.22222)', 4326),1,0);
ST_AsGeoJSON 関数を使用して、点の幾何オブジェクトを GeoJSON に変換し、境界ボックスや座標系などの追加の属性を一切含めません。
戻り結果は以下のとおりです:
+---------------------------------------------------------------------+
| ST_AsGeoJSON(ST_GeomFromText('POINT(11.11111 12.22222)', 4326),1,0) |
+---------------------------------------------------------------------+
| {"type": "Point", "coordinates": [12.2, 11.1]} |
+---------------------------------------------------------------------+
1 row in set
例2は以下のとおりです:
obclient> SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(11.11111 12.22222)', 4326),1,1);
ST_AsGeoJSON 関数を使用し、flag パラメータを 1 に設定して、境界ボックス情報を含めます。
戻り結果は以下のとおりです:
+----------------------------------------------------------------------------------+
| ST_AsGeoJSON(ST_GeomFromText('POINT(11.11111 12.22222)', 4326),1,1) |
+----------------------------------------------------------------------------------+
| {"bbox": [12.2, 11.1, 12.2, 11.1], "type": "Point", "coordinates": [12.2, 11.1]} |
+----------------------------------------------------------------------------------+
1 row in set
例3は以下のとおりです:
obclient> SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(11.11111 12.22222)', 4326),1,2);
ST_AsGeoJSON 関数を使用し、flag パラメータを 2 に設定して、簡易座標参照系 (CRS) 情報を含めます。
戻り結果は以下のとおりです:
+--------------------------------------------------------------------------------------------------------------+
| ST_AsGeoJSON(ST_GeomFromText('POINT(11.11111 12.22222)', 4326),1,2) |
+--------------------------------------------------------------------------------------------------------------+
| {"crs": {"type": "name", "properties": {"name": "EPSG:4326"}}, "type": "Point", "coordinates": [12.2, 11.1]} |
+--------------------------------------------------------------------------------------------------------------+
1 row in set
例4は以下のとおりです:
obclient> SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(11.11111 12.22222)', 4326),1,3);
ST_AsGeoJSON 関数を使用し、flag パラメータを 3 に設定して、境界ボックス情報と簡易座標参照系 (CRS) 情報を含めます。
戻り結果は以下のとおりです:
+------------------------------------------------------------------------------------------------------------------------------------------------+
| ST_AsGeoJSON(ST_GeomFromText('POINT(11.11111 12.22222)', 4326),1,3) |
+------------------------------------------------------------------------------------------------------------------------------------------------+
| {"crs": {"type": "name", "properties": {"name": "EPSG:4326"}}, "bbox": [12.2, 11.1, 12.2, 11.1], "type": "Point", "coordinates": [12.2, 11.1]} |
+------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set
例5は以下のとおりです:
obclient> SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(11.11111 12.22222)', 4326),1,4);
ST_AsGeoJSON 関数を使用し、flag パラメータを 4 に設定して、詳細座標参照系 (CRS) 情報を含めます。
戻り結果は以下のとおりです:
+-------------------------------------------------------------------------------------------------------------------------------+
| ST_AsGeoJSON(ST_GeomFromText('POINT(11.11111 12.22222)', 4326),1,4) |
+-------------------------------------------------------------------------------------------------------------------------------+
| {"crs": {"type": "name", "properties": {"name": "urn:ogc:def:crs:EPSG::4326"}}, "type": "Point", "coordinates": [12.2, 11.1]} |
+-------------------------------------------------------------------------------------------------------------------------------+
1 row in set
例6は以下のとおりです:
obclient> SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(11.11111 12.22222)', 4326),1,5);
ST_AsGeoJSON 関数を使用し、flag パラメータを 5 に設定して、詳細座標参照系 (CRS) 情報と境界ボックスを含めます。
戻り結果は以下のとおりです:
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ST_AsGeoJSON(ST_GeomFromText('POINT(11.11111 12.22222)', 4326),1,5) |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| {"crs": {"type": "name", "properties": {"name": "urn:ogc:def:crs:EPSG::4326"}}, "bbox": [12.2, 11.1, 12.2, 11.1], "type": "Point", "coordinates": [12.2, 11.1]} |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set
例7は以下のとおりです:
obclient> SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(11.11111 12.22222)', 4326),1,6);
ST_AsGeoJSON 関数を使用し、flag パラメータを 6 に設定します。この値は 4 と同じ出力で、詳細座標参照系 (CRS) 情報を含みます。
戻り結果は以下のとおりです:
+-------------------------------------------------------------------------------------------------------------------------------+
| ST_AsGeoJSON(ST_GeomFromText('POINT(11.11111 12.22222)', 4326),1,6) |
+-------------------------------------------------------------------------------------------------------------------------------+
| {"crs": {"type": "name", "properties": {"name": "urn:ogc:def:crs:EPSG::4326"}}, "type": "Point", "coordinates": [12.2, 11.1]} |
+-------------------------------------------------------------------------------------------------------------------------------+
1 row in set
例8は以下のとおりです:
obclient> SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(11.11111 12.22222)', 4326),1,7);
ST_AsGeoJSON 関数を使用し、flag パラメータを 7 に設定します。この値は 5 と同じ出力で、詳細座標参照系 (CRS) 情報と境界ボックスを含みます。
戻り結果は以下のとおりです:
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ST_AsGeoJSON(ST_GeomFromText('POINT(11.11111 12.22222)', 4326),1,7) |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| {"crs": {"type": "name", "properties": {"name": "urn:ogc:def:crs:EPSG::4326"}}, "bbox": [12.2, 11.1, 12.2, 11.1], "type": "Point", "coordinates": [12.2, 11.1]} |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set
_ST_AsMVT
_ST_AsMVT 関数は、テーブル内の地理情報システム(GIS)を含むすべての行データを集約し、Google Protocol Buffers(Protobuf)でバイナリエンコードされた mapbox ベクトルタイルを返します。
構文は以下のとおりです:
_ST_AsMVT(table_name.*, text name, integer extent, text geom_name, text feature_id_name);
パラメータの説明:
table_name.*:これはクエリで返されるすべての列を表し、ベクトルタイルの構築に使用されます。通常、アスタリスク(*)を使用してテーブル内のすべての列を選択します。このパラメータは実際に存在するテーブルを指定する必要があり、そのテーブルには空間データ列が含まれている必要があります。text name(オプション):これはベクトルレイヤーの名前です。生成されたMVTでは、この名前が対応するレイヤーを識別するために使用されます。integer extent(オプション):これはベクトルタイルのピクセル範囲です。この整数はスライスの空間範囲を定義し、通常は4096や256などの一般的な値が使用されます。text geom_name(オプション):これはテーブル内で幾何データを表すために使用される列名です。text feature_id_name(オプション):これはテーブル内でフィーチャーの一意の識別子(Feature ID)を表すために使用される列名です。
例:
obclient> SELECT 'TG1', hex(_ST_AsMVT(q.*, 'test', 4096, 'geom')) FROM (SELECT 1 AS c1, ST_GeomFromText('POINT(25 17)')AS geom) AS q;
この例では、_ST_AsMVT 関数はクエリ結果セットの空間データをMapbox Vector Tile (MVT)形式のベクトルタイルに変換します。常量値1を持つ列c1と、ST_GeomFromText 関数で作成された POINT ジオメトリオブジェクトgeomを含むインラインクエリ(サブクエリ)qを構築します。
次に、サブクエリの結果セット q.* を _ST_AsMVT 関数の入力として使用します。これには以下が含まれます:
'TG1':クエリ結果セットの最初のフィールドとして使用される単純な文字列です。hex(_ST_AsMVT(q.*, 'test', 4096, 'geom')):_ST_AsMVT関数を呼び出し、結果を16進数文字列に変換します。関数パラメータの'test'はレイヤー名、4096はタイル範囲、'geom'はMVTデータの生成に使用されるgeom列を指定します。
最終的な結果は、フィールドc1の値1と POINT(25 17) ジオメトリオブジェクトを含む、エンコード後の16進数文字列を示します。
戻り値は次のとおりです:
+-----+----------------------------------------------------------------------+
| TG1 | hex(_ST_AsMVT(q.*, 'test', 4096, 'geom')) |
+-----+----------------------------------------------------------------------+
| TG1 | 1A200A0474657374120B12020000180122030932221A026331220228012880207802 |
+-----+----------------------------------------------------------------------+
1 row in set
ST_AsMVTGeom
ST_AsMVTGeom 関数は、空間オブジェクトをMapbox Vector Tile (MVT) 標準に変換して対応する座標系に変換します。この関数は、変換後の幾何オブジェクトがMVT仕様に準拠し、タイルレンダリングに適用できることを保証します。幾何オブジェクトが bounds で定義された長方形の境界を超えている場合でも、buffer で設定されたバッファー領域内にある場合、そのクリッピング動作は clip_geom パラメータによって決定されます。MVT座標系の原点は左上隅にあり、画面座標系の慣習に合致しています。最終的に、この関数はMVT仕様に準拠した有効な幾何オブジェクトを出力し、通常は ST_AsMVT 関数の入力パラメータとして使用されます。
構文は以下のとおりです:
ST_AsMVTGeom(geometry geom, box2d bounds, integer extent=4096, integer buffer=256, boolean clip_geom=true);
パラメータの説明:
geom:変換する入力幾何オブジェクト。geomは有効な幾何オブジェクトでなければなりません。bounds:タイルの境界を定義する二次元ボックス。通常、このボックスは4つの値 (xmin, ymin, xmax, ymax) で定義される長方形領域であり、タイルの空間範囲を表します。integer extent=4096(オプション):ベクトルタイルのピクセル範囲。デフォルト値は4096で、非負の整数である必要があります。integer buffer=256(オプション):タイルの境界の外側に追加されるバッファーサイズ。デフォルト値は256ピクセルで、非負の整数である必要があります。boolean clip_geom=true(オプション):ブール値で、タイルの境界の外側にあるがバッファー領域内にある幾何データをクリッピングして出力タイルのサイズを縮小するかどうかを示します。デフォルト値はtrueで、境界を超える部分をクリッピングします。
例1は以下のとおりです:
obclient> SELECT ST_AsText(_ST_AsMVTGeom(ST_GeomFromText('POLYGON ((0 0, 0 -5, 10 0, 10 5, 0 0))'),ST_GeomFromText('POLYGON((0 0,0 4096,4096 4096,4096 0,0 0))'),4096, 0, false));
この例では、ST_AsMVTGeom 関数を使用して、与えられた POLYGON 几何オブジェクトをMVT形式に変換します:
まず、入力として POLYGON 几何オブジェクトを定義します。 次に、タイルの bounds を4096*4096ピクセルの領域として定義します。extentを4096に設定することでタイルのサイズを表し、buffer を0に設定することでタイルの境界の外側に追加のバッファーがないことを示します。clip_geom をfalseに設定することで、bounds を超える幾何部分をクリッピングしないことを示します。 最後に、ST_AsText 関数を使用して、変換後の幾何オブジェクトをテキスト形式に変換します。
戻り値は以下のとおりです:
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ST_AsText(_ST_AsMVTGeom(ST_GeomFromText('POLYGON ((0 0, 0 -5, 10 0, 10 5, 0 0))'),ST_GeomFromText('POLYGON((0 0,0 4096,4096 4096,4096 0,0 0))'),4096, 0, false)) |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| POLYGON((0 4101,0 4096,10 4091,10 4096,0 4101)) |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set
例2は以下のとおりです:
obclient> SELECT ST_AsText(_ST_AsMVTGeom(ST_GeomFromText('POLYGON ((0 0, 0 -5, 10 0, 10 5, 0 0))'),ST_GeomFromText('POLYGON((0 0,0 4096,4096 4096,4096 0,0 0))'),4096, 0, true));
この例では、同じ入力幾何オブジェクトと bounds を使用しますが、今回は clip_geom を true に設定します。ST_AsMVTGeom 関数は、bounds を超える幾何部分をクリッピングします。
戻り値は以下のとおりです:
+----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ST_AsText(_ST_AsMVTGeom(ST_GeomFromText('POLYGON ((0 0, 0 -5, 10 0, 10 5, 0 0))'),ST_GeomFromText('POLYGON((0 0,0 4096,4096 4096,4096 0,0 0))'),4096, 0, true)) |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| POLYGON((10 4096,0 4096,10 4091,10 4096)) |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set