2024年12月21日土曜日

東京都のオープンデータの避難場所(SHPファイル)をOracle APEXのマップに表示する

こちらの記事で作成したOracle Spatial Studioを使って、東京都がオープンデータとして公開している避難場所のShapefileをOracle Databaseに読み込み、最終的にOracle APEXのアプリケーションのマップに表示します。

以下の記事を読んで、Stockholmでできるなら東京でもできるのでは?と思ったのがきっかけです。

Mapping Stockholm: From Shapefiles to APEX Maps

以下のAPEXアプリケーションを作ります。


元のブログ記事の手順を追うつもりでしたが、MapBuilderがMac上ではうまく動きませんでした。MapBuilderの代わりにOracle Spatial Studioの環境を作成し、それを使ってShapefileをデータベースにインポートすることにしました。

東京都のオープンデータカタログサイトより避難場所(SHPファイル)をダウンロードします。


避難場所のShapefileはhinan02_01.zipというファイル名でダウンロードされます。

ZIPファイルを解凍します。01_第9回避難場所02_第9回地区割当の2セットのShapefileが含まれています。今回は01_第9回避難場所をデータベースに読み込みます。


Oracle Spatial Studioに接続します。ユーザーadminでサインインします。


ShapfileはOracle APEXのワークスペースで扱えるように、ワークスペースのスキーマにロードします。そのため、APEXのワークスペース・スキーマへの接続を作成します。

左のメニューから接続を選択し、接続の作成をクリックします。


接続タイプを選択します。今回はローカルのコンテナとして動作しているOracle Database 23ai Freeを接続先にするため、Oracle Databaseを選択します。

へ進みます。


接続先にAPEXのワークスペース・スキーマを指定します。Oracle Database 23ai Freeで構築したAPEX環境には、ワークスペースとしてAPEXDEV、ワークスペース・スキーマとしてWKSP_APEXDEVを作成しています。

接続のNameはワークスペース名に合わせてAPEXDEVとしました。ConnectionServiceを選択しService/SIDにOracle Database 23ai Freeでデフォルトで作成されるPDBのFREEPDB1を指定します。Userにワークスペース・スキーマ名のWKSP_APEXDEVPasswordにワークスペース・スキーマのパスワードを指定します。podmanのコンテナでOracle Spatial Studioを実行している場合は、接続先のデータベースのHosthost.containers.internalPort1521になります。

APEXのワークペース・スキーマにはパスワードが割り当たっていないことがあります。外部からのワークスペース・スキーマへの接続を許可する場合は、alter user ... identified byコマンドを実行し、スキーマにパスワードを割り当てておく必要があります。

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


接続が作成されます。


Shapefileのロードを行います。

データセットを開き、データセットの作成をクリックします。


ドロワーが開きます。

ローカル・ファイルを選択し、アップロードするファイルとして、第9回避難場所.prj第9回避難場所.shp第9回避難場所.dbf第9回避難場所.shxを選択します。

以上で作成をクリックします。


データセットのアップロード中にエラーが発生しましたと表示されます。


Oracle Spatial Studioのサーバーのログを見ると、例外が上がっています。内容からは、どうも日本語ファイル名が扱えていないようです。


Spatial Studioの起動スクリプト内のjavaコマンドに引数として-Dfile.encoding=UTF8が付いているし、Spatial Studio自体では日本語を扱えているので、ファイル名の方に何か問題がありそうです。

英数字だけのファイル名に変更します。

mv 第9回避難場所.dbf dai9kaihinanbasyo.dbf
mv 第9回避難場所.prj dai9kaihinanbasyo.prj
mv 第9回避難場所.shp dai9kaihinanbasyo.shp
mv 第9回避難場所.shx dai9kaihinanbasyo.shx

01_第9回避難場所 % mv 第9回避難場所.dbf dai9kaihinanbasyo.dbf

01_第9回避難場所 % mv 第9回避難場所.prj dai9kaihinanbasyo.prj

01_第9回避難場所 % mv 第9回避難場所.shp dai9kaihinanbasyo.shp

01_第9回避難場所 % mv 第9回避難場所.shx dai9kaihinanbasyo.shx 


再度、データセットの作成を行います。アップロードするファイルは、上記の名前を変更したファイルです。


フィールド名の日本語を正しく認識できていません。このまま送信すると、データセットの作成に失敗します。


データの文字セットは正しく認識できていることから、設定で直せる問題とは思えません。

dbfファイルのバックアップを取得し、バイナリエディタでフィールド名を直接編集することにしました。dbfファイルのフォーマットについては、色々とネットの情報を参考にしています。

cp dai9kaihinanbasyo.dbf dai9kaihinanbasyo.dbf.bak


最初の10バイトはC0に変更します。

43300000 00000000 0000

次の10バイトはC1に変更します。

43310000 00000000 0000


修正したファイルをアップロード対象に含めて、データセットの作成を行います。

フィールド名がC0C1として認識されるようになりました。

接続にアップロードに先ほど作成したAPEXDEVを選択します。表名はTOKYO_HINANBASHO、データセット名はTOKYO_HINANとします。

送信をクリックします。


データセットTOKYO_HINANが作成されます。警告が表示されているので、右の3点メニューからプロパティを開き、警告の内容を確認します。


データセットのプロパティのタブを開きます。

C0は一意の数値を保持しています。そのため、キーとして使用オンに変更し、キーの検証をクリックします。

キーが有効であることが確認できたら、適用をクリックしてプロパティの画面を閉じます。


警告がとれたことを確認して、データセットTOKYO_HINANからプロジェクトを作成します。


データセットTOKYO_HINANが追加済みのプロジェクトが作成され、アクティブ・プロジェクトになります。プロジェクト名はUntitledですが、保存されているデータセットを確認するだけの作業なので、そのままにします。

データセットにあるTOKYO_HIKANを地図にドラッグ&ドロップします。


地図上に避難場所のShapefileに含まれていたポリゴンが表示されます。


以上でOracle Spatial Studioを使った、Shapefileのデータベースへのインポートは完了です。

Oracle APEXの作業に移ります。

Shapefileをロードしたスキーマがパーシング・スキーマに設定されているAPEXのワークスペースにサインインし、アプケーション作成ウィザードを起動します。

作成するアプリケーションの名前は東京都避難場所とします。

ページの追加をクリックします。


マップを選択します。


追加するページの名前避難場所とします。TOKYO_HINANBASHOを選択します。ポリゴンを選択し、ジオメトリ列GEOMツールチップ列C1を選択します。

以上でページの追加をクリックします。


作成されるアプリケーションにページ避難場所が追加されました。

アプリケーションの作成をクリックします。


アプリケーションが作成されました。アプリケーションを実行して、マップの表示を確認します。


APEXのマップ上に東京都の避難場所が表示されていることが確認できます。


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

Oracle APEXのアプリケーション作成の参考になれば幸いです。