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

10.1. PostGISラスタプロジェクトに関するより多くの情報はどこにありますか?
10.2. この素晴らしいものを始めるための書籍やチュートリアルはありますか?
10.3. PostGISデータベースにラスタサポートをインストールするにはどうすればよいでしょうか?
10.4. "C:/Program Files/PostgreSQL/8.4/lib/rtpostgis.dll": The specified module could not be found.エラーがでました。また、Linux上でrtpostgis.sql実行時にライブラリのロードができませんでした。
10.5. ラスタデータをPostGISにロードするにはどうすればよいでしょうか?
10.6. ロード可能なラスタファイルの種類は何ですか?
10.7. PostGISラスタデータを他のラスタ形式に出力できますか?
10.8. GDALバイナリはPostGISラスタ機能付きでコンパイルされていますか?
10.9. PostGISラスタデータを見るのに使うことができるツールは何ですか?
10.10. MapServerの地図にPostGISラスタレイヤを追加するにはどうすればいいですか?
10.11. 現在ラスタデータで使用できる関数は何ですか?
10.12. ERROR: function st_intersects(raster, unknown) is not unique or st_union(geometry,text) is not unique. エラーが出ました。解消するにはどうすればいいでしょうか?
10.13. PostGISラスタとOracle GeoRaster (SDO_GEORATGER)およびSDO_RASTERとどの位違うのでしょうか?
10.14. raster2pgsqlにより巨大なファイルのロードがString of N bytes is too long for encoding conversionと言われて失敗しますがどうすればよいでしょうか?

10.1.

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

PostGIS Raster home pageをご覧下さい。

10.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では、章全体(35ページ超)がPostGISラスタにささげられていて、フリーのコードとデータがついています。 Manningからハードコピー本のbuy PostGIS in Actionことができます(大量発注によるかなりの割引があります)。 また、Amazon等書籍販売サイトで購入することも可能です。全てのハードコピー本は電子書籍版の無償ダウンロードのクーポンが付きます。

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

10.3.

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

PostGISとラスタのバイナリをダウンロードするのが最も簡単です。Windows用と最新のMacOS X用とがあります。まずPostGIS 2.0.0以上とPostgreSQL 8.4, 9.0 または 9.1 が動作している必要があります。PostGIS 2.0ではPostGISラスタは完全に統合されていて、PostGISをコンパイルするときにPostGISラスタはコンパイルされます。

Windows下でのインストールと実行の説明はHow to Install and Configure PostGIS raster on windowsにあります。

Windows下でコンパイルすることができますし、コンパイル済みPostGISラスタのバイナリを使うこともできます。MacOS X LeopardまたはSnow Leopardでは、Kyng Chaos Mac OSX PostgreSQL/GIS binariesバイナリがあります。

データベースでラスタサポートを有効にするにはrtpostgis.sqlファイルをデータベースで実行します。既存のラスタサポートのアップグレードではrtpostgis_upgrade_minor..sqlを実行します。

他のプラットフォームでは、一般的には、自分でコンパイルする必要があります。依存物はPostGISとGDALです。ソースからのコンパイルの詳細についてはInstalling PostGIS Raster from source (以前の版のPostGIS)をご覧ください。

10.4.

"C:/Program Files/PostgreSQL/8.4/lib/rtpostgis.dll": The specified module could not be found.エラーがでました。また、Linux上でrtpostgis.sql実行時にライブラリのロードができませんでした。

rtpostgis.dll/soは、libgdal.dll/soに依存します。Windowsではlibgdal-1.dllがPostgreSQLインストール先のbinフォルダに置いてください。Linuxについてはlibgdalがパスまたはbinフォルダの中に置いて下さい。

また、PostGISをデータベースにインストールしていない場合には別のエラーが出ます。PostGISをまずデータベースにインストールしてから、ラスタ機能をインストールしてみてください。

10.5.

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

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

10.6.

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

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

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

raster2pgsql -G

10.7.

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

できます。

GDAL 1.7以上には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を参照してください。

10.8.

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

はい。GDAL Binariesのページをご覧下さい。PostgreSQL対応でコンパイルされているものはPostGISラスタを持っています。

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

Windows用 FWTools 最新の安定版はラスタサポート付きでコンパイルされています

10.9.

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

GDAL 1.7以上とPostGISラスタドライバサポートとを付けてコンパイルしたMapServerでラスタデータの閲覧に使うことが可能です。QuantumGIS (QGIS) では、現在は、PostGISラスタドライバをインストールすると、PostGISラスタの閲覧が可能です。

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

10.10.

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

まずGDAL 1.7以上をPostGISラスタサポート付きでコンパイルします。多数の問題が1.8で解消したので、GDAL 1.8以上が望ましいです。また、より多くの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"
        #... 他の標準的なラスタ処理機能がここに入ります
        #... CLASSは必須ではありませんが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"
        #... 他の標準的なラスタ処理機能がここに入ります
        #... CLASSは必須ではありませんが1バンドデータには便利です
END
        

10.11.

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

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

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

10.12.

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);

10.13.

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

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

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

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

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

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

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

10.14.

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に記述しています。