2022年2月3日木曜日

アメダスのデータをGASで取得する。(気象庁JSONファイルを使用)

-----
・追記(2022-2-10)

-----

昨年の気象庁のサイトの表示形式変更により、以前作ったアメダスのデータをWebスクレイピングで取得するGAS(Google Apps Script)が使えなくなっていたので新たに作り直しました。

現在、アメダスのデータはJSON形式でAPIチックに提供されるようになっているので、よりシンプルなデータの取得が可能になっています。(気象庁としては、あくまでもAPIではないらしいのですが。)



今回は、GASで小名浜のアメダスのデータを取得して、スプレッドシートに保存できるようにしてみます。


※ 相変わらず、動けばいいやの精神で作っておりますので、どうぞよろしくお願いいたします。


① 取得するアメダスのデータの確認

まずは観測所番号を確認します。


小名浜の場合ですと、上のアメダスのページより「都道府県」→「福島県」→「小名浜」と選択します。表示されるURLの「36846」の部分が小名浜の観測所番号になります。

https://www.jma.go.jp/bosai/amedas/#amdno=36846&area_type=offices&area_code=070000&format=table1h&elems=53414


10分毎のアメダスのデータを格納したJSONは、以下の形式のURLから取得できます。「yyyyMMddHHmm」の部分は10分刻みの年月日時分です(分の後ろにゼロが2つあります)。

https://www.jma.go.jp/bosai/amedas/data/map/yyyyMMddHHmm00.json

このJSONには全国の観測所のデータが含まれるため、小名浜のデータのみを抽出してスプレッドシートに記録します。


ちなみに、以下のJSONには全国の観測所のデータが格納されいます。ひと手間加えれば任意の観測所のデータを取得するアプリケーションなんかも作れそうですね。また今度。

https://www.jma.go.jp/bosai/amedas/const/amedastable.json


② スプレッドシートの準備

取得したデータを記録するスプレッドシートを準備します。

観測所によって取得できるデータの種類が異なるため確認が必要です。試しに、現在の10~20分前の日時でURLを手作りしてアクセスしてみます。(過去分については1週間分程度アクセス可能なようです。)

https://www.jma.go.jp/bosai/amedas/data/map/20220203123000.json


小名浜のデータは以下になります。(該当箇所は観測所番号で検索すると簡単に探せます。)

  
"36846":{"pressure":[1012.0,0],"normalPressure":[1012.6,0],"temp":[8.6,0],"humidity":[51,0],"visibility":[20000.0,0],"sun10m":[4,0],"sun1h":[0.8,0],"precipitation10m":[0.0,0],"precipitation1h":[0.0,0],"precipitation3h":[0.0,0],"precipitation24h":[0.0,0],"windDirection":[6,0],"wind":[2.7,0]}


含まれるデータは13種類だと分かりました。

1. pressure:現地気圧
2. normalPressure:海面気圧
3. temp:温度
4. humidity:湿度
5. visibility:水平視程
6. sun10m:日照時間(前10分)
7. sun1h:日照時間(前1h)
8. precipitation10m:降水量(前10分)
9. precipitation1h:降水量(前1h)
10. precipitation3h:降水量(前3h)
11. precipitation24h:降水量(前24h)
12. windDirection:風向
13. wind:風速

-----
追記(2022-2-10)

「snow12h」,「snow1h」,「snow24h」,「snow6h」,「weather」の5種類が追加されるタイミングもあるようです。雪が降った時のみでしょうか?
-----



スプレッドシートには、1行目に見出し、2行目に単位を入れておきます。取得したデータは3行目から入力されます。また、A列に日時が入り、B~N列に各データが入ります。(画像では、アメダスのページの表示に合わせて、各データの順番が入れ替わっています。)

シート名は「data」としておきます。(コード作成時にこの名前で使います。)



③ アメダスのデータを取得するGAS

作成したスプレッドシートの「拡張機能」→「Apps Script」からスクリプトファイルを作成します。

タイムゾーンは、「Asia/Tokyo」に変更してください。(「プロジェクトの設定」→「「appsscript.json」マニフェスト ファイルをエディタで表示する」をチェックから「appsscript.json」内を編集。)

まずは、アメダスのデータを取得するGASです。

