「最新の気象データ」の仕様については、気象庁の以下のリンクで説明されています。
この中の「今日の降水量」のデータを取得してマップに表示します。今日の降水量は10分毎に更新されます。観測から約30分後に最新のデータが取得できます。ダウンロード方法に記載されているように、時刻指定のファイルの保持期間は24時間、降水量については1、3、6、12、24、48、72時間降水量をそれぞれ異なるCSVファイルとして取得できます。
作成するAPEXアプリケーションは以下のように動作します。
最初に観測所や降水量のデータを保存する表を作成します。表AMEDAS_STATIONSに観測所のデータ、AMEDAS_PRECIPITATIONに降水量のデータを保存します。AMEDAS_RECORDSに気象庁からダウンロードしたデータセットを、それぞれレコードとして記録します。表AMEDAS_STATIONS_INFは、観測所のCSVデータを一旦保存するインターフェース表として使用します。
このスクリプトで作成したデータベース・オブジェクトを削除するには、以下のスクリプトを使用します。
Oracle APEXでは、SQLワークショップのSQLスクリプトを使用して実行できます。
SQLスクリプトを実行すると確認を求められます。そこで即時実行を行なうと、スクリプトが実行されます。4つの表と2つの索引が作成されます。
観測所のデータをデータベースに取り込みます。観測所のデータが記載されているCSVファイルを、気象庁のサイトからダウンロードします。
気象庁の観測概要と観測所一覧のページを開きます。このページのアメダス地点情報履歴ファイルが、観測所のデータが記載されているCSVファイルになります。
アメダス地点情報履歴ファイルはamdmaster.index4.txtという名前でダウンロードされます。
このファイルを表AMEDAS_STATIONS_INFにロードします。APEXアプリケーションにデータ・ロードのページを作成し、CSVデータをロードします。
空のAPEXアプリケーションを作成します。名前はAMeDASとします。
アプリケーションが作成されます。共有コンポーネントのデータ・ロード定義を開きます。
データ・ロード定義を開きます。
データ・ロード定義の作成を開始します。
データ・ロードの作成は最初からを選びます。
次へ進みます。
次へ進みます。
サンプル・ファイルとして観測所のCSVファイルであるamdmaster.index4.txtを選択します。
次へ進みます。
ファイル・エンコーディングとして日本語(Shift_JIS)を選択します。CSVファイルの列見出しにある列名と表AMEDAS_STATIONS_INFの列名に若干の違いがあるため、自動的にマップされない列があります。
マップされていない列は、手作業で表AMEDAS_STATIONS_INFの以下の列にマップします。ソース列がCOLUMN_で始まる列は空列なので、マップ先を設定する必要はありません。
STATION_NAME3 -> STATION_NAME_ROMAJI
DISCONNECTION_OF_SUNSHINE_DURATION -> DISCONNECTION_SUNSHINE_DURATION
STATION_NAME2 -> STATION_NAME_KANA
STATION_NAME_OF_SNOW -> STATION_NAME_SNOW_KANJI
DISCONNECTION_OF_PRECIPITATION -> DISCONNECTION_PRECIPITATION
STATION_NAME_OF_SNOW2 -> STATION_NAME_SNOW_KANA
STATION_NAME_OF_SNOW3 -> STATION_NAME_SNOW_ROMAJI
DISCONNECTION_OF_DEPTH_OF_SNOW_COVER -> DISCONNECTION_DEPTH_SNOW_COVER
DISCONNECTION_OF_HUMIDITY -> DISCONNECTION_HUMIDITY
STATION_NAME -> STATION_NAME_KANJI
DISCONNECTION_OF_WIND_SPEED -> DISCONNECTION_WIND_SPEED
DISCONNECTION_OF_TEMPERATURE -> DISCONNECTION_TEMPERATURE
マップ先をすべて設定したのち、ページの作成および追加を実行します。
データをロードするページを作成します。ページの名前をLoad Stationsとします。その他は、デフォルトのまま変更しません。
ページの作成をクリックします。
データ・ロードのページが作成されます。ページを実行し、観測所のデータをデータベースに取り込みます。
アプリケーションが実行されLoad Stationsのページが開かれます。ファイルの選択をクリックし、amdmaster.index4.txtを選択します。
CSVファイルに含まれる観測所のデータがプレビューされます。データのロードを実行します
CSVファイルamdmaster.index4.txtの内容が、表AMEDAS_STATIONS_INFに保存されます。
表AMEDAS_STATIONS_INFに保存したデータを、表AMEDAS_STATIONSに転記します。表AMEDAS_STATIONSでは、列に適切な型を設定しています。また、表に保持する観測所はEND_DATEが9999-99-99のデータ、つまり現在稼働中の観測所に限定しています。
降水量をマップ上に押出しポリゴンとして表示させるため、列GEOMETRY_PRECIPITATIONとGEOMETRY_SNOWを追加しています。この列には緯度経度の値を中心とした半径2kmの円を保存します。
以上の条件で表AMEDAS_STATIONSのデータを準備します。SQLコマンドで以下のSELECT文を実行して、表AMEDAS_STATIONS_INFの内容を表AMEDAS_STATIONSに転記します。
列GEOMETRY_PRECIPITATIONとGEOMETRY_SNOWに空間索引を作成します。SQLスクリプトを使って、以下のコマンドを実行します。
空間索引としてAM_ST_GEOM_P_SIDXとAM_ST_GEOM_S_SIDXが作成されます。
以上で観測所のデータが準備できました。
次に「最新の気象データ」をデータベースにロードするために使用する、データ・ロード定義を作成します。
アメダスの最新の気象データについては、気象庁の以下のページで説明されています。
データ・ロード定義を作成するために、1時間降水量の最新のデータをファイルとして取得し、それをサンプル・データとして使用します。
https://www.data.jma.go.jp/stats/data/mdrr/pre_rct/alltable/pre1h00_rct.csv
CSVファイルをpre1h00_rct.csvとしてダウンロードします。
先ほどと同様にデータ・ロード定義の作成を開始します。
作成するデータ・ロード定義の名前はPrecipitation、表名としてAMEDAS_PRECIPITATIONを選択します。
次へ進みます。
サンプル・データとして、ダウンロードしたpre1h00_rct.csvを選択します。
次へ進みます。
ファイル・エンコーディングとして日本語(Shift_JIS)を選択します。CSVデータのロード先は表AMEDAS_PRECIPITATIONですが、この表はCSVファイルにある列の一部だけを保存します。以下のソース列に限り、マップ先を設定します。
地点 -> STATION_NAME
現在地_MM_ -> CURR_VALUE_MM
現在地の品質情報 -> CURR_VALUE_QUALITY
観測所番号 -> STATION_NUMBER
都道府県 -> PREF_NAME
現在時刻_時_ -> CURR_HOUR
現在時刻_日_ -> CURR_DAY
現在時刻_月_ -> CURR_MONTH
現在時刻_年_ -> CURR_YEAR
現在時刻_分_ -> CURR_MINUTE
以上でデータ・ロードの作成をクリックします。
降水量については、観測時刻と期間の情報を表AMEDAS_RECORDSに記録しダウンロードしたデータに紐づけるため、データ・ロードのページは作成せずPL/SQLのコードからデータ・ロードを実行します。
データ・ロード定義Precipitationが作成されます。
表AMEDAS_RECORDSの行と表AMEDAS_PRECIPITATIONの紐付けに使用するアプリケーション・アイテムを、G_RECORD_IDとして作成します。
共有コンポーネントのアプリケーション・アイテムを開きます。
アプリケーション・アイテムの作成を開始します。
作成するアプリケーション・アイテムの名前としてG_RECORD_IDを設定します。
アプリケーション・アイテムの作成をクリックします。
アプリケーション・アイテムG_RECORD_IDが作成されました。
先ほど作成したデータ・ロード定義Precipiationによるデータ・ロードが実行されるときに、アプリケーション・アイテムG_RECORD_IDの値が列RECORD_IDに保存されるように、データ・プロファイル列を追加します。
データ・ロード定義Precipitationを編集します。
データ・プロファイルの編集を開きます。
列の追加をクリックします。
ソースのSQL式としてnv('G_RECORD_ID')を設定します。この設定により、データ・ロード定義Precipitationを用いたデータ・ロードが実行される時点でのアプリケーション・アイテムG_RECORD_IDの値が、表AMEDAS_PERCIPITATIONの列RECORD_IDに保存されます。
以上の設定でデータ・プロファイル列を作成します。
データ・プロファイル列RECORD_IDが作成されたことを確認して、変更の適用をクリックします。
変更の適用をクリックして、データ・ロードの編集を完了します。
以上でデータ・ロード定義の作成は完了です。
ホーム・ページに降水量を表示するマップを実装します。
観測時刻を選択するページ・アイテムをP1_TIMEとして作成します。タイプは選択リスト、ラベルは観測時刻とします。検証の必須の値をオンにします。
LOVのタイプにSQL問合せを選択し、SQL問合せとして以下を記述します。データベースのSYSDATEがUTCを返す環境で作業をしているため、SYSDATEを9時間進めた上で30分遅らせる(観測データがダウンロードできるようになるのが30分後であるため)ために 8.5 / 24をSYSDATEに加えています。
追加値の表示、NULL値の表示ともにオフにします。
降水量の計測期間を選択するページ・アイテムをP1_DURATIONとして作成します。タイプは選択リスト、ラベルは期間とします。検証の必須の値をオンにします。
ページ・アイテムP1_TIMEの右隣に配置するため、レイアウトの新規行の開始をオフにします。
LOVのタイプに静的値を選択します。追加値の表示、NULL値の表示ともにオフです。
LOVの静的値として気象データのURLに設定する1h00、3h00、6h00、12h00、24h00、48h00、72h00を、表示値と戻り値の両方に設定します。設定した順番で表示されるように、ソートの実行時にソートはオフにします。
タイプが非表示のページ・アイテムとして、P1_RECORD_IDとP1_SCALEを作成します。P1_RECORD_IDは、マップに表示する降水量のRECORD_IDを保持します。P1_SCALEは、押出しポリゴンの高さを調整する数値を保持します。
気象庁からデータを取得するボタンSUBMITを作成します。
外観のホットをオン、テンプレート・オプションのWidthをStretchに設定します。また、この下にマップ・リージョンを配置するため、ボタンとリージョンの間に少し隙間が空くようにSpacing BottomにSmallを設定します。
動作のアクションはデフォルトのページの送信とします。
識別の名前はLoad PRECIPITATION from AMeDASとします。
ソースのPL/SQLコードに以下を記述します。
サーバー側の条件のボタン押下時にSUBMITを指定します。
以上でボタンSUBMITをクリックすると、気象庁からCSVファイルをダウンロードし、データベースに保存します。
アプリケーションを実行し、ボタンSubmitをクリックします。
アプリケーション上は変化がありません。
SQLコマンドで表AMEDAS_PRECIPITATIONを検索すると、データが投入されていることが確認できます。
select * from amedas_precipitation
降水量を表示するマップ・リージョンを作成します。
識別の名前はAMeDASとします。タイプはマップです。
レイヤーを設定します。
識別の名前は降水量、レイヤー・タイプに押出しポリゴンを選択します。
ソースのSQL問合せに以下を記述します。マップの表示はページ・ロード時に行われ動的アクションによるリフレッシュは実装していないため、送信するページ・アイテムの設定は不要です。
ジオメトリ列GEOMETRY_PRECIPITATIONに空間索引を作成しているため、空間索引の使用をオンにします。
列のマッピングのジオメトリ列のデータ型にSDO_GEOMETRYを選択し、ジオメトリ列としてGEOMETRY_PRECIPITATION、主キー列にSTATION_NUMBERを設定します。表AMEDAS_PRECIPITATIONの主キーは列RECORD_IDとSTATION_NUMBERの複合主キーですが、マップに表示されるデータのRECORD_IDは1つだけなので、マップ上はSTATION_NUMBERでデータが一意に決まります。そのため、主キー列としてSTATION_NUMBERを設定できます。
外観のカラー・スキームの使用をオンにし、カラー・スキームにカスタムを選択して、カスタム・カラー・リストに以下を記述します。
#0000ff, #2020df, #4040bf, #60609f, #804080, #9f6060, #bf4040, #df2020, #ff0000
最小値から最大値の間で、青から赤へ色が変わるようにしています。しかし、この設定ではマップ上に表示されているデータの最小値と最大値に合わせて色が決定されるため、降水量として危険でない値でもマップ上の最大値であれば赤く表示されてしまいます。カラー値列の絶対値に合わせて表示色を設定する方法を見つけることはできませんでした。
カラー値列はCURR_VALUE_MM、押出し値列はCURR_VALUE、単位はメートル、塗りつぶしの不透明度は.7に設定します。
ツールチップの拡張フォーマットをオンにし、HTML式として以下を記述します。
Time: &P1_TIME.<br>
Station Name: &STATION_NAME.<br>
Pref Name: &PREF_NAME.<br>
Value: &CURR_VALUE_MM. (mm)<br>
Duration: &P1_DURATION.
サインイン直後はP1_RECORD_IDが未設定なため、マップ・リージョンでエラーが発生します。回避するためにサーバー側の条件として、タイプにアイテムはNULLではないを選択し、アイテムにP1_RECORD_ID、実行条件に1回を選択します。
以上でAPEXアプリケーションは完成です。アプリケーションを実行すると、記事の先頭のGIF動画のように動作します。
AMeDASや気象データに興味がなくても、CSVファイルのコードによるデータベースへの取り込み方法については参考になるのではないでしょうか。
今回作成したAPEXアプリケーションのエスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/AMeDAS.zip
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完