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

PolarDB:GanosBase を使用してデータベースから動的ラスタータイルを直接提供する

最終更新日:Aug 25, 2025

GanosBase の動的ラスタータイリング機能により、GeoServer などの空間サービスミドルウェアに依存することなく、ラスターデータまたはラスター分析結果を迅速に可視化できます。この技術スタックは簡潔で、効率的で、柔軟性があり、使い勝手が良いです。PolarDB for PostgreSQL

GanosBase ラスターエンジン

GanosBase raster は、PolarDB for PostgreSQL のための時空間エンジン拡張機能であり、データベースがラスターデータを効率的に保存および管理できるようにします。リモートセンシング、写真測量、主題図など、マルチソースラスターデータの統合と分析をサポートしています。さらに、データベース内のラスターオブジェクトを OGC 標準サービス(WMS や WMTS など)として公開するための GeoServer プラグインを提供します。GanosBase Raster は、気象学、環境モニタリング、地質探査、天然資源管理、国防、緊急対応、電気通信、メディア、輸送、都市計画、国土安全保障などの分野で使用できます。

ラスターエンジンの詳細については、「ラスターモデル」をご参照ください。

ラスターデータは通常規模が大きいため、その可視化には通常、ラスタータイルを事前に生成してサービスを公開する方法が採用されます。しかし、タイリングによって引き起こされるデータの鮮度に関する問題は、ユーザーからますます批判されており、タイル化されたデータは追加のストレージコストも発生させます。長い間、GanosBase は、「タイリング」などのオフラインジョブ方式を含む、より多くの時空間ビジネス運用を促進するために、優れた時空間データクエリおよび分析パフォーマンスの構築に取り組んできました。以前は、GanosBase Raster のピラミッド方式を使用して、事前タイリングなしでデータベース内のラスターデータを迅速に可視化する方法を紹介しました。詳細については、「スライスフリーのリモートセンシング画像ブラウジングのローコード実装 (1): ピラミッド」をご参照ください。今回は、ベクターデータの asMVT メソッドを使用するのと同様に、ラスタータイルを動的に生成してラスターデータをすばやく表示する、より直感的なアプローチを提供します。以前のソリューションと比較して、このアプローチは動的処理と出力に標準タイル形式を使用し、GeoServer などの空間サービスミドルウェアに依存しないため、技術スタックがより簡潔かつ効率的になり、使用プロセスがより柔軟になります。

動的ラスタータイル機能の紹介

背景情報

従来のリモートセンシング画像サービス公開プロセスでは、ラスターオブジェクトはタイリングルールに従って事前にレイヤーごとにタイル化する必要があり、その後、GeoServer などのサーバーを使用してタイルサービスが公開されます。このプロセスには、次の欠点があります。

  • 大規模なリモートセンシング画像のタイリングには通常長い時間がかかり、サービス公開プロセスは比較的複雑であるため、サービスを迅速に公開することはできません。

  • タイルストレージは追加のストレージスペースを消費し、かなりのデータ冗長性を引き起こします。

  • データ更新後、再タイリングが必要になるため、リアルタイム更新は不可能です。

機能紹介

これらの問題に対処するため、GanosBase バージョン 6.3 以降では、ST_AsTile

技術的利点

従来のラスタータイリングと比較して、ST_AsTile を使用する主な利点は次のとおりです。

  • 標準タイルのリアルタイム動的生成をサポートし、従来のタイリング操作におけるデータ冗長性の問題を回避し、ストレージコストを節約します。

  • ラスターの切り取り、再投影、リサンプリング操作を自動的に実装し、プロセスをより便利かつ簡潔にします。

  • 単一タイルの生成効率が数百ミリ秒以内であり、リアルタイム要件を満たします。

  • データ更新後、再タイリングは不要なため、更新されたコンテンツをリアルタイムで表示できます。

説明

現在、ST_AsTile 関数は単一のラスターオブジェクトに対する操作のみをサポートしています。複数のラスターオブジェクトが関係する場合 (複数の画像を同時に表示する必要がある場合など)、ラスターオブジェクトのモザイク操作が必要です。