function getAmadasData() {
  let url = "https://www.jma.go.jp/bosai/amedas/data/map/";
  url = url + getDataTime() + "00.json";
  
  //観測所番号
  let point = "36846";

  //JSONデータの取得
  let response = "";
  try {
    response = UrlFetchApp.fetch(url);
  } catch(e) {
    return response;
  }
  let data = JSON.parse(response.getContentText());
  let amds = [];

  amds.push(getDataTime()); //日時
  amds.push(data[point]["temp"][0]); //温度
  amds.push(data[point]["precipitation10m"][0]); //降水量(前10分)
  amds.push(data[point]["precipitation1h"][0]); //降水量(前1h)
  amds.push(data[point]["precipitation3h"][0]); //降水量(前3h)
  amds.push(data[point]["precipitation24h"][0]); //降水量(前24h)
  let windDirection = data[point]["windDirection"][0]; //風向
  switch(windDirection) {
    case 0:
      windDirection = "静穏";
      break;
    case 1:
      windDirection = "北北東";
      break;
    case 2:
      windDirection = "北東";
      break;
    case 3:
      windDirection = "東北東";
      break;
    case 4:
      windDirection = "東";
      break;
    case 5:
      windDirection = "東南東";
      break;
    case 6:
      windDirection = "南東";
      break;
    case 7:
      windDirection = "南南東";
      break;
    case 8:
      windDirection = "南";
      break;
    case 9:
      windDirection = "南南西";
      break;
    case 10:
      windDirection = "南西";
      break;
    case 11:
      windDirection = "西南西";
      break;
    case 12:
      windDirection = "西";
      break;
    case 13:
      windDirection = "西北西";
      break;
    case 14:
      windDirection = "北西";
      break;
    case 15:
      windDirection = "北北西";
      break;
    case 16:
      windDirection = "北";
      break;
  }
  amds.push(windDirection);
  amds.push(data[point]["wind"][0]); //風速
  amds.push(data[point]["sun10m"][0]); //日照時間(前10分)
  amds.push(data[point]["sun1h"][0]); //日照時間(前1h)
  amds.push(data[point]["humidity"][0]); //湿度
  amds.push(data[point]["pressure"][0]); //現地気圧
  amds.push(data[point]["normalPressure"][0]); //海面気圧
  amds.push(data[point]["visibility"][0] / 1000); //水平視程

  return amds;
}

function getDataTime() {
  //取得データの日時を定義
  let date_and_time = new Date();
  let hour = Utilities.formatDate(date_and_time, "JST", "HH"); 
  let min = Utilities.formatDate(date_and_time, "JST", "mm") - 12; //12分猶予
  min = (Math.floor(min / 10) * 10);
  if(min == -10 || min == -20) {
    if(hour == 0) {
      let day = date_and_time.getDate();
      date_and_time.setDate(day - 1);
      hour = "23";
    } else {
      hour = hour -1;
    }
    min = "50";
  } else if (min == 0) {
    min = "00";
  }
  let date = Utilities.formatDate(date_and_time, "JST", "yyyyMMdd");
  let dataTime = date + ("00" + hour).slice(-2) + min;

  return dataTime;
}
※ コードを一部修正(2022-2-12)
※ コードを一部修正(2022-2-21)

書き換えが必要なのは2か所です。

・6行目「観測所番号」

・19~85行目、配列への格納

配列への格納は、取得するデータに合わせて変更してください。今回は13種類のデータを格納しています。

また、風向は数値を方角に、水平視程はmをkmに変換しています。


アメダスのJSONファイルは、おおよそ10分遅れで提供されるようなので、getDataTime関数でスクリプトが実行された時刻から12分遡り1分単位を切り捨てて取得データの日時を定義しています。



④ 取得したデータをスプレッドシートに保存するGAS

次に、取得したデータをスプレッドシートに記録するGASです。

function setAmdsData() {
  const spreadsheet = SpreadsheetApp.openById("スプレッドシートID");
  const dataSheet = spreadsheet.getSheetByName("data");
  let dataLastRow = dataSheet.getLastRow();

  if(getAmadasData() != "") {
    //900行以上なら1行追加
    if(dataLastRow >= 900) {
      dataSheet.insertRows(dataLastRow + 1);
    }

    //スプレッドシートに入力
    dataSheet.getRange(dataLastRow + 1, 1, 1, 14).setValues([getAmadasData()]);
  }
}

書き換えが必要なのは2か所です。

・2行目「スプレッドシートID」

スプレッドシートを開いた状態でURLの下記部分に表示されます。

https://docs.google.com/spreadsheets/d/ここの値をコピペ/edit#gid=0


・13行目「14」

日時+データで必要となる列数の値です(今回は1+13=14)。


setAmdsData()を実行することで、アメダスのデータがスプレッドシートに記録されます。

トリガー設定をすれば定期的にデータを取得することもできます。


GAS初回実行時は承認が必要となります。無料のGoogleアカウントの場合「このアプリは確認されていません」というページが表示されます。ここで「安全なページに戻る」をクリックすると実行できませんので、「詳細」→「プロジェクト名(安全ではないページ)に移動」から承認します。


***

さて、うまく動きましたでしょうか。

JSONファイルとしてデータを取得できるようになったのは非常に便利ですね。アメダスのデータ以外にもいろいろあるようなので活用していきたいですね。

自作スマート農業、本年も頑張っていきましょう。





Twitter(@nkkmd)日々更新中です。