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

PolarDB:ベクトルおよびラスタデータをGanosBase にインポートするためのベストプラクティス

最終更新日:Dec 19, 2024

ベクトルデータとラスタデータは、さまざまな業界のGISアプリケーションで広く使用されている主要な空間データ型です。 GanosBaseは、両方のデータ型に対して堅牢な処理機能を提供します。 GanosBaseは、PolarDB for PostgreSQL の柔軟な並列処理機能に基づいて、従来のソリューションよりも大幅に高いコンピューティング効率を提供します。 このトピックでは、ベクトルおよびラスタデータをGanosBase に効率的にインポートする方法の概要について説明します。空間データをクラウドネイティブデータベースにインポートするためのソリューションを理解した上で、GanosBase のベクターおよびラスターデータ処理機能をより有効に活用できます。

背景

PostgreSQL Community EditionのPostGISには、ベクトルおよびラスタデータを高速にインポートするためのshp2pgsqlおよびraster2pgsqlコマンドラインツールが用意されています。 これらのツールを使用する場合は、インポートするデータのSRID、ファイルエンコーディング、テーブル名、インポート方法を指定する必要があります。 ラスタデータをインポートするには、ラスタのバンドやタイルサイズなどのパラメーターも指定する必要があります。 ただし、これらの方法は、次の理由により、PolarDBデータベースへのデータのインポートには適していません。

  • PostGISが提供するインポートツールでは、データベースをホストするサーバーを完全に制御する必要があります。 データは通常、サーバーのローカルディスクにアップロードされます。 ただし、PolarDBは、ローカルディスクを提供しない共有ストレージアーキテクチャを使用します。 さらに、PolarDBデータベースは、基盤となるサーバーリソースの柔軟性を活用し、ホストの情報を提供することはできません。

  • PostGISラスタと GanosBase Rasterは異なるストレージ構造を使用します。

GanosBaseは、クラウドネイティブの分散ストレージサービスであるObject Storage Service (OSS) を使用して、ベクターおよびラスターデータをインポートするための使いやすい関数レベルのツールを提供します。

データインポート方法

ベクトルデータのインポート

GISデスクトップツールを使用したデータのインポート

PolarDB for PostgreSQLは、PostgreSQL Community Editionと完全に互換性があります。 QGISなどのGISデスクトップツールを使用して、ベクトルデータをインポートできます。 PostgreSQLデータソース接続を作成することで、PolarDBデータベースに接続し、デスクトップツールのデータインポート機能を使用してデータをインポートできます。

FDWを使用したデータのインポート

外部データラッパー (FDW) は、同じクラスターの他のデータベースや他のインスタンスのデータなど、外部データにアクセスするために使用されるPostgreSQL拡張機能です。 FDWを使用してベクトルデータをインポートすることをお勧めします。 GanosBase FDWは、さまざまな空間データへの統一アクセスをサポートし、ジオメトリデータ型をジオメトリタイプに自動的にマッピングできます。 FDWを使用して、外部テーブルとクラスターのテーブルからのデータに一元的にアクセスしてクエリすることができます。

たとえば、次の手順を実行して、OSSに保存されているpoly.shpファイルをGeometry型のデータを含むテーブルとしてのGanosBaseにインポートできます。

  1. 拡張機能をインストールします。

    CREATE EXTENSION ganos_spatialref;
    CREATE EXTENSION ganos_geometry;
    CREATE EXTENSION ganos_fdw;
  2. ST_ForeignTables 関数を使用して、空間データファイルpoly.shpを外部テーブルとして登録します。

    SELECT ST_RegForeignTables('oss://<access_id>:<secrect_key>@[<Endpoint>]/<bucket>/path_to/poly.shp');
  3. information_schema.foreign_tablesビューを使用して、polyという名前の登録済みFDWテーブルを照会します。

    SELECT foreign_table_name FROM information_schema.foreign_tables 
      ORDER BY foreign_table_name ASC;
    説明

    前述の手順では、外部テーブル内の外部データがデータマッピングを介して照会されます。 データはデータベースに書き込まれません。 次のステートメントを実行して、外部テーブルのデータを使用してテーブルを作成できます。

    CREATE TABLE poly_db AS SELECT * FROM poly;

アスターデータのインポート

GanosBaseは、ST_ImportFrom および外部ラスタデータをデータベースにインポートするためのST_CreateRast 関数です。 どちらの関数も、外部ラスタデータに基づいてラスタタイプのオブジェクトを作成し、画像のメタデータを格納します。 ST_ImportFrom関数は、Rasterオブジェクトに加えて、画像データを通常サイズのチャンクに分割します。各チャンクには、デフォルトで256x256ピクセルが含まれます。 チャンクは、chunkTableNameパラメーターの値に基づいてデータベースに格納されます。 ただし、ST_CreateRast関数は、ピクセルデータをデータベースにインポートせずにRasterオブジェクトのみを作成します。

TIFFデータのインポート