始める前に

次のリソースとサンプルデータを準備します。

  • PolarDB for PostgreSQL インスタンス:

    • データベースエンジン: PostgreSQL 14

    • カーネルバージョン: 14.13.25.0

    • スペック (推奨): 

      • CPU: 4 コア以上

      • メモリ: 16 GB 以上

      • ディスク: 50 GB 以上

  • GanosBase エンジン:

    • バージョン: 6.3 以降

    • 拡張機能: 次のコマンドを実行して、ganos_raster 拡張機能がインストールされていることを確認します。

      CREATE EXTENSION ganos_raster CASCADE;
  • サンプルデータ: PolarDB インスタンスと同じリージョンにある Object Storage Service (OSS) バケットにアップロードされた 4 つの Landsat 8 衛星画像 (.TIF 形式)。

ステップ 1: データベース内のデータを準備する

まず、ソース画像をデータベースに取り込む必要があります。複数の画像で最適なパフォーマンスを得るには、それらを単一の仮想ラスターにモザイク化し、ピラミッドを構築します。

  1. ラスターデータを格納するテーブルを作成します。

    CREATE TABLE landsat8
    (
      id integer,
      rast raster
    );
  2. OSS からイメージをテーブルに取り込みます。 <a audience="postgresql" baseurl="t2812575_v1_0_1.xdita" data-node="2412690" data-root="83120" data-tag="xref" href="t790451.xdita#" id="8891f9fefdthw">ST_ImportFrom</a><a audience="oracle" baseurl="t2812575_v1_0_1.xdita" data-node="790451" data-root="83120" data-tag="xref" href="t790451.xdita#" id="0da748be69tjh">ST_ImportFrom</a> 関数は、バケットからファイルを直接読み取ります。

    注: プレースホルダーを実際の OSS 認証情報、エンドポイント、バケット、およびファイルパスに置き換えます。

    INSERT INTO landsat8 VALUES (1, ST_ImportFrom('chunk_table','OSS://<access_id>:<secrect_key>@<Endpoint>/<bucket>/path_to/file1.TIF'));
    INSERT INTO landsat8 VALUES (2, ST_ImportFrom('chunk_table','OSS://<access_id>:<secrect_key>@<Endpoint>/<bucket>/path_to/file2.TIF'));
    INSERT INTO landsat8 VALUES (3, ST_ImportFrom('chunk_table','OSS://<access_id>:<secrect_key>@<Endpoint>/<bucket>/path_to/file3.TIF'));
    INSERT INTO landsat8 VALUES (4, ST_ImportFrom('chunk_table','OSS://<access_id>:<secrect_key>@<Endpoint>/<bucket>/path_to/file1.TIF'));
    説明

    PolarDB クラスターは OSS と同じリージョンにあり、内部アドレスを介してアクセスされる必要があります。上記の SQL 文の OSS ファイルアドレスは、実際の情報 (山かっこなし) に置き換える必要があります。データが正常にインポートされた後、4 つのラスター画像を表示できます。

    SELECT ST_Name(rast), ST_Width(rast),ST_Height(rast),ST_SRID(rast),ST_NumBands(rast) FROM landsat8;

    image

  3. 画像を単一の仮想ラスターオブジェクトにモザイク処理します。<a audience="postgresql" baseurl="t2812575_v1_0_1.xdita" data-node="2412705" data-root="83120" data-tag="xref" href="t41340.xdita#" id="178853ac46759">ST_MosaicFrom</a><a audience="oracle" baseurl="t2812575_v1_0_1.xdita" data-node="817060" data-root="83120" data-tag="xref" href="t41340.xdita#" id="52999102f0qce">ST_MosaicFrom</a> 関数は、4 つの画像を結合します。また、color_balance オプションを有効にして、よりシームレスなビジュアルを作成します。

    --モザイク/カラーバランス
    INSERT INTO landsat8 values(101, ST_MosaicFrom(Array(
      SELECT rast FROM landsat8 WHERE id < 5),
      'rbt_mosaic','',
      '{"srid":4326, "cell_size":[0.0002,0.0002], "nodata": true, "nodatavalue":0, "color_balance":true}'));
  4. ST_BuildPyramid 関数を使用して、モザイク化されたラスターのピラミッドを構築します。ピラミッドはダウンサンプリングされた概要であり、さまざまなズームレベルでのレンダリングを劇的に高速化します。

    --モザイク/カラーバランス
    INSERT INTO landsat8 values(101, ST_MosaicFrom(Array(
      SELECT rast FROM landsat8 WHERE id < 5),
      'rbt_mosaic','',
      '{"srid":4326, "cell_size":[0.0002,0.0002], "nodata": true, "nodatavalue":0, "color_balance":true}'));
    
    --ピラミッドを作成する
    UPDATE landsat8 SET rast=st_buildpyramid(rast) WHERE id=101;

    カラーバランス後のラスターオブジェクトは、GTiff 形式でエクスポートすると、次のように表示されます。

    image

