Chapter 10. PostGISラスタ よくある質問

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

10.1.

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というエラーが出ます。

As of PostGIS 2.1.3 and 2.0.5, a security change was made to by default disable all GDAL drivers and out of db rasters. The release notes are at PostGIS 2.0.6, 2.1.3 security release. In order to reenable specific drivers or all drivers and reenable out of database support, refer to Section 2.1, “簡略版”.

10.2.

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

PostGIS Raster home pageをご覧下さい。

10.3.

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

There is a full length beginner tutorial Intersecting vector buffers with large raster coverage using PostGIS Raster. Jorge has a series of blog articles on PostGIS Raster that demonstrate how to load raster data as well as cross compare to same tasks in Oracle GeoRaster. Check out Jorge's PostGIS Raster / Oracle GeoRaster Series. There is a whole chapter (more than 35 pages of content) dedicated to PostGIS Raster with free code and data downloads at PostGIS in Action - Raster chapter. You can buy PostGIS in Action now from Manning in hard-copy (significant discounts for bulk purchases) or just the E-book format. You can also buy from Amazon and various other book distributors. All hard-copy books come with a free coupon to download the E-book version.

Here is a review from a PostGIS Raster user PostGIS raster applied to land classification urban forestry

10.4.

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.5.

"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.6.

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

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

10.7.

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

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

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

raster2pgsql -G

10.8.

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.9.

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

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

PostGIS Raster is undergoing many changes. If you want to get the latest nightly build for Windows -- then check out the Tamas Szekeres nightly builds built with Visual Studio which contain GDAL trunk, Python Bindings and MapServer executables and PostGIS Raster driver built-in. Just click the SDK bat and run your commands from there. http://www.gisinternals.com. Also available are VS project files.

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

10.10.

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

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

In theory any tool that renders data using GDAL can support PostGIS raster data or support it with fairly minimal effort. Again for Windows, Tamas' binaries http://www.gisinternals.com are a good choice if you don't want the hassle of having to setup to compile your own.

10.11.

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

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

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

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

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

[Note]

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

-- displaying raster with standard raster options
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"
        #... other standard raster processing functions here
        #... classes are optional but useful for 1 band data
        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
        
-- displaying raster with standard raster options and a where clause
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
        

10.12.

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

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

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

10.13.

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

The function is not unique error happens if one of your arguments is a textual representation of a geometry instead of a geometry. In these cases, PostgreSQL marks the textual representation as an unknown type, which means it can fall into the st_intersects(raster, geometry) or st_intersects(raster,raster) thus resulting in a non-unique case since both functions can in theory support your request. To prevent this, you need to cast the textual representation of the geometry to a 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.14.

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

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

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

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

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

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

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

10.15.

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