2025年10月3日金曜日

東京都デジタルツイン実現プロジェクトのGeoTIFFをOracle Spatial Studioで表示する

東京都デジタルサービス局よりオープンデータとして公開されている、GeoTIFF形式の標高データをオラクル・データベースにGeoRaster(SDO_GEORASTER)としてロードして、Oracle Spatial Studioで表示してみます。

Oracle Spatial Studioでは、以下のようにGeoTIFFの標高データが表示されます。


以下の記事を参照し、いくつか準備を行います。

1. Oracle Spatial Studioのコンテナの起動 

記事「Oracle Spatial Studioのコンテナ・イメージを作成する」に記載されている手順を実施して、Oracle Spatial Studioのコンテナを起動します。

2. GDALコンテナ・イメージの作成

記事「GDALのogr2ogrを使ってShapefileをOracle DatabaseのSDO_GEOMETRY列にロードする」に記載されている手順を実施して、オラクルのドライバが組み込まれたGDALおよびGDALユーティリティを含むコンテナ・イメージを作成します。

3. 東京都デジタルツイン実現プロジェクトのGeoTIFFデータのダウンロード

記事「東京都の浸水予想区域図をAPEXのマップに表示する」の後半に記載している手順に従って、GeoTIFF形式の標高データをダウンロードします。ダウンロードする標高データのリストは以下です。実際には場所はどこでもよいので、全体として矩形になる複数のメッシュを選択してダウンロードできます。その場合は、後の作業手順に現れるZIPファイル名を、ダウンロードしたファイルに置き換えて作業を進めます。
09KD9568.zip	09KD9660.zip	09KD9680.zip	09LD0508.zip	09LD0610.zip
09KD9569.zip	09KD9661.zip	09KD9681.zip	09LD0509.zip	09LD0611.zip
09KD9578.zip	09KD9662.zip	09KD9682.zip	09LD0518.zip	09LD0612.zip
09KD9579.zip	09KD9663.zip	09KD9683.zip	09LD0519.zip	09LD0613.zip
09KD9588.zip	09KD9670.zip	09KD9690.zip	09LD0600.zip
09KD9589.zip	09KD9671.zip	09KD9691.zip	09LD0601.zip
09KD9598.zip	09KD9672.zip	09KD9692.zip	09LD0602.zip
09KD9599.zip	09KD9673.zip	09KD9693.zip	09LD0603.zip

4. オラクル・データベース23ai

今回はコンテナとして実行しているOracle Database 23ai Freeを使用します。テスト用のスキーマとしてtokyodataを作成し、必要な権限を与えます。
create user tokyodata identified by tokyodata ;
alter user tokyodata quota unlimited on users;
grant connect, resource to tokyodata;
grant execute on mdsys.sdo_georaster to tokyodata;
grant execute on mdsys.sdo_geor to tokyodata;
grant execute on mdsys.sdo_geor_utl to tokyodata;
grant execute on mdsys.sdo_geor_admin to tokyodata;
grant create trigger to tokyodata;
Oracle Spatial Studio、GDAL、Oracle Database、GeoTIFFデータが揃った状況から、Oracle Spatial StudioでGeoTIFFデータを表示する作業を始めます。

作業環境はmacOSで、コンテナの実行にpodmanを使用します。

Oracle Spatial Studioのコンテナを実行します。

podman run -d --name spatialstudio -p 8090:8080 -p 4040:4040 spatialstudio

GeoTIFF % podman run -d --name spatialstudio -p 8090:8080 -p 4040:4040 spatialstudio

abfa6ea83e05be580b0124ea03e0a47263c762b01293483fb28aec88ff884ff6

GeoTIFF % 


Oracle Spatial Studioが起動します。ブラウザより以下のURLを開きます。


初期ユーザーとしてadmin/welcome1が設定されています。Language日本語を選択し、Loginします。


接続先にOracle Databaseを選択し、に進みます。


注)
すでにSpatial Studioを構成済みのスキーマに接続すると「The selected repository is already registered to another instance of Spatial Studio. Check the system logs for more details.」というエラーが発生することがあります。対処についてはOracle Spatial Studioのドキュメント2.7 Recovery from Lost Master Keyに記載されています。

コンテナとして実行しているOracle Database 23ai Freeに、GeoTIFFのデータをGeoRasterとしてロードします。

ConnectionServiceを選択し、Service/SIDfreepdb1を指定します。Userは先ほど作成したtokyodataPasswordtokyodataHostは接続先がコンテナなのでhost.containers.internalを指定します。PortはSQL*Netのデフォルトの1521を指定します。

以上でOKをクリックします。


リポジトリが初期化され、Spatial Studioへの接続が完了します。


最初に単一のメッシュをデータベースにロードします。

SQLclなどでスキーマtokyodataに接続し、SDO_GEORASTER型の列をもつ表TOKYO_DIGITAL_TWINを作成します。作成した表には、GeoRasterを扱う上で必要なトリガーを作成します。
create table tokyo_digital_twin(id varchar2(8) primary key, raster sdo_georaster);
begin
    sdo_geor_utl.createdmltrigger(
        'TOKYO_DIGITAL_TWIN',
        'RASTER' );
    end;
/

SQL> create table tokyo_digital_twin(id varchar2(8) primary key, raster sdo_georaster);


Table TOKYO_DIGITAL_TWINは作成されました。


SQL> begin

  2      sdo_geor_utl.createdmltrigger(

  3          'TOKYO_DIGITAL_TWIN',

  4          'RASTER' );

  5      end;

  6* /


PL/SQLプロシージャが正常に完了しました。


SQL> 


ダウンロードしたメッシュ09KD9568.zipを解凍します。GeoTIFFファイル09KD9568.tifが取り出されます。

unzip 09KD9568.zip

GeoTIFF % unzip 09KD9568.zip

Archive:  09KD9568.zip

  inflating: 09KD9568.tif            

GeoTIFF % 


取り出したGeoTIFFファイルの座標参照系は、日本測地系2011/平面直角座標系第9系(EPSG:6677)です。これをWGS 84 地理座標系(EPSG:4326)に変換します。

最初にGDALのコンテナを起動します。

podman run --rm -it -v $PWD:/home/oracle gdal

GeoTIFF % podman run --rm -it -v $PWD:/home/oracle gdal                           bash-5.1$ 


gdalを実行するに当たって、以下の環境変数の設定が必要です。

export LANG=ja_JP.utf8
export NLS_LANG=American_America.AL32UTF8
export PATH=/usr/local/bin:$PATH
export ORACLE_HOME=/usr/lib/oracle/23/client64
export LD_LIBRARY_PATH=${ORACLE_HOME}/lib:/usr/local/lib64:${LD_LIBRARY_PATH}


gdalwarpを実行し、座標参照系を変換します。
gdalwarp -s_srs EPSG:6677 -t_srs EPSG:4326 \
--config GTIFF_SRS_SOURCE EPSG \
-r bilinear 09KD9568.tif 09KD9568_4326.tif

bash-5.1$ gdalwarp -s_srs EPSG:6677 -t_srs EPSG:4326 \

--config GTIFF_SRS_SOURCE EPSG \

-r bilinear 09KD9568.tif 09KD9568_4326.tif

Creating output file that is 1708P x 1046L.

Using internal nodata values (e.g. -32767) for image 09KD9568.tif.

Copying nodata values from source 09KD9568.tif to destination 09KD9568_4326.tif.

Processing 09KD9568.tif [1/1] : 0...10...20...30...40...50...60...70...80...90...100 - done.

bash-5.1$ 


gdal_translate
を実行し、09KD9568_4326.tifを表TOKYO_DIGITAL_TWINにロードします。
gdal_translate \
-of georaster 09KD9568_4326.tif \
"georaster:tokyodata/tokyodata@host.containers.internal/freepdb1,TOKYO_DIGITAL_TWIN,RASTER" \
-co "INSERT=(ID,RASTER) VALUES ('09KD9568',SDO_GEOR.INIT())" \
-co "BLOCKXSIZE=512" -co "BLOCKYSIZE=512" -co "SRID=4326" -co "GENPYRAMID=NN"

bash-5.1$ gdal_translate \

> -of georaster 09KD9568_4326.tif \

> "georaster:tokyodata/tokyodata@host.containers.internal/freepdb1,TOKYO_DIGITAL_TWIN,RASTER" \