ステップ 2: ST_AsTile でタイルを動的に生成するタイルを生成する

ST_AsTile 関数を使用します。ラスターオブジェクトとマップタイル境界 (ズームレベルと x/y 座標で定義) を受け取り、レンダリングされた画像タイルを返します。

関数の 3 番目の引数は、出力を構成するための JSON オブジェクトです。

  • format: エクスポートタイル形式。現在、PNG、JPEG、および Tiff 形式をサポートしています。デフォルトは PNG で、これはストレッチ後に直接表示できる RGB タイルです。元のピクセル情報を処理する場合は、GTiff を選択して元のピクセル値を取得できます。

  • bands: RGB に対応するバンドを指定します。指定しない場合、デフォルトで最初の 3 つのバンドが選択されます。

  • strength: 表示拡張の方法。値には次のものが含まれます。

    • none: 拡張は実装されていません。

    • stats (デフォルト): ストレッチに統計値を使用します。

    • ratio: 比率に基づくストレッチを使用して拡張が実装されます。

例 1: 標準の 3 バンド画像

特別なストレッチが必要ない標準の RGB 画像の場合、クエリは簡単です。ST_TileEnvelope 関数は、指定された Z/X/Y タイルの地理的境界を計算します。

SELECT ST_AsTile(
  rast,
  ST_TileEnvelope(tile_zoom, tile_column, tile_row),
  '{"strength":"none", "format":"PNG", "alpha":true}'
)
FROM landsat8 WHERE id=101;

例 2: ストレッチを使用したマルチバンド画像

Landsat などのマルチバンド画像の場合、通常、特定のバンドを選択し、コントラストストレッチを適用して視覚的に魅力的な画像を作成する必要があります。このクエリは、バンド 0,1,2 を RGB にマッピングし、パーセンテージストレッチを適用します。

SELECT ST_AsTile(
  rast,
  ST_TileEnvelope(tile_zoom, tile_column, tile_row),
  '{"strength":"ratio", "format":"PNG", "bands":"0,1,2", "alpha":true}'
)
FROM landsat8 WHERE id=101;

ここでは、バンド 0,1,2 が RGB バンドとして選択され、比率メソッドがパーセンテージベースのストレッチに使用されます。

ステップ 3: タイルを提供する Python Web サービスを構築する

