すべてのプロダクト
Search
ドキュメントセンター

PolarDB:ガノス幾何ピラミッド

最終更新日:Oct 17, 2024

このトピックでは、ベクタータイルピラミッドモデルの詳細と使用方法について説明します。

概要

概要

ベクトルタイルピラミッドモデルは、数千万の空間幾何学的データレコードの迅速な視覚化のために設計されている。 空間的な幾何学的データに疎なインデックスを作成し、データ集中領域を前処理し、MVTまたはPBF形式でベクトルタイルを出力します。 このモデルは、数億の空間幾何学的データレコードを数分で前処理し、クライアント側で即座に視覚化することができます。

GanosBase Geometry Pyramidは、 PolarDB for PostgreSQL (Oracleと互換性があります) の時空間拡張です。 ジオメトリ列を持つテーブル上にベクタータイルピラミッドを作成できます。これにより、さまざまなレベルのタイルをクエリして迅速にレンダリングできます。 従来のマップタイリングアプローチと比較して、ベクトルタイルピラミッドモデルは、より高速で費用対効果が高い。

  • より高速なピラミッド作成: 平均8コアの PolarDB for PostgreSQL (Compatible with Oracle) クラスターでの実験によると、7000万個の建物平面データポイントからベクタータイルピラミッドを作成するのに6分しかかかりません。

  • 費用対効果の高いストレージ: 大量のデータを含むベクトルタイルのみを格納することで、モデルはストレージコストを削減します。

機能

ベクタータイルピラミッドを作成、クエリ、更新、およびドロップできます。

  • ベクトルタイルピラミッドを作成する: ST_BuildPyramidまたはST_BuildPyramidUseGeomSideLen関数を使用して、ジオメトリ列を含むテーブルにベクトルタイルピラミッドを作成します。 列の空間インデックスが必要です。

  • ベクトルタイルピラミッドの照会: ST_Tile関数またはST_AsPNG関数を使用します。 ST_Tile関数は指定されたベクトルタイルをMVT形式で返し、ST_AsPNG関数はタイルをレンダリングしてPNGイメージを返します。

  • ベクトルタイルピラミッドを削除する: ST_DeletePyramid関数を使用して、既存のベクトルタイルピラミッドを削除します。

  • ベクトルタイルピラミッドを更新する: 対応するテーブルを更新した後、ST_UpdatePyramid関数を使用してベクトルタイルピラミッドを更新します。

詳細については、「ジオメトリピラミッドSQLリファレンス」をご参照ください。

シナリオ

道路、建物、またはPOI (Point of interest) などの現実世界のエンティティを表すジオメトリオブジェクトは、物理オブジェクトの分布を視覚化するために重要です。 この視覚化は、地理空間データ内の情報を効果的に伝達する。 ベクトルタイルピラミッドは、ジオメトリオブジェクトとして格納され、効率的な視覚化が必要なデータセットを処理するのに役立ちます。 このセクションでは、ベクトルタイルピラミッドモデルを使用して、点、線、平面の3種類のジオメトリデータを視覚化する方法について説明します。

  • POIと軌道ポイントの視覚化

    地図上の位置または移動物体を表すPOIまたは軌道点は、通常、点タイプとしてデータベースに記憶される。 ベクタータイルピラミッドを活用することで、ユーザーはその場でさまざまな領域にわたるこれらのポイントの密度を視覚化して、活動レベルを評価できます。

  • 道路または水路の視覚化

    輸送アプリケーションでは、道路と水路は通常、データベースにLineString型として格納されます。 ベクタータイルピラミッドモデルを使用すると、ユーザーは道路と水路の分布を動的にクエリして、効率的なルート計画を実行できます。

    gp_line.gif

  • 建物、川、森林の視覚化

    都市計画では、建物、河川、森林はPolygonタイプとしてデータベースに保存されます。 ベクタータイルピラミッドモデルを使用すると、ユーザーは建物や川の分布を視覚化でき、情報に基づいた決定を下すことができます。

    gp_poly.gif

コンポーネント

概念

ベクトルタイル

ベクトルタイリングは、ベクトルタイプ (点、線、または平面) 、およびベクトルを構成する1つまたは複数の点の相対座標などのベクトルデータからベクトルタイルを生成することを指す。 ベクトルタイルに含まれる情報は、ウェブブラウザまたはGISアプリケーションなどのフロントエンドソフトウェアからアクセス可能であり、ユーザ定義のスタイルを情報に適用してベクトルデータをレンダリングする。 簡単に言えば、ベクトルタイルはフロントエンドアプリケーションに表示するものを通知し、フロントエンドアプリケーションはユーザー定義のスタイルに従って表示します。 ハードウェアが進歩するにつれて、クライアントアプリケーションはベクトルタイルを効率的にレンダリングすることができ、ベクトルタイルはますます普及している。

