2023年10月27日金曜日

札幌市の熊出没情報の出没位置をマップ上に表示する

札幌市が公開している令和5年度ヒグマ出没情報をデータベースに保存し、出没した位置をマップ上に表示するAPEXアプリケーションを作ってみました。地図に表示する出没情報は、ファセット検索で絞り込めます。

元情報:札幌市ヒグマ出没情報

作成したアプリケーションは以下のように動作します。


以下よりアプリケーションの作り方を紹介します。

最初に熊出没情報を保存する表を作成します。表BEAR_HTML_DATAは、札幌市ヒグマ出没情報のページをそのままHTMLとして保存します。表BEAR_SIGHTINGSに、Webページから取り出した出没情報を保存します。

クイックSQLの以下のモデルより、表BEAR_HTML_DATAとBEAR_SIGHTINGSを作成します。


SQLの生成SQLスクリプトを保存レビューおよび実行を順次実施します。


SQLスクリプトが開きます。列LOCATIONの型をnumberからOracle Spatialのオブジェクトを保存するSDO_GEOMETRY型に変更します

実行をクリックします。


即時実行します。


表BEAR_HTML_DATAとBEAR_SIGHTINGSが作成されました。


札幌市ヒグマ出没情報のWebページを読み取り、表BEAR_SIGHTINGSに出没情報として保存します。

Webページを表BEAR_HTML_DATAに文字情報として保存します。以下のSQLを実行します。複数回実行すると、列NAMEがSAPPOROである行が複数保存されます。この後の作業で、列NAMEがSAPPOROとなっている行は1行だけ、という前提で書かれてるコードがあるので注意してください。

Webページが、丸ごと列HTMLにCLOBとして保存されます。


 ヒグマ出没情報のWebページに含まれるHTMLの表データをパースし、行と列のデータをして返すパイプライン表関数bear_sapporo_parse_html_tableを作成します。

SQLワークショップSQLスクリプトで、以下のスクリプトを実行します。確認画面が開いたら即時実行します。



3つのタイプと1つのファンクションが作成されます。


ヒグマ出没情報の内容をファセット検索のファセットとして使えるように、JSON配列に変換するファンクションbear_get_sighting_attrsを作成します。


以下のINSERT文を実行し、ヒグマ出没情報のWebページの情報を表BEAR_SIGHTINGSに投入します。



2023年10月27日の実行では、190行のデータが表BEAR_SIGHTINGSに挿入されました。

表やデータの準備は以上で完了です。

APEXアプリケーションの作成を始めます。

アプリケーション作成ウィザードを起動します。アプリケーションの名前熊出没情報とします。

ホーム・ページ削除し、代わりにファセット検索ページを追加します。


ファセット検索のページは、ページ名熊出没情報レポートを選択し、としてBEAR_SIGHTINGSを指定します。


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

アプリケーションが作成されます。

ページ・デザイナでページ番号のファセット検索のページを開きます。


クラシック・レポートのリージョンBear Sightingsを選択します。

ソースタイプSQL問合せに変更し、SQL問合せに以下を記述します。ファセットとして使用するため、列ADDRESSから区の名前を抜き出しています。


また、詳細静的IDとしてbear_sightingsを設定します。


レポートBear Sightingsの列LOCATIONは座標値、ATTRIBUTES(元はNOTE)、WARD(元はADDRESS)はファセットとして使うために作成した列なので、これらのタイプ非表示に変更します。


SIGHING_NOを選択し、ヘッダーNoに変更します。


SIGHTING_DATEを選択し、ヘッダー日時外観書式マスクDL TSに変更します。


ADDRESSを選択し、ヘッダー場所に変更します。


NOTEを選択し、ヘッダー内容に変更します。


ファセットP1_NOTEP1_SIGHTING_NOを削除します。


ファセット上でコンテキスト・メニューを開き、ファセットの作成を実行します。


作成されたファセットを選択します。最初にファセットを作ります。

識別名前P1_WARDとします。タイプチェック・ボックス・グループです。ラベルになります。LOVタイプとして個別値を選択します。


もうひとつ同じ手順でファセットを作成します。

識別名前P1_ATTRIBUTESタイプチェック・ボックス・グループを選択します。LOVタイプ個別値を指定します。


プロパティ・エディタを下の方にスクロールさせます。

複数の値タイプJSON配列を選択し、フィルタの結合AND (論理積)にします。


以上で、ファセット検索とクラシック・レポートの部分は完成です。アプリケーションを実行して、これまでの作業結果を確認します。


これから、このページにマップを追加します。

ファセット検索が適用されたクラシック・レポートをマップのソースとして扱うために、パイプライン表関数facet_report_keysを作成します。

SQLスクリプトを使って実行します。


ページ・デザイナでの作業に戻ります。

リージョンボタン・バーの上でコンテキスト・メニューを表示させ、下にリージョンを作成を実行します。


新規に作成されたリージョンを選択します。

識別タイトル地図とし、タイプとしてマップを選択します。外観テンプレートBlank with Attributesを選択します。


リージョン地図を選択し、プロパティ・エディタの属性タブを開きます。

初期位置およびズームとして札幌市の中心を指定します。タイプとして静的値を選択し、経度141.3543緯度43.062ズーム・レベル9を設定します。

今回はレイヤーが1つだけなので、凡例表示オフにします。


右ペインのレンダリング・ビューで、リージョン地図にひとつだけあるレイヤーを選択します。

識別名前出没場所レイヤー・タイプとしてポイントを選択します。ソースタイプSQL問合せを選択し、SQL問合せとして以下を記述します。


INFOとして情報ウィンドウに表示するデータを定義していますが、これは情報ウィンドウ拡張フォーマットが思ったように動かないためのワークアラウンドです。


情報ウィンドウ拡張フォーマットオンにし、HTML式として&INFO.を設定しています。原因は不明ですが、&INFO.以外の列をHTML式に含めても置換されません。情報ウィンドウだけでなく、ツールチップも同じ症状です


クラシック・レポートがリフレッシュした後にマップもリフレッシュするよう、動的アクションを作成します。

リージョンBear Sightings上でコンテキスト・メニューを表示させ、動的アクションの作成を実行します。


作成された動的アクションを選択します。

識別名前地図をリフレッシュとします。タイミングイベントはデフォルトでリフレッシュ後選択タイプリージョンリージョンBear Sightingsになります。


TRUEアクションを選択します。

識別アクションとしてリフレッシュを選択し、影響を受ける要素選択タイプリージョンリージョン地図を選択します。


以上で、熊出没情報のアプリケーションは完成です。アプリケーションを実行すると、記事の先頭のGIF動画のように動作します。

今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/bear-sightings-with-facet-and-map.zip

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