ラスターデータの実装
ここで少しラスターデータの具体的な実装に触れたいと思います。
ファイルでの実装(GeoTiffフォーマット)
ラスターデータには、比較的よく利用されているGeoTiffというファイル形式があります。GeoTiffはTiffという画像フォーマットを地理用に拡張したもので、中に地理参照情報などを持っている形となります。
産業技術総合研究所(AIST)のLand Browserを利用してダウンロードしたGeoTiff形式の衛星写真をGDALのgdalinfoというコマンドでメタデータを参照してみますと、内部にWGS84という測地座標系の情報や長方形の画像の各頂点がその座標系でのどの位置(経度緯度)であるか、またバンドと呼ばれる各セルに入っている値の種類(この場合、RGBA)の情報などを内部に保持しているのが確認できます。
データベースでの実装
ここから少しデータベースでの実装について考えたいと思います。
上述の通り、代表的なGeoTiffファイルでは、上述のようなメタデータを持ちつつ、実データはTiffの画像形式で持っています。この画像という形式で表現することで広域に分布する大量の情報を、ベクターデータと比較すれば、非常にコンパクトにデータ化できています。しかしながら、広域で高密度なデータを扱うことが多いという特性のため、1つのデータを表現するファイルとしてはかなり大きなサイズにることが少なくありません。そのためファイルとしてのラスターデータは、データが大きくなった場合に、可視化ツールの負担が大きく重くなったり、プログラムでの処理の際のファイル読み込みコストなどが増大し、システムを圧迫してしまうようなケースが散見されます。しかし、先ほど「ラスターデータの処理」で触れたようにごく一部のデータを利用する処理と広域を演算するような処理が共存する必要があり、データベースのラスター機能では、このように1つのデータとしてサイズが大きくなってしまうようなデータを、格納、管理しつつ、データの必要な部分をなるべく少ないコストで、安定して取得できるような実装が求められます。
データベースでの実装(オラクルデータベース(Oracle Spatial))
オラクルデータベースでは標準機能としてOracle SpatialのOracle GeoRasterというラスターデータを取り扱う機能を提供しています。このGeoRaster機能では、ラスターデータの検索性や並列処理などを実現するためにSDO_GEORASTERというオブジェクトを介して、1つのラスターデータをラスター表とラスターデータ表という2つの表で表現するデータ構造と取っています。
ラスター表のSDO_GEORASTERオブジェクトは内部的に実データをバイナリで保持するラスターデータ表へのポインタになる情報を保持しています。ラスターデータ表には、ブロック単位に画像を分割したバイナリが保管され、また検索や処理の応答性を確保するために、そのバイナリブロックが画像空間上のどの範囲のデータであるかをベクターデータ(SDO_GEOMETRY)で保持しています。
これの実装によって、データサイズが巨大になりやすいラスターデータの読み込み場所を空間的な範囲で限定することが可能で、演算処理においても同様の技術を用いて演算結果の出力領域を分割することでロックを最小限にした状態で処理を並列化することが可能になっています。
Oracle GeoRaster実際の利用イメージ
国土地理院のオープンデータの1つである土地利用細分メッシュデータ(GeoTiff)をデータベースにロードしてみます。
GeoRaster機能利用の準備
-- トリガー作成権限の付与 (sysにて実行) GRANT CREATE TRIGGER TO scott; -- GeoRaster機能の有効化 (スキーマ単位) Conn scott/tiger EXECUTE MDSYS.enableGeoRaster; -- 確認 select SDO_GEOR_ADMIN.isGeoRasterEnabled() from dual;
ラスター表の作成
create table L03BR_RASTER( id number, label varchar2(100), raster SDO_GEORASTER );
ラスターデータ表の作成
create table L03BR_RASTER_RDT( rasterID NUMBER, pyramidLevel NUMBER, bandBlockNumber NUMBER, rowBlockNumber NUMBER, columnBlockNumber NUMBER, blockMBR SDO_GEOMETRY, rasterBlock BLOB, CONSTRAINT pkey_L03BR_RASTER_RDT PRIMARY KEY (rasterId, pyramidLevel, bandBlockNumber, rowBlockNumber, columnBlockNumber)) LOB (rasterblock) STORE AS SECUREFILE(cache); ); EXECUTE SDO_GEOR_UTL.createDMLTrigger('L03BR_RASTER', 'raster');
データのロード(gdal_translate)
GDAL(オープンソースの地理空間ソフトウェア財団OSGeo財団が提供しているソフトウェア)のコマンド gdal_translate を用いてデータベースにGeoTiff形式の土地利用細分メッシュファイル(L03-b-14_5339.tif)をロードします。
$ gdal_translate -of georaster ./L03-b-14_5339.tif \ georaster scott/tiger@rasterdb,L03BR_RASTER,raster \ -co INSERT="VALUES (1,'L03-b-14_5339.tif', SDO_GEOR.init('L03BR_RASTER_RDT',1) )" \ -co blocking=optimalpadding -co interleave=BIP
データの検索(確認)
東京駅(Wikipediaによると北緯35.681111、東経139.766667)の土地利用値を取得して、鉄道(92)になっていることを確認します。
select SDO_GEOR.getCellValue( raster, 0, SDO_GEOMETRY( 2001, 4326, SDO_POINT_TYPE( 139.766667, 35.681111 , null),null,null), 1 ) L03BR from L03BR_RASTER where id=1 ; --実行結果 L03BR -------------------- 92