MVT

Mapbox Vector Tile (MVT) は、ベクトルタイルデータを格納および転送するために広く使用されているフォーマットである。 ベクトル特徴とその属性のセットをエンコードする方法を定義します。 MVTファイルの内部構造は、名前付きレイヤのセットを含む。 各レイヤは、ジオメトリ特徴およびメタデータを含む。 ジオメトリフィーチャは、エンコードされたジオメトリタイプ、座標、およびMoveTo、LineTo、ClosePathなどのコマンドです。 メタデータは、属性名とそれに対応する値を格納するキーと値のペアで構成されます。 MVTフォーマットは、最も一般的なフロントエンドアプリケーションでサポートされています。

動的ベクトルタイル

動的ベクトルタイリングは、データベースシステムが関連データを検索し、それをベクトルタイルに処理し、視覚化要求に応答してそれらのタイルを返すプロセスである。 たとえば、PostGISでは、動的ベクトルタイルは次のプロセスに従います。

  1. ベクトルタイルの範囲内で空間クエリを実行して、要求されたジオメトリオブジェクトをテーブルから取得します。

  2. 取得したジオメトリオブジェクトをベクトルタイルの座標系に変換します。 このステップには、ジオメトリオブジェクトの簡略化とフィルタリングも含まれます。 ST_AsMVTGeom関数を使用して実行されます。

  3. MVT仕様に従って、変換されたジオメトリオブジェクトをバイナリ構造にエンコードします。 このステップは、ST_AsMVT関数を使用して実行される。

GanosBaseは、次の機能を提供することでレンダリング効率を向上させます。

  • ST_IsRandomSampled: ジオメトリオブジェクトがランダムにサンプリングされているかどうかを確認します。

  • ST_AsMVTGeomEx: 小さなピクセルで変換されたジオメトリオブジェクトを削除します。

  • ST_AsMVTEx: データの視覚化後に視覚的に重要でないジオメトリオブジェクトを削除します。

これらの関数を使用して、動的ベクトルのタイリングを高速化できます。

事前タイリング

事前タイリングは、バッチでベクトルタイルを生成し、それらを格納し、オンデマンドでクライアントに提供することを含む。

まばらなピラミッド

ベクトルタイルピラミッドモデルは、疎ピラミッド構造を使用する。 オブジェクト密度が低い領域のベクトルタイルは動的に生成され、オブジェクト密度が高い領域のベクトルタイルはバッチで生成されて格納されます。 このアプローチは、動的ベクトルタイリングとプレタイリングとを組み合わせる。 スパースピラミッド構造を次の図に示します。 2つ以上のジオメトリオブジェクトを有するベクトルタイルが生成され、格納される。 要求に応じて、それらはクライアントに直接配信されます。 ジオメトリオブジェクトが1つまたは1つもないグレータイルは、オンデマンドで生成されます。

image

レンダリング

レンダリングは、フロントエンドソフトウェアが、受信したベクトルタイルデータ内の情報に基づいて画像を作成するプロセスを指す。 従来、レンダリングは、フロントエンドソフトウェアによって完了される。 ベクタタイルピラミッドモデルでは、レンダリングはデータベース側で行うこともできます。データベースはマップをレンダリングし、結果の画像をフロントエンドソフトウェアに送信して表示します。

プロセスの使用ベクトルタイルピラミッド

クエリを実行する前に、まずベクトルタイルピラミッドを作成する必要があります。 データテーブルが更新された場合は、クエリを実行する前にベクトルタイルピラミッドを更新する必要があります。

ベクトルタイルピラミッドと動的ベクトルタイルの比較

このセクションでは、ベクトルタイルピラミッドモデルと動的ベクトルタイリングを比較します。 動的ベクトルタイリングは、ベクトルタイルピラミッドほど多くの前処理を必要としないが、タイルエクステント内のジオメトリデータを検索し、要求に応じてベクトルタイルを生成するという追加のオーバーヘッドを導入する。 テーブルの更新は動的ベクトルタイル化には影響しませんが、ST_UpdatePyramid関数を使用してベクトルタイルピラミッドを更新する必要があります。 性能が要求を満たす場合は、ピラミッドベクトルモデルよりも動的ベクトルタイルを選択することをお勧めします。 それ以外の場合は、代わりにベクトルタイルピラミッドを使用できます。

クイックスタート

概要

このセクションでは、GanosBase Geometry Pyramid拡張機能の使用方法について説明します。たとえば、拡張機能のインストール、ベクタータイルピラミッドの作成、ベクタータイルデータの照会、ベクタータイルピラミッドの更新、この拡張機能の高度な使用などです。

基本的な使い方

  • 拡張機能をインストールする:

    CREATE EXTENSION ganos_geometry_pyramid CASCADE;
    説明

    パブリックスキーマに拡張機能をインストールして、潜在的なアクセス許可の問題を回避します。

    CREATE extension ganos_geometry_pyramid WITH schema public;
  • テーブルのベクトルタイルピラミッドを作成する:

    -- Create a vector tile pyramid for the table named test
    -- Specify the id column to be the int4 or int8 data type
    -- Specify the name of the geometry column in the test table. You must first create a spatial index on the column
    -- The JSON string specifies the coordinate system for the data in the geometry column to be EPSG:4326
    SELECT ST_BuildPyramid('test', 'geom', 'id', '{"sourceSRS":4326}');
  • ベクトルタイルデータのクエリ:

    -- Query data from the tile with ID 0_0_0. You can query tiles using any ID. The system returns the tile if it exists. If the specified tile does not exist, a null response is returned.
    -- Query a vector tile using its ID in the format z_x_y. The default projection coordinate system is EPSG:3857.
    SELECT ST_Tile('test', '0_0_0');
  • ベクトルタイルピラミッドを更新します。

    テーブルが更新されたら、最新のマップを表示するためにベクタータイルピラミッドを更新する必要があります。 ST_UpdatePyramid関数を呼び出して、新しいデータを渡します。

    -- Insert three geometry data records
    INSERT INTO test(id, geom) VALUES (1, ST_GeomFromEWKT('SRID=4326;POINT(10.1 10.1)'));
    INSERT INTO test(id, geom) VALUES (2, ST_GeomFromEWKT('SRID=4326;LINESTRING(10.1 10.1,11 11)'));
    INSERT INTO test(id, geom) VALUES (3, ST_GeomFromEWKT('SRID=4326;POLYGON((10 10,11 11,11 12,10 10))'));
    
    -- Update the vector tile pyramid, using the extent defined by Box2D.
    SELECT ST_UpdatePyramid('test', 'geom', 'id', ST_SetSRID(ST_MakeBox2D(ST_Point(9, 9), ST_Point(12, 12)), 4326));

    小さな空間範囲 (総面積の1% 未満など) に影響を与えるローカライズされた更新の場合は、ST_UpdatePyramid関数を使用してベクトルタイルピラミッドを更新します。 更新が地理空間領域全体の大部分に影響を与える場合、ST_BuildPyramid関数を使用して新しいベクトルタイルピラミッドを作成する方が効率的です。

    -- Insert three new geometry records affecting different areas
    INSERT INTO test(id, geom) VALUES (4, ST_GeomFromEWKT('SRID=4326;POINT(-59 -45)'));
    INSERT INTO test(id, geom) VALUES (5, ST_GeomFromEWKT('SRID=4326;LINESTRING(110 60,115 70)'));
    INSERT INTO test(id, geom) VALUES (6, ST_GeomFromEWKT('SRID=4326;POLYGON((-120 59,-110 65,-110 70,-120 59))'));
    
    -- Build a new vector tile pyramid. The old one is automatically dropped.
    SELECT ST_BuildPyramid('test', 'geom', 'id', '{"sourceSRS":4326}');
  • (オプション) ピラミッドをドロップする:

    SELECT ST_DeletePyramid('test');
  • (オプション) 拡張子をドロップする:

    DROP EXTENSION ganos_geometry_pyramid CASCADE;

高度な使用法

ピラミッドに名前を付ける

ベクトルタイルピラミッドは、デフォルトでテーブルの名前を共有します。 テーブルに複数のベクタータイルピラミッドを作成する場合は、ベクタータイルピラミッドのカスタム名を指定できます。

-- Create a vector tile pyramid named hello for the data table named test
SELECT ST_BuildPyramid('test', 'geom', 'id', '{"name": "hello"}');

並列タスクを使用したベクタータイルピラミッドの構築

  • ベクトルタイルピラミッドを作成するために並行して実行できるタスクの数を指定できます。 デフォルト値は0で、最大許容カウントを示します。

  • 値は、構成されたコア数の4倍を超えてはなりません。

  • 2フェーズコミットメカニズムを使用してベクトルタイルピラミッドを並列に作成するため、max_prepared_transactionsパラメーターを設定する必要があります。

  • max_prepared_transactionを100以上に設定します。 再起動後に有効になります。

-- Create a vector tile pyramid using four parallel tasks
SELECT ST_BuildPyramid('test', 'geom', 'id','{"parallel": 4}');

タイルパラメーターの設定

タイルサイズとタイル拡張子サイズを指定できます。 タイルサイズは、最大4096で256で割り切れる必要があります。 タイル拡張サイズの範囲は0から256です。

大量のデータからフルマップを視覚化する場合、比較的小さなタイルサイズを設定すると、レンダリングの並列処理と効率が向上します。