> -co "INSERT=(ID,RASTER) VALUES ('09KD9568',SDO_GEOR.INIT())" \

> -co "BLOCKXSIZE=512" -co "BLOCKYSIZE=512" -co "SRID=4326" -co "GENPYRAMID=NN"

Input file size is 1708, 1046

0...10...20...30...40...50...60...70...80...90...100 - done.

bash-5.1$ 


以上で、09KD9568.tifが表TOKYO_DIGITAL_TWINのRASTER列に保存されました。

Spatial StudioのDatasetsを開き、ロードした09KD9568からデータセットを作成します。


データベース表/ビューを選択し、作成をクリックします。


データセットを作成するアイテムとして、GeoRastersを開くと現れる表TOKYO_DIGITAL_TWINを選択します。

Dataset name09KD9568を指定します。GeoRasterの場合、表に保存されている1行が1つのデータセットになります。

OKをクリックします。


データセットになる行を選択します。

選択モード単一ラスター、選択するGeoRaster列RASTERです。

行を選択するにあたって、ID09KD9568の行を選択します。

以上でOKをクリックします。


データセットとして09KD9586が作成されます。右端の3点メニューを開いて、統計の更新を実行します。


統計の更新は負荷がかかりますよ、と案内されます。OKをクリックして統計を更新します。


統計が更新されると警告のアイコンが外れます。


プロジェクトを開いて、新しくプロジェクトを作成します。


新規にプロジェクトが作成され、アクティブ・プロジェクトになります。プロジェクトの作成直後は名前はUntitledです。


データセットの追加をクリックし、先ほど作成した09KD9586を追加します。


追加されたデータセット09KD9586を開き、RASTERを掴んで地図にドロップします。


地図上に09KD9586.tifのGeoTIFFの画像が(GeoRasterとしてオラクル・データベースに保存された上で)、地図上に表示されます。


同じ作業を隣り合うメッシュ09KD956909KD957809KD9579に対して実施します。

作業を簡単にするため、スクリプトload_geotiff.shを作成します。


GeoTIFFのデータをデータベースにロードします。

sh load_geotiff.sh 09KD9569.zip; sh load_geotiff.sh 09KD9578.zip; sh load_geotiff.sh 09KD9579.zip

bash-5.1$ sh load_geotiff.sh 09KD9569.zip; sh load_geotiff.sh 09KD9578.zip; sh load_geotiff.sh 09KD9579.zip

Archive:  09KD9569.zip

  inflating: 09KD9569.tif            

Creating output file that is 1708P x 1046L.

Using internal nodata values (e.g. -32767) for image 09KD9569.tif.

Copying nodata values from source 09KD9569.tif to destination 09KD9569_4326.tif.

Processing 09KD9569.tif [1/1] : 0...10...20...30...40...50...60...70...80...90...100 - done.

Input file size is 1708, 1046

0...10...20...30...40...50...60...70...80...90...100 - done.

Archive:  09KD9578.zip

  inflating: 09KD9578.tif            

Creating output file that is 1708P x 1046L.

Using internal nodata values (e.g. -32767) for image 09KD9578.tif.

Copying nodata values from source 09KD9578.tif to destination 09KD9578_4326.tif.

Processing 09KD9578.tif [1/1] : 0...10...20...30...40...50...60...70...80...90...100 - done.

Input file size is 1708, 1046

0...10...20...30...40...50...60...70...80...90...100 - done.

Archive:  09KD9579.zip

  inflating: 09KD9579.tif            

Creating output file that is 1708P x 1046L.

Using internal nodata values (e.g. -32767) for image 09KD9579.tif.

Copying nodata values from source 09KD9579.tif to destination 09KD9579_4326.tif.

Processing 09KD9579.tif [1/1] : 0...10...20...30...40...50...60...70...80...90...100 - done.

Input file size is 1708, 1046

0...10...20...30...40...50...60...70...80...90...100 - done.

bash-5.1$ 


09KD9568と同じ手順で、Spatial Studioにデータセットを作成します。


アクティブ・プロジェクトに移動し、作成したデータセットをプロジェクトに追加し、地図上に表示します。

メッシュごとに値の分布が異なるため、表示色が微妙に異なるようです。