TIFFは一般的なラスタデータ形式です。 次の例は、OSSからガノスベースにTIFFデータをインポートする方法を示しています。

  1. OSSでTIFFデータを準備します。

  2. TIFFデータを格納するラスタフィールドを持つテーブルを作成します。

    CREATE TABLE raster_table
    (
      id integer,
      format text,
      rast raster
    );
  3. 次のいずれかの方法でTIFFデータをインポートします。

    • ST_ImportFrom関数を使用します。

      INSERT INTO raster_table
      SELECT 1, 'TIFF', ST_ImportFrom('chunk_table','oss://<access_id>:<secrect_key>@[<Endpoint>]/<bucket>/path_to/file');
    • ST_CreateRast関数を使用します。

      INSERT INTO raster_table
      SELECT 2, 'TIFF', ST_CreateRast('oss://<access_id>:<secrect_key>@[<Endpoint>]/<bucket>/path_to/file');
  4. その結果、各メソッドはRasterオブジェクトを作成します。 ガノスベースが提供するラスタ関連のUDFを使用して、これらのラスタオブジェクトに対して操作を実行できます。

    SELECT id,ST_Georeference(rast),st_extent(rast),ST_NumBands(rast),ST_SRID(rast),st_value(rast,0,100,100),st_value(rast,1,200,200) FROM raster_table;

    サンプル結果:

    image

    ST_ImportFrom関数は、ピクセルデータを格納するテーブル (chunk_table) を作成します。これにより、元の画像が削除されてもデータの可用性が確保されます。 ST_CreateRast関数は、外部イメージへの論理マッピング情報を含むRasterオブジェクトのみを作成します。 画像データはOSSにファイルとして保存されます。 元の画像が削除された場合、データベースで画像を表示することはできません。

HDF5およびNetCDFデータのインポート

HDF5とNetCDFは一般的なラスタデータ形式です。 それらは、地球観測、科学計算、地球科学 (気象学や海洋学など) などの分野で一般的に使用されています。 ST_ImportFromおよびST_CreateRast関数を使用して、HDF5およびNetCDFデータをインポートできます。 SQL文は、TIFFデータをインポートする場合と同様です。

  • ST_ImportFrom関数を使用します。

    INSERT INTO raster_table
    Select 3, 'NC', ST_ImportFrom('chunk_table','oss://<access_id>:<secrect_key>@[<Endpoint>]/<bucket>/path_to/file');
  • ST_CreateRast関数を使用します。

    INSERT INTO raster_table
    Select 4, 'NC', ST_CreateRast('oss://<access_id>:<secrect_key>@[<Endpoint>]/<bucket>/path_to/file');

subdatasetを含むHDF5およびNetCDFファイルの場合、importステートメントのファイルパスの後にsubdataset名を指定します。 次のサンプルステートメントを参照してください。

  • NetCDFファイルの場合:

    INSERT INTO raster_table
    Select 5, 'NC', ST_ImportFrom('chunk_table','oss://<access_id>:<secrect_key>@[<Endpoint>]/<bucket>/path_to/file.nc:sub_name');
  • HDF5ファイルの場合:

    INSERT INTO raster_table
    Select 5, 'HDF5', ST_ImportFrom('chunk_table','oss://<access_id>:<secrect_key>@[<Endpoint>]/<bucket>/path_to/file.hdf5://path/sub_name');

3次元を超えるHDF5およびNetCDFファイルの場合は、chunkdimパラメーターも指定する必要があります。 データベース内のラスタデータは、(w, h, b) 次元に従ってロードされ、記憶される。ここで、wはチャンク幅であり、hはチャンク高さであり、bはバンド数である。 3つ以上の次元を含むNetCDFファイルの場合、x座標とy座標を除くすべての次元のバンドの積がチャンクのバンド数として格納されます。 例として次のNetCDFファイルを取り上げます。

image

lonlatのほかに、寸法は時間等圧です。 ST_ImportFromを使用してデータをインポートする場合、latとlonを除くすべてのディメンションのバンドの積をchunkdimのバンド数として指定します。 この例では、バンドの数は120である。 次のSQL文を参照してください。

INSERT INTO nc_table VALUES(1, ST_ImportFrom('nc_rbt', '/Users/xiaofei/Data/raster/nc_demo.nc','{"chunkdim":"(256,256,120)"}'));

データを一括インポート

OSSからバッチデータインポートを実行するには、スクリプトを使用する必要があります。 次のPythonのサンプルコードは、OSSからデータベースへのバッチラスタデータのインポートを実行する方法を示しています。

説明

スクリプトを実行する前に、Pythonが初期化されていることを確認します。 詳細については、「初期化」をご参照ください。

## Import the required libraries
import oss2
import psycopg2
import logging

## Connect to OSS
auth = oss2.Auth('AK_ID', 'AK_Secret')
bucket = oss2.Bucket(auth, '***endpoint***', '***bucket_name***')

## Connect to the database and get the cursor
con = psycopg2.connect(database="***dataq***", user="***dde***",
                       options="-c search_path=aster,public",  # schema
                       password="******", host="*******", port="******")

cur = con.cursor()

## SQL statement for data import
insert_sql = "INSERT into {raster_table_name}(filename, band_index, raster_obj) VALUES ..."

## Get all HDF5 file names from OSS and save the file names
for obj in oss2.ObjectIterator(bucket, prefix="..."):
    ff = open("upload.txt", mode='a', encoding='utf-8')
    filename = obj.key.split('/')[-1]
    if filename.find(".hdf5") == -1:
        continue
    else:
        ff.write(filename+'\n')

## Get the file list
fileList = {}
with open('upload.txt', 'r') as f:
    fileList = f.read().split('\n')

## Traverse the file list, generate SQL and import the data
for file in fileList:
    # Edit insert_sql, add parameters...

    # Import data:
    try:
        cur.execute(insert_sql)
        con.commit()
        logging.info(filename+" finished")
    except (Exception, psycopg2.Error) as e:
        logging.info(filename+" error!")
        print(filename +" upload failed\n")

結論

PolarDBは独自のデータ書き込み方法を提供します。 GanosBaseが提供する関数レベルのインポートツールは、SQLレベルのデータインポート、クエリ、分析、およびサービス機能を統合します。 さまざまなビジネスステージで一貫したデータ操作を可能にすることで、標準化されたワークフローを確立し、ユーザビリティを向上します。