ワークフロー: 既存の ST_Raster 値へのラスタ データのモザイク

難易度: 中級 データ要件 独自のデータを使用 目的: SQL の UPDATE ステートメントを使って urban_area テーブルの特定のレコードの ST_Raster 値からカラー マップを削除し、ラスタをこれらのレコードのラスタ値にモザイクしてから、これらの値にカラー マップを再適用します。

ラスタを既存の ST_Raster 値にモザイクする場合は、SQL の UPDATE ステートメントにおいて ST_Raster モザイク関数を使用できます。ラスタを既存の値にモザイクする場合の入力としては、画像ファイル、複数の画像が含まれた 1 つのフォルダ、または別の ST_Raster 列から抽出した値を使用できます。

ただし、ラスタを既存の値にモザイクする前に、既存の ST_Raster 値にカラー マップが適用されている場合は、これを削除する必要があります。モザイクの操作が完了したら、カラー マップをもう一度 ST_Raster 値に適用することができます。

このトピックの例では、urban_area テーブルの特定のレコードからカラー マップを削除し、ラスタをこれらのレコードのラスタ値に追加してから、カラー マップを再適用する方法を示しています。

カラー マップの削除

ST_Raster 値からカラー マップを削除する場合は、ST_Raster deleteColormap 関数を使用します。

この操作は、追加のラスタを特定のテーブルのラスタ値にモザイクする前に行う必要があります。

手順:
  1. deleteColormap 関数と UPDATE SQL ステートメントを使用して、urban_area テーブルの、name の値が ALL_CITIES である行のラスタ値からカラー マップを削除します。

    Oracle

    UPDATE URBAN_AREA t
    SET RASTER = t.raster.deleteColormap()
    WHERE NAME = 'ALL_CITIES';

    PostgreSQL

    UPDATE urban_area
    SET raster = deleteColormap(raster)
    WHERE name = 'all_cities';

    SQL Server

    UPDATE urban_area
    SET raster = deleteColormap()
    WHERE name = 'all_cities';

    deleteColormap の実施に成功したら、ラスタ値がカラー マップ値ではなくグレースケールで描画されます。

既存の ST_Raster 値へのモザイクによるラスタ データの追加

モザイクの操作では、ラスタ データが既存のラスタ値に反復的に追加されます。このため、ラスタ値が数テラバイトを上回るまでに増加することもあります。ラスタ値は、DBMS(データベース管理システム)の記憶容量による制限しか受けません。

例 1: フォルダ内のすべてのラスタの ST_Raster 列への挿入

SQL の UPDATE ステートメントでモザイク関数の再帰オプションを使用すれば、指定フォルダを繰り返しスキャンして指定ファイル タイプを検索するようにできます。以下の例では、拡張子が「.tif」のすべてのファイルを特定するよう、cities フォルダが再帰的に検索されます。そのうえで、これらのファイルは urban_area テーブルにある all_cities として識別されるラスタ値にモザイクされます。

手順:
  1. モザイク関数と再帰オプションを使って、指定フォルダにあるすべての *.tif ファイルを既存の ST_Raster 値にモザイクします。

    Oracle

    UPDATE URBAN_AREA t
    SET RASTER = t.raster.mosaic('E:\cities\*.tif', 
    'recursive,log=E:\log.txt')
    WHERE NAME = 'ALL_CITIES';

    PostgreSQL

    UPDATE urban_area
    SET raster = mosaic(image,'E:\data\*.tif', 
    'recursive,log=E:\log.txt')
    WHERE name = 'all_cities';

    SQL Server

    UPDATE urban_area
    SET raster = raster.mosaic('E:\data\*.tif',NULL,
    'recursive,log=E:\log.txt')
    WHERE name = 'all_cities';

例 2: ST_PixelData の抽出と ST_Raster 列への追加

japan テーブルで name 列の値が tokyo であるラスタ列のピクセルのピラミッドの第 1 レベルを、name 列の値が all_cities である urban_area テーブルのラスタ列にモザイクします。この場合、ST_Raster getPixelData 関数によって、ST_PixelData 値が ST_Raster 値から data と呼ばれる定義済みの ST_PixelData 変数に抽出されます。次に、この変数は ST_Raster コンストラクタに渡され、ST_Raster 形式に変換し直されます。

手順:
  1. getPixelData 関数で japan テーブルの ST_Raster 値から ST_PixelData 値を抽出し、これを urban_area テーブルのラスタ値に挿入します。

    Oracle

    DECLARE
    data ST_PIXELDATA;
    BEGIN
    SELECT t.raster.getPixelData('level=1') 
    INTO data
    FROM JAPAN t 
    WHERE NAME = 'TOKYO';
    
    UPDATE URBAN_AREA t
    SET image = t.raster.mosaic(data,'log=E:\log.txt')
    WHERE NAME = 'ALL_CITIES';
    END;
    /

    PostgreSQL

    DROP FUNCTION IF EXISTS  mosaic_from_pixeldata();
    CREATE OR REPLACE FUNCTION
    mosaic_from_pixeldata()
    RETURNS integer AS '
     DECLARE data sde.st_pixeldata;
     BEGIN
    SELECT getPixelData(image) INTO data
    FROM japan
    WHERE name = 'tokyo';
    UPDATE urban_area
    SET raster = mosaic(raster,data,''log=E:\log.txt'')
    WHERE name = ''all_cities'';
    END;'
     
    LANGUAGE plpgsql;
    SELECT mosaic_from_pixeldata();
    DROP FUNCTION IF EXISTS
    mosaic_from_pixeldata();

    SQL Server

    DECLARE
    @data ST_PIXELDATA;
    SET @data =
    (SELECT raster.getPixelData('level=1')
    FROM japan
    WHERE name = 'tokyo');
    UPDATE urban_area
    SET raster =
    raster.mosaic(NULL,@data,'log=E:\log.txt');

更新された ST_Raster 値へのカラー マップの適用

ST_Raster 値の更新が完了したら、ラスタ値の表示に使用される色を定義したカラー マップを再適用できます。ラスタへのカラー マップの再適用には、setColormap 関数を使用します。

setColormap 関数の入力は TIFF 画像でなければなりません。以下の例では、citycolors.tif ファイルのカラー マップを使って、urban_area テーブルで name の値が all_cities であるすべての行のラスタ値にカラー マップが追加されます。

手順:
  1. UPDATE SQL ステートメントと citycolors.tif 入力画像ファイルを使って、name 値が all_cities である urban_area テーブルのレコードにカラー マップを追加します。

    Oracle

    UPDATE URBAN_AREA t
    SET raster = t.raster.setColormap('/net/gis/gis1/citycolors.tif')
    WHERE name = 'ALL_CITIES';

    PostgreSQL

    UPDATE urban_area
    SET raster = setColormap(raster,'/net/gis/gis1/citycolors.tif')
    WHERE name = 'all_cities';

    SQL Server

    UPDATE urban_area
    SET raster = raster.setColormap('/net/gis/gis1/citycolors.tif')
    WHERE name = 'all_cities';

関連項目


3/6/2012