-- Set the tile size to 512 and the tile extension size to 8
SELECT ST_BuildPyramid('test', 'geom', 'id','{
                        "tileSize": 512,
                        "tileExtend": 8
                      }');

ベクタータイルピラミッドの最大レベルを設定する

マップズームがベクタータイルピラミッドの最大レベルを超えると、システムは下位レイヤーの使用または新しいピラミッドレベルの生成を停止します。 このパラメーターを設定しない場合、システムはデータ密度に基づいて最大数を提供します。 デフォルトの最大レベルは16です。

-- Set the pyramid's maximum level to 12. When the zoom level exceeds 12, vector tiles are generated in real time.
SELECT ST_BuildPyramid('test', 'geom', 'id', '{"maxLevel": 12}');

層状処理

  • 各ピラミッドレベルでフィルタリングと属性選択のルールを設定できます。

  • buildRulesを使用して、各レベルのルールを指定します。

  • 一番上のピラミッドレベルを生成するには長い時間がかかります。 生成をスキップするようにルールを設定できます。

-- Use layered processing
-- Level 0-5: Display no features by configuring the filter condition "1!=1", which is always false, thus vector tiles are empty.
-- Level 6-9: Display features with "code = 1" and store the name attribute in the tiles.
-- Level 10-15: Display all features and store the name and width attributes in the tiles.
SELECT ST_BuildPyramid('test', 'geom', 'id', '{
                        "buildRules":[
                            {
                                "level":[0,1,2,3,4,5],
                                "value": {
                                    "filter": "1!=1"
                                }
                            },
                            {
                                "level":[6,7,8,9],
                                "value": {
                                    "filter": "code=1",
                                    "attrFields": ["name"]
                                }
                            },
                            {
                                "level":[10,11,12,13,14,15],
                                "value": {
                                    "attrFields": ["name", "width"]
                                }
                            }
                        ]
                       }');

ベクタータイルピラミッドの作成と更新の効率化

GanosBaseは、ST_BuildPyramidに加えて、ベクタータイルピラミッドを作成するためのST_BuildPyramidUseGeomSideLenを提供しています。 ST_BuildPyramidUseGeomSideLenは、ベクタータイルピラミッドの作成と更新においてより効率的です。 この関数を使用するには、テーブルにx軸またはy軸に沿ったジオメトリの最大スパンを格納する列と、その列のインデックスが含まれている必要があります。

-- Add the geom_side_len column to the test table to store the maximum span of the geometry's bounding box
ALTER TABLE test
ADD COLUMN geom_side_len DOUBLE PRECISION;

CREATE OR REPLACE FUNCTION add_max_len_values() RETURNS VOID AS $$
DECLARE
  t_curs CURSOR FOR
    SELECT * FROM test;
  t_row test%ROWTYPE;
  gm GEOMETRY;
  x_min DOUBLE PRECISION;
  x_max DOUBLE PRECISION;
  y_min DOUBLE PRECISION;
  y_max DOUBLE PRECISION;
BEGIN
  FOR t_row IN t_curs LOOP
    SELECT t_row.geom INTO gm;
    SELECT ST_XMin(gm) INTO x_min;
    SELECT ST_XMax(gm) INTO x_max;
    SELECT ST_YMin(gm) INTO y_min;
    SELECT ST_YMax(gm) INTO y_max;
    UPDATE test
      SET geom_side_len = GREATEST(x_max - x_min, y_max - y_min)
    WHERE CURRENT OF t_curs;
  END LOOP;
END;
$$ LANGUAGE plpgsql;

SELECT add_max_len_values();

-- Create a B-tree index on the geom_side_len column
CREATE INDEX ON test USING btree(geom_side_len);

-- Specify the geom_side_len column to store the maximum span of the geometry's bounding box
SELECT ST_BuildPyramidUseGeomSideLen('roads', 'geom', 'geom_side_len', 'id',
  '{"sourceSRS":4326}');

高度な機能

マージ機能

特定のタイル内のフィーチャは、その属性が特定の条件を満たす場合にマージできます。 これにより、フィーチャの総数が減少する。

次のSQL文は、"buildRules" > "value" > "merge" に条件 ["code=1","code=2"] を追加して機能をマージします。

これにより、データベースは、code属性が1または2に等しいフィーチャをマージするように指示されます。

その他の機能はそのまま残ります。

-- Merge features that have a code attribute value of 1 or 2.
SELECT ST_BuildPyramid('test', 'geom', 'id', '{
                        "buildRules":[
                          {
                            "level":[0,1,2,3,4,5],
                            "value": {
                              "merge": ["code=1","code=2"]
                            }
                          }
                        ]
                      }');

SQL参照

詳細については、「ジオメトリピラミッドSQLリファレンス」をご参照ください。