データベースで仮想モザイクを作成したり、すべてのメッシュで値と表示色の対応を固定することも可能らしいですが、今回はgdalbuildvrtを実行して、複数のメッシュを一枚のGeoTIFFファイルに集約することで表示色を一致させます。


 ダウンロード済みのすべてのZIPファイルを解凍して、GeoTIFFのファイルを取り出します。

rm -f *.tif
for f in *.zip; do unzip $f; done


bash-5.1$ rm -f *.tif

bash-5.1$ for f in *.zip; do unzip $f; done

Archive:  09KD9568.zip

  inflating: 09KD9568.tif            

Archive:  09KD9569.zip

  inflating: 09KD9569.tif            

Archive:  09KD9578.zip

  inflating: 09KD9578.tif            

Archive:  09KD9579.zip

  inflating: 09KD9579.tif


[中略]


Archive:  09LD0610.zip

  inflating: 09LD0610.tif            

Archive:  09LD0611.zip

  inflating: 09LD0611.tif            

Archive:  09LD0612.zip

  inflating: 09LD0612.tif            

Archive:  09LD0613.zip

  inflating: 09LD0613.tif            

bash-5.1$        


解凍されたGeoTIFFファイルを1枚のファイルmosaic_6677.vrtにまとめます。

gdalbuildvrt --config GTIFF_SRS_SOURCE EPSG -a_srs EPSG:6677 mosaic_6677.vrt *.tif

bash-5.1$ gdalbuildvrt --config GTIFF_SRS_SOURCE EPSG -a_srs EPSG:6677 mosaic_6677.vrt *.tif

0...10...20...30...40...50...60...70...80...90...100 - done.

bash-5.1$ 


gdalwarp
を実行し、座標参照系を変換します。

gdalwarp -s_srs EPSG:6677 -t_srs EPSG:4326 -r bilinear mosaic_6677.vrt mosaic_4326.vrt

bash-5.1$ gdalwarp -s_srs EPSG:6677 -t_srs EPSG:4326 -r bilinear mosaic_6677.vrt mosaic_4326.vrt

Creating output file that is 10248P x 6273L.

Using internal nodata values (e.g. -32767) for image mosaic_6677.vrt.

Copying nodata values from source mosaic_6677.vrt to destination mosaic_4326.vrt.

Processing mosaic_6677.vrt [1/1] : 0...10...20...30...40...50...60...70...80...90...100 - done.

bash-5.1$ 


gdal_translate
を実行し、mosaic_4326.vrtを表TOKYO_DIGITAL_TWINにロードします。
gdal_translate \
--config GTIFF_SRS_SOURCE EPSG \
-of georaster mosaic_4326.vrt \
"georaster:tokyodata/tokyodata@host.containers.internal/freepdb1,TOKYO_DIGITAL_TWIN,RASTER" \
-co "INSERT=(ID,RASTER) VALUES ('mosaic',SDO_GEOR.INIT())" \
-co "BLOCKXSIZE=512" -co "BLOCKYSIZE=512" -co "SRID=4326" -co "GENPYRAMID=NN"

bash-5.1$ gdal_translate \

--config GTIFF_SRS_SOURCE EPSG \

-of georaster mosaic_4326.vrt \

"georaster:tokyodata/tokyodata@host.containers.internal/freepdb1,TOKYO_DIGITAL_TWIN,RASTER" \

-co "INSERT=(ID,RASTER) VALUES ('mosaic',SDO_GEOR.INIT())" \

-co "BLOCKXSIZE=512" -co "BLOCKYSIZE=512" -co "SRID=4326" -co "GENPYRAMID=NN"

Input file size is 10248, 6273

0...10...20...30...40...50...60...70...80...90...100 - done in 00:00:20.                 

bash-5.1$ 


以上で合成したGeoTIFFデータがデータベースに、IDがmosaicとしてロードされました。

Spatial Studioでデータセットmosaicを作成します。


アクティブ・プロジェクトに移動し、作成したデータセットmosaicをマップ上に表示します。


以上で、GeoTIFFデータをOracle DatabaseにGeoRasterのデータとして取り込み、Oracle Spatial Studioで表示することができました。

今回の記事は以上になります。