第13章 PostGISラスタ よくある質問

13.1. PostGISラスタプロジェクトに関するより多くの情報はどこにありますか?
13.2. この素晴らしいものを始めるための書籍やチュートリアルはありますか?
13.3. PostGISデータベースにラスタ機能をインストールするにはどうすればよいでしょうか?
13.4. ラスタデータをPostGISにロードするにはどうすればよいでしょうか?
13.5. ロード可能なラスタファイルの種類は何ですか?
13.6. PostGISラスタデータを他のラスタ形式に出力できますか?
13.7. GDALバイナリはPostGISラスタ機能付きでコンパイルされていますか?
13.8. PostGISラスタデータを見るのに使うことができるツールは何ですか?
13.9. MapServerの地図にPostGISラスタレイヤを追加するにはどうすればいいですか?
13.10. 現在ラスタデータで使用できる関数は何ですか?
13.11. 「ERROR: function st_intersects(raster, unknown) is not unique or st_union(geometry,text) is not unique.」というエラーが出ました。解消するにはどうすればいいでしょうか?
13.12. PostGISラスタとOracle GeoRaster (SDO_GEORATGER)およびSDO_RASTERとどの位違うのでしょうか?
13.13. raster2pgsqlにより巨大なファイルのロードがString of N bytes is too long for encoding conversionと言われて失敗しますがどうすればよいでしょうか?
13.14. ST_FromGDALRasterを使うとERROR: RASTER_fromGDALRaster: Could not open bytea with GDAL. Check that the bytea is of a GDAL supported format.というエラーが出ます。また、ST_AsPNGや他の入力関数を使おうとするとERROR: rt_raster_to_gdal: Could not load the output GDAL driverというエラーが出ます。

13.1.

PostGISラスタプロジェクトに関するより多くの情報はどこにありますか?

PostGIS Raster home pageをご覧下さい。

13.2.

この素晴らしいものを始めるための書籍やチュートリアルはありますか?

網羅的な初心者用チュートリアルはIntersecting vector buffers with large raster coverage using PostGIS Rasterにあります。PostGISラスタに関するJorgeさんの一連のブログに、ラスタデータのロード方法、Oracle GeoRasterのタスクとのクロス比較があります。Jorge's PostGIS Raster / Oracle GeoRaster Seriesをご覧ください。 PostGIS in Action - Raster chapter. Also covered in second edition.では、章全体(35ページ超)がPostGISラスタにささげられていて、フリーのコードとデータのダウンロードもできます。 Manningからハードコピー本または電子書籍版をBuy PostGIS in Actionから購入することができます。また、Amazon等書籍販売サイトで購入することも可能です。全てのハードコピー本は電子書籍版の無償ダウンロードのクーポンが付きます。

PostGISラスタのユーザからのレビューがPostGIS raster applied to land classification urban forestryにあります。

13.3.

PostGISデータベースにラスタ機能をインストールするにはどうすればよいでしょうか?

PostGISラスタはPostGISのコードベースの一部であり、一般的にPostGISバイナリ配布では有効です。PostGIS 3.0からは、PostGISラスタは別のエクステンションとなっていて、データベースで有効にするには`CREATE EXTENSION postgis_raster;`を実行する必要があります。PostGISをコンパイルする場合にはGDALを合わせてコンパイルする必要があり、そうでないならpostgis_rasterエクステンションはビルドされません。

ラスタ機能を持つPostGISの一般的なディストリビューションについてはDownload PostGIS binariesを参照して下さい。

13.4.

ラスタデータをPostGISにロードするにはどうすればよいでしょうか?

PostGIS最新版には、ラスタローダraster2pgsqlがあります。多種のラスタのロードが可能で、低解像度のオーバビューを作成することが可能な実行可能ファイルで、他のソフトウェアを要しません。詳細情報については「raster2pgsqlを使ってラスタをロードする」を参照して下さい。

13.5.

ロード可能なラスタファイルの種類は何ですか?

GDALライブラリがサポートするもの全てです。GDALがサポートする形式についてはGDAL File Formatsにあります。

インストールで、一部の形式に対応していない可能性があります。インストールしたGDALがサポートする形式を確認するには、次を実行してください。

raster2pgsql -G

13.6.

PostGISラスタデータを他のラスタ形式に出力できますか?

はい

PostGISラスタにはST_AsGDALRaster関数があり、GDALによってSQLを使ってあらゆるラスタ書式に出力することができます。書式リストはSQL関数ST_GDALDriversを使うことで見ることができます。

PostGISラスタを他の書式にエクスポートするのに、GDALコマンドラインツールも使うことができます。GDALはPostGISラスタのドライバを持っています。ただし、PostgreSQL対応でコンパイルするよう指定した場合に限ります。

PostGISラスタ型に不規則なブロックのラスタを格納できますが、GDALドライバは現在のところ不規則なブロックのラスタには対応していません。

ソースからコンパイルする場合、ドライバを有効にするには、コンフィギュアに

--with-pg=path/to/pg_config

