2025年9月26日金曜日

気象庁から最新の気象データをCSVでダウンロードして降水量をマップに表示する

気象庁から「最新の気象データ」をCSV形式のファイルとしてダウンロードし、降水量をマップ上に表示するAPEXアプリケーションを作成します。

「最新の気象データ」の仕様については、気象庁の以下のリンクで説明されています。

この中の「今日の降水量」のデータを取得してマップに表示します。今日の降水量は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とします。


アプリケーションが作成されます。共有コンポーネントデータ・ロード定義を開きます。


データ・ロード定義を開きます。


データ・ロード定義の作成を開始します。


データ・ロードの作成最初からを選びます。

へ進みます。


作成するデータ・ロード定義の名前Stationとします。表名AMEDAS_STATIONS_INFを選択します。

へ進みます。


サンプル・ファイルとして観測所の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ファイルに含まれる観測所のデータがプレビューされます。データのロードを実行します

表AMEDA_STATIONS_INFの列の型はVARCHAR2(4000)であり制約もないため、CSVのデータは文字列としてそのまま表に保存されます。


CSVファイルamdmaster.index4.txtの内容が、表AMEDAS_STATIONS_INFに保存されます。


表AMEDAS_STATIONS_INFに保存したデータを、表AMEDAS_STATIONSに転記します。表AMEDAS_STATIONSでは、列に適切な型を設定しています。また、表に保持する観測所はEND_DATE9999-99-99のデータ、つまり現在稼働中の観測所に限定しています。

降水量をマップ上に押出しポリゴンとして表示させるため、列GEOMETRY_PRECIPITATIONGEOMETRY_SNOWを追加しています。この列には緯度経度の値を中心とした半径2kmの円を保存します。

以上の条件で表AMEDAS_STATIONSのデータを準備します。SQLコマンドで以下のSELECT文を実行して、表AMEDAS_STATIONS_INFの内容を表AMEDAS_STATIONSに転記します。



GEOMETRY_PRECIPITATIONGEOMETRY_SNOWに空間索引を作成します。SQLスクリプトを使って、以下のコマンドを実行します。


空間索引としてAM_ST_GEOM_P_SIDXAM_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式を選択します。保存先の表AMEDAS_PRECIPITATIONの列RECORD_IDに合わせて、名前RECORD_IDデータ型数値を選択します。

ソース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に設定する1h003h006h0012h0024h0048h0072h00を、表示値戻り値の両方に設定します。設定した順番で表示されるように、ソート実行時にソートオフにします。


タイプ非表示のページ・アイテムとして、P1_RECORD_IDP1_SCALEを作成します。P1_RECORD_IDは、マップに表示する降水量のRECORD_IDを保持します。P1_SCALEは、押出しポリゴンの高さを調整する数値を保持します。


気象庁からデータを取得するボタンSUBMITを作成します。

外観ホットオンテンプレート・オプションWidthStretchに設定します。また、この下にマップ・リージョンを配置するため、ボタンとリージョンの間に少し隙間が空くようにSpacing BottomSmallを設定します。

動作アクションはデフォルトのページの送信とします。


ボタンSUBMITをクリックしたときに実行されるプロセスを作成します。

識別名前Load PRECIPITATION from AMeDASとします。

ソースPL/SQLコードに以下を記述します。

サーバー側の条件ボタン押下時SUBMITを指定します。


以上でボタンSUBMITをクリックすると、気象庁からCSVファイルをダウンロードし、データベースに保存します。

アプリケーションを実行し、ボタンSubmitをクリックします。


アプリケーション上は変化がありません。

SQLコマンドで表AMEDAS_PRECIPITATIONを検索すると、データが投入されていることが確認できます。

select * from amedas_precipitation


降水量を表示するマップ・リージョンを作成します。

識別名前AMeDASとします。タイプマップです。


リージョンの属性を開き、初期位置およびズームに日本が中心に表示されるように設定します。タイプ静的値を選択し、経度139.6917緯度35.6895ズーム・レベルとします。


レイヤーを設定します。

識別名前降水量レイヤー・タイプ押出しポリゴンを選択します。

ソース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のアプリケーション作成の参考になれば幸いです。