第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.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からハードコピー本の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バイナリがあります。

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

他のプラットフォームでは、一般的には、自分でコンパイルする必要があります。PostGISとGDALに依存します。ソースからのコンパイルの詳細についてはInstalling PostGIS Raster from source (in prior versions of 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ラスタドライバ付きでコンパイルすると、

gdalinfo --formats

のリストにPostGIS Rasterが現れます。

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 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 dbname='mygisdb' user='postgres' password=whatever' schema='someschema' table=sometable where="owner='jimmy'" " C:\somefile.png
gdal_translate -of PNG -outsize 10% 10% "PG:host=localhost 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ラスタを持っています。

次のWindowsバイナリはPostGISラスタが組み込まれているのを確認しています。

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

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

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

Cast the textual geometry representation to a geometry by changing your code to this:

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