SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

オラクル技術エキスパートが紹介する 開発者のためのデータベース完全ガイド

さまざまな「空間データ」を活用しよう~ラスターデータ、点群データをデータベースで扱うには

オラクル技術エキスパートが紹介する 開発者のためのデータベース完全ガイド 第11回

  • X ポスト
  • このエントリーをはてなブックマークに追加

ラスターデータの実装

 ここで少しラスターデータの具体的な実装に触れたいと思います。

ファイルでの実装(GeoTiffフォーマット)

 ラスターデータには、比較的よく利用されているGeoTiffというファイル形式があります。GeoTiffはTiffという画像フォーマットを地理用に拡張したもので、中に地理参照情報などを持っている形となります。

 産業技術総合研究所(AIST)のLand Browserを利用してダウンロードしたGeoTiff形式の衛星写真をGDALのgdalinfoというコマンドでメタデータを参照してみますと、内部にWGS84という測地座標系の情報や長方形の画像の各頂点がその座標系でのどの位置(経度緯度)であるか、またバンドと呼ばれる各セルに入っている値の種類(この場合、RGBA)の情報などを内部に保持しているのが確認できます。

GeoTiffのメタデータの参照
GeoTiffのメタデータの参照

データベースでの実装

 ここから少しデータベースでの実装について考えたいと思います。

 上述の通り、代表的なGeoTiffファイルでは、上述のようなメタデータを持ちつつ、実データはTiffの画像形式で持っています。この画像という形式で表現することで広域に分布する大量の情報を、ベクターデータと比較すれば、非常にコンパクトにデータ化できています。しかしながら、広域で高密度なデータを扱うことが多いという特性のため、1つのデータを表現するファイルとしてはかなり大きなサイズにることが少なくありません。そのためファイルとしてのラスターデータは、データが大きくなった場合に、可視化ツールの負担が大きく重くなったり、プログラムでの処理の際のファイル読み込みコストなどが増大し、システムを圧迫してしまうようなケースが散見されます。しかし、先ほど「ラスターデータの処理」で触れたようにごく一部のデータを利用する処理と広域を演算するような処理が共存する必要があり、データベースのラスター機能では、このように1つのデータとしてサイズが大きくなってしまうようなデータを、格納、管理しつつ、データの必要な部分をなるべく少ないコストで、安定して取得できるような実装が求められます。

データベースでの実装(オラクルデータベース(Oracle Spatial))

 オラクルデータベースでは標準機能としてOracle SpatialのOracle GeoRasterというラスターデータを取り扱う機能を提供しています。このGeoRaster機能では、ラスターデータの検索性や並列処理などを実現するためにSDO_GEORASTERというオブジェクトを介して、1つのラスターデータをラスター表とラスターデータ表という2つの表で表現するデータ構造と取っています。

 ラスター表のSDO_GEORASTERオブジェクトは内部的に実データをバイナリで保持するラスターデータ表へのポインタになる情報を保持しています。ラスターデータ表には、ブロック単位に画像を分割したバイナリが保管され、また検索や処理の応答性を確保するために、そのバイナリブロックが画像空間上のどの範囲のデータであるかをベクターデータ(SDO_GEOMETRY)で保持しています。

 これの実装によって、データサイズが巨大になりやすいラスターデータの読み込み場所を空間的な範囲で限定することが可能で、演算処理においても同様の技術を用いて演算結果の出力領域を分割することでロックを最小限にした状態で処理を並列化することが可能になっています。

SDO_GEORASTERのデータ構造
SDO_GEORASTERのデータ構造

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
国土数値情報 土地利用細分メッシュ(ラスタ版)データ構造
国土数値情報 土地利用細分メッシュ(ラスタ版)データ構造
国土数値情報 土地利用細分メッシュ(ラスタ版)イメージ
国土数値情報 土地利用細分メッシュ(ラスタ版)イメージ

次のページ
ラスターデータの活用

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
オラクル技術エキスパートが紹介する 開発者のためのデータベース完全ガイド連載記事一覧

もっと読む

この記事の著者

中井 亮矢(日本オラクル株式会社)(ナカイ リョウヤ)

 日本オラクル株式会社でOracle Databaseを担当するエンジニア。主に地理空間機能、グラフ機能、機械学習機能を中心とするデータ活用や性能チューニングの領域で、製造業、小売業、公共・公益などの様々な問題解決およびコンサルティングに従事。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/17492 2023/03/15 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング