空間形式変換関数は、異なる空間データ表現形式間での変換に使用されます。例えば、幾何オブジェクトをテキストやバイナリ形式に変換する場合です。
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)形式のベクトルタイルに変換します。内連結クエリ(サブクエリ)qを構築し、これには定数値1を持つ列c1と、ST_GeomFromText 関数で作成された POINT ジオメトリオブジェクトgeomのみが含まれます。
次に、サブクエリの結果セット 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