次に、データベースによって生成されたタイルを提供するための API エンドポイントを公開するシンプルな Web サービスを作成します。この例では、Quart Web フレームワークを使用します。

  1. 依存関係をインストールします。

    pip install asyncpg
    pip install quart
  2. app.py ファイルを作成します。このスクリプトは 2 つのルートを作成します。

    • /: メインの HTML マップページを提供します。

    • /raster/{z}/{x}/{y}: データベースに接続し、リクエストされたタイルの ST_AsTile クエリを実行し、結果の画像を返します。

    from quart import Quart, send_file, render_template
    import asyncpg
    import io
    import re
    
    ## データベース接続パラメーター
    CONNECTION = {"host": "データベースエンドポイント", "port": "ポート",
                  "user": "ユーザー名", "password": "パスワード", "database": "データベース名"}
    
    ## ターゲットテーブル名
    TABLE_NAME = "landsat8"
    
    ## ターゲットフィールド
    RASTER_COLUMN = "rast"
    
    ## ターゲット ID
    RASTER_ID = "101"
    
    app = Quart(__name__, template_folder='./')
    
    
    @app.before_serving
    async def create_db_pool():
        app.db_pool = await asyncpg.create_pool(**CONNECTION)
    
    
    @app.after_serving
    async def close_db_pool():
        await app.db_pool.close()
    
    
    @app.route("/")
    async def home():
        sql = f'''
        SELECT ST_Extent(
          ST_Transform(
            ST_Envelope({RASTER_COLUMN}), 4326))
        FROM {TABLE_NAME} 
        WHERE ID = {RASTER_ID};
        '''
        async with app.db_pool.acquire() as connection:
            box = await connection.fetchval(sql)
            box = re.findall('BOX\((.*?) (.*?),(.*?) (.*?)\)', box)[0]
            min_x, min_y, max_x, max_y = list(map(float, box))
            bounds = [[min_x, min_y], [max_x, max_y]]
            center = [(min_x + max_x) / 2, (min_y + max_y) / 2]
            return await render_template('./index.jinja2', center=str(center), bounds=str(bounds))
    
    
    @app.route("/raster/<int:z>/<int:x>/<int:y>")
    async def raster(z, x, y):
        # バンドとストレッチ方法を指定する
        config = '{"strength":"ratio","bands":"0,1,2","alpha":true}'
        sql = f'''
        SELECT (
          ST_AsTile({RASTER_COLUMN},
            ST_Transform(
              ST_Tileenvelope($1,$2,$3),
            ST_Srid({RASTER_COLUMN})), \'{config}\')
          ).data tile
        FROM {TABLE_NAME}
        WHERE ID = {RASTER_ID};'''
        async with app.db_pool.acquire() as connection:
            tile = await connection.fetchval(sql, z, x, y)
            return await send_file(io.BytesIO(tile), mimetype='image/png')
    
    if __name__ == "__main__":
        # ポートを 5500 として指定します。適切なポートに変更できます
        app.run(port=5500)

ステップ 4: タイルを表示するためのフロントエンドマップページを作成する

最後に、マップを表示し、構築したばかりのタイルサービスを使用するシンプルな HTML ファイルを作成します。この例では、オープンソースの MapLibre GL JS ライブラリを使用して、index.jinja2 ファイルを app.py と同じディレクトリに作成します。

アプリケーションを実行する

  1. Python Web サービスを実行します。

    python app.py
  2. [Web ブラウザー] を開き、http://127.0.0.1:5500 に移動します。

これで、衛星画像を表示するインタラクティブマップが表示され、すべてのタイルが PolarDB データベースからリアルタイムで生成および提供されます。

image

まとめ

GanosBase のラスターデータのクイック表示機能は、PolarDB データベースに格納されているさまざまなタイプのラスターデータを迅速に可視化できます。事前に生成されたラスタータイルサービスを公開する従来の方法と比較して、新しい動的ラスタータイルはデータの鮮度をより良く維持できます。同時に、GanosBase の強力なラスター分析機能と組み合わせることで、分析結果をリアルタイムで表示できます。世界初のプロフェッショナル空間データベースとして、GanosBase は、空間データの狭い定義を「空間 - 空 - 地面、屋内 - 屋外、地上 - 地下、動的 - 静的」の完全な空間範囲を含むように拡張し、データベースシステムの底層から物理世界のデジタル化のための時空間処理フレームワークを提供します。今後、GanosBase は、より効率的なデータベース内空間分析および可視化機能を提供し、さまざまな業界の空間情報アプリケーションが真に「可視化と計算の統合」へと向かうように促進します。

無料トライアル

PolarDB 無料トライアル ページにアクセスし、「Cloud Native Database PolarDB for PostgreSQL」を選択して試用し、GanosBase のクイック表示機能を体験できます。