空間形式変換関数は、ジオメトリオブジェクトをテキストやバイナリ形式に変換するなど、異なる空間データ表現形式間での変換に使用されます。
OceanBaseデータベースが現在サポートしている空間形式変換関数には、ST_AsGeoJSON、_ST_AsMVT、および ST_AsMVTGeom が含まれます。
ST_AsGeoJSON
ST_AsGeoJSON関数は、ジオメトリオブジェクトを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プロトコルバッファー(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:タイルの境界を定義する2次元ボックス。通常、このボックスは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