を入れる必要があります。まざまなプラットフォーム上でGDALをビルドする際の各種情報については、GDAL Build Hintsを参照して下さい。

GDALをPostGISラスタドライバ付きでコンパイルしているなら、次のコマンドを実行すると、リストにPostGIS Rasterが現れます。

gdalinfo --formats

GDALからラスタに関する要約を得るには、gdalinfoを使います。

gdalinfo  "PG:host=localhost port=5432 dbname='mygisdb' user='postgres' password='whatever' schema='someschema' table=sometable"

他のラスタ書式へデータを出力するには、gdal_translateを使います。下で示すものは、テーブルからのデータ全体を10%のサイズのPNGファイルにして出力します。

ピクセルバンドタイプについて、出力書式がサポートしない場合は、変換が機能しないことがあります。たとえば、浮動小数点数と32ビット符号なし整数は、JPGや他の書式に簡単には変換しません。

次に単純な変換の例を示します。

gdal_translate -of PNG -outsize 10% 10% "PG:host=localhost port=5432 dbname='mygisdb' user='postgres' password='whatever' schema='someschema' table=sometable" C:\somefile.png

また、ドライバ接続文字列内でwhere=...を使って、SQLのWHERE節を使うことができます。次に例を示します。

gdal_translate -of PNG -outsize 10% 10% "PG:host=localhost port=5432 dbname='mygisdb' user='postgres' password='whatever' schema='someschema' table=sometable where='filename=\'abcd.sid\''" " C:\somefile.png
gdal_translate -of PNG -outsize 10% 10% "PG:host=localhost port=5432 dbname='mygisdb' user='postgres' password='whatever' schema='someschema' table=sometable where='ST_Intersects(rast, ST_SetSRID(ST_Point(-71.032,42.3793),4326) )' " C:\intersectregion.png

より多くの例、構文についてはReading Raster Data of PostGIS Raster sectionを参照してください。

13.7.

GDALバイナリはPostGISラスタ機能付きでコンパイルされていますか?

はいGDAL Binariesのページをご覧下さい。PostgreSQL対応でコンパイルされているものはPostGISラスタを持っています。GDALツールも一般的にQGISの一部として含まれています。

Windows用の最新のナイトリビルドを得るには、Visual StudioでビルドしたTamas Szekeresナイトリビルドを見てみて下さい。GDALの開発途中版とPythonバインディングとMapServer実行ファイルとPostGISラスタドライバが組み込まれています。 SDKバッチファイルをクリックして、そこからコマンドを実行します。 http://www.gisinternals.comにあります。Visual Studioプロジェクトファイルもあります。

13.8.

PostGISラスタデータを見るのに使うことができるツールは何ですか?

ラスタデータの表示に、GDALとコンパイルしたMapServerが使えます。QGISは、PostGISラスタのドライバがインストールされているなら、PostGISラスタの表示に対応します。

理論上、GDALを使用してデータをレンダリングするツールはPostGISラスタに対応できるか、ごく小さな労力で対応できます。Windowsの場合も、ご自身でコンパイルする面倒を望まないなら、Tamasさんのバイナリhttp://www.gisinternals.comが良い選択です。

13.9.

MapServerの地図にPostGISラスタレイヤを追加するにはどうすればいいですか?

まずGDAL 1.7以上をPostGISラスタ機能付きでコンパイルします。多数の問題が1.8で解消していて、GDAL 3以上が望ましいです。また、より多くのPostGISラスタの問題は開発中の版で解消しています。

他のラスタでできることと同じことができます。MapServerラスタレイヤで使うことができる様々な処理機能の一覧を得るにはMapServer Raster processing optionsを参照して下さい。

PostGISラスタデータを特に興味深くするのは、それぞれのタイルが様々な標準的なデータベースカラムを持ち得るので、データソースで分割することができる点です。

次に示す例は、PostGISラスタレイヤをMapServer内で定義する方法です。

[注記]

mode=2 では、タイル化されたラスタが求められるもので、PostGIS 2.0とGDAL 1.8ドライバで追加されています。これはGDAL 1.7ドライバにはありません。

-- 標準的なラスタの設定を付けてラスタを表示する
LAYER
        NAME coolwktraster
        TYPE raster
        STATUS ON
        DATA "PG:host=localhost port=5432 dbname='somedb' user='someuser' password='whatever'
                schema='someschema' table='cooltable' mode='2'"
        PROCESSING "NODATA=0"
        PROCESSING "SCALE=AUTO"
        #... 他の標準的なラスタ処理関数はここに入ります
        #... クラスは必須ではないですが1バンドデータに使えます
        CLASS
                NAME "boring"
                EXPRESSION ([pixel] < 20)
                COLOR 250 250 250
        END
        CLASS
                NAME "mildly interesting"
                EXPRESSION ([pixel] > 20 AND [pixel] < 1000)
                COLOR 255 0 0
        END
        CLASS
                NAME "very interesting"
                EXPRESSION ([pixel] >= 1000)
                COLOR 0 255 0
        END
END
        
-- 標準的なラスタの設定と、WHERE節をつけてラスタを表示する
LAYER
        NAME soil_survey2009
        TYPE raster
        STATUS ON
        DATA "PG:host=localhost port=5432 dbname='somedb' user='someuser' password='whatever'
                schema='someschema' table='cooltable' where='survey_year=2009' mode='2'"
        PROCESSING "NODATA=0"
        #... other standard raster processing functions here
        #... classes are optional but useful for 1 band data
END
        

13.10.

現在ラスタデータで使用できる関数は何ですか?

12章ラスタ リファレンスのリストを参照して下さい。これよりも多くの関数がありますが、開発途中です。

将来的に期待できる関数の詳細情報についてはPostGIS Raster roadmap pageをご覧下さい。

13.11.

「ERROR: function st_intersects(raster, unknown) is not unique or st_union(geometry,text) is not unique.」というエラーが出ました。解消するにはどうすればいいでしょうか?

引数のひとつがジオメトリでなくジオメトリの文字列表現である場合、一意でない関数エラーが発生します。この場合、PostgreSQLは文字列表現を未知の型とします。そうするとst_intersects(raster, geometry)かst_intersects(raster,raster)かのどちらかになります。理論上両方の関数ともにリクエストに沿うことになるので、一意でないことになります。これを回避するには、GEOMETRY型にキャストして下さい。

たとえば次のようになっているとします。

SELECT rast
 FROM my_raster
   WHERE ST_Intersects(rast, 'SRID=4326;POINT(-10 10)');

次の通りにコードを変更すれば文字列表現をジオメトリにキャストします。

SELECT rast
 FROM my_raster
   WHERE ST_Intersects(rast, 'SRID=4326;POINT(-10 10)'::geometry);

13.12.

PostGISラスタとOracle GeoRaster (SDO_GEORATGER)およびSDO_RASTERとどの位違うのでしょうか?

この話題に関するより広範囲な議論については、Jorge ArévaloさんのOracle GeoRaster and PostGIS Raster: First impressions をご覧ください。

ラスタごとのジオリファレンスがレイヤごとのジオリファレンスより優れいていることの主たるものは次の通りです。

* カバレッジが必ずしも長方形でなくてよいこと (この長方形はしばしば広範囲におよぶラスタカバレッジになります。この文書内にある可能なラスタの配置をご覧ください)

* オーバラップするラスタ (ベクタからラスタへの変換で欠損無く実装できる点で重要)

これらの配置はOracleでも可能ですが、多数のSDO_RASTERテーブルと関連付けられる複数のSDO_GEORASTERオブジェクトを格納することになります。複雑なカバレッジになると、データベース上の数百のテーブルにおよぶこともあります。PostGISラスタを使うと、似たようなラスタ配置を一つのテーブルで行うことができます。

PostGISがユーザに隙間やオーバラップの無い長方形ベクタカバレッジ (完全な長方形トポロジのレイヤ)を強制するのに少し似ています。これは、いくつかのアプリケーションにおいては非常に実際的ですが、実際に行うと、ほとんどのカバレッジにとって、現実的でなく望ましくもないことが分かりました。ベクタ構造には、不連続かつ非長方形のカバレッジを格納する柔軟性が必要です。ラスタ構造が同様に利益を受けることについて、私たちは大きな利点であると考えます。

13.13.

raster2pgsqlにより巨大なファイルのロードがString of N bytes is too long for encoding conversionと言われて失敗しますがどうすればよいでしょうか?

raster2pgsqlは、ロード用ファイルを生成するときにデータベース接続を行いません。データベースに明示的にデータベースの文字エンコーディングと異なるものを設定している場合には、巨大な (30MB以上)ラスタファイルをロードするときに、bytes is too long for encoding conversionになることがあります。

これは、一般的には、たとえばデータベースがUTF-8であるのに、Windowsアプリケーションに対応するために、クライアントの文字エンコーディングがWIN1252に設定されている場合に発生します。

これを回避策するには、ロードする間、クライアントの文字エンコーディングをデータベースと同じにします。明示的な文字エンコーディング設定をスクリプトに入れることで実現できます。たとえば、Windows上では次のようにします。

set PGCLIENTENCODING=UTF8

Unix/Linuxの場合には、次のようにします。

export PGCLIENTENCODING=UTF8

Goryさんがこの問題の詳細をhttp://trac.osgeo.org/postgis/ticket/2209に記述しています。

13.14.

ST_FromGDALRasterを使うとERROR: RASTER_fromGDALRaster: Could not open bytea with GDAL. Check that the bytea is of a GDAL supported format.というエラーが出ます。また、ST_AsPNGや他の入力関数を使おうとするとERROR: rt_raster_to_gdal: Could not load the output GDAL driverというエラーが出ます。

PostGIS 2.1.3と2.0.5では、セキュリティ変更が行われ、全てのGDALドライバとデータベース外ラスタは、デフォルトでは使えなくなりました。リリースノートはPostGIS 2.0.6, 2.1.3 security releaseにあります。特定のドライバまたは全てのドライバを再有効化する方法と、データベース外ラスタ機能を再有効化する方法については、「簡略版」をご覧下さい。