WebSocket API仕様(緊急地震速報受信者向け)


緊急地震速報について

  • 緊急地震速報は、気象庁から発表される地震動の警報・予報のことで、震源に近い観測点でとらえた地震波(P波、初期微動)から震源要素等(震源・規模・発生時刻)を瞬時に推定し、強い揺れ(S波、主要動)の大きさおよび到達時刻を知らせるものです。
  • 本サービスは、緊急地震速報(予報)を用いて受信地点における震度や到達時間を予測してお知らせするものです。
  • 本データタイプ:"earthquake"は、気象庁が定義する 「一般向け予報」 を提供するサービスです。
    • 「特定向け予報」のサービスが必要なお客様はお問い合わせください。(離島などの1つの観測点の観測データに基づく予報を必要とする場合)

注意事項

  • 本サービスは、地震の発生を予知するものではありません。本サービスの出力は、気象庁が発表する緊急地震速報(予報)に含まれる予報資料(震源の位置・深さ、地震の規模、発生時刻)を用いて、気象庁長官の許可を得た予測手法に基づく予報です。
  • 気象庁が発表する予報資料は、地震発生直後の短時間で震源や規模等の推定を行うため、精度が十分でない場合があります。このため、予想される震度や猶予時間にも誤差が生じる場合があります。
  • 緊急地震速報の特性上、直下地震など震源に近い場合は、予報が主要動到達に間に合わないことがあります。
  • 1観測点のデータを使っている段階では、地震以外の揺れ(事故、落雷)や機器障害により誤った情報を発表する可能性があります。
  • 本サービスでは、予想精度の観点から200 kmより深い地震については震度予想を行いません。深さ100 km以深の地震においては震度予想を行いますが、予想精度が十分でない場合があります。
  • 本サービスでは、緊急地震速報(予報)のうち「最大予測震度のみの高度利用者向け緊急地震速報」の電文はマグニチュード情報が設定されておらず、震度予測計算ができないため、通知を行いません。このため、地震発生直後に初めて通知する緊急地震速報の電文シーケンス番号が1(初報)でない可能性があります。
  • 緊急地震速報の特性や限界に関しての詳細は、 気象庁のwebサイト などでご確認ください。
  • 本サービスの地震動予報は、予報業務許可第190号(株式会社かなめ技術開発)で気象庁から許可を受けています。
  • 本サービスは、経緯度情報に日本測地系2000を利用します。
  • 気象庁が発表する緊急地震速報には、「通常報」と「訓練報」の2つのモードが存在しますが、本サービスではこの内「通常報」のみを取り扱い、「訓練報」は取り扱いません。
  • 本サービスで通知する緊急地震速報のデータには、「通常報」「訓練報」「試験報」のモードが存在しており、データを利用する際にはこれらのモードに対して適切な処理を行ってください。
    • 例えば「訓練報」「試験報」モードのデータは利用しない、利用する場合は明らかに 訓練試験 であることが分かるようにするなど、利用者の混乱を避けてください。
    • 「訓練報」「試験報」モードのデータを、「通常報」データであるかのような処理は 行わない でください。
      • 気象庁発表緊急地震速報の訓練報は取り扱いませんが、「訓練報」モードで通知されることがあるため適切な処理を行ってください。
    • モードの誤用によるトラブルについては、弊社は一切の責任を負わないものとします。

「緊急地震速報を適切に利用するために必要な受信端末の機能及び配信能力に関するガイドライン」について

受信端末のガイドラインについて

  • 気象庁から「緊急地震速報を適切に利用するために必要な受信端末の機能及び配信能力に関するガイドライン」(以降、"受信端末のガイドライン"と略記)が公示されています。
    • 受信端末のガイドラインの詳細な内容については、 気象庁のwebサイト の資料をご確認ください。

EqCare Type-Gサービスの受信端末のガイドライン準拠状況について

2018/6/25公示の受信端末のガイドライン準拠への対応

  • 本サービスは受信端末のガイドラインに準拠するため、以下の通りシステム変更をいたします。
    • データタイプ:"earthquake"は、気象庁が定義する 「一般向け予報」 を提供するサービスといたします。
    • 1つの観測点の観測データのみに基づいて発表した緊急地震速報(予報)の電文の場合は、配信パラメータ:「地域別予測震度情報」に空ハッシュを設定いたします。
      • つまり、この場合に通知するWebSocketメッセージには震度の予測計算結果を含まないように変更いたします。
      • 受信端末のガイドラインでは、1つの観測点の観測データに基づく予報は「特定向け予報」としてのみ利用を許可するように変更となったことへの措置となります。
      • 現在WebSocket APIを利用しているお客様は、受信プログラムの変更は必要ありません。 (配信するデータ内容の変更であり、データ構造に変更はありません)
    • WebSocket APIの配信データの変更適用日時は、 2018/11/21 20:00頃 を予定しております。

本APIを利用するユーザ様へ受信端末のガイドライン作成と公示のお願い

  • 本APIの緊急地震速報を組み込むユーザ様の製品やサービスについては、受信端末のガイドラインの作成と公開をお願いしております。
  • 作成いただいた受信端末のガイドラインの準拠状況については以下のwebサイトで公開いたします。
  • 弊社から受信端末のガイドラインの書面のテンプレートをお渡しいたします。

気象庁の緊急地震速報(予報/警報)の技術的改善(PLUM法)導入に関して

  • 震度予想精度向上を目的として、緊急地震速報(予報/警報)にPLUM法と呼ばれる技術的改善を、気象庁が2018年3月22日に運用を開始しました。
    • 緊急地震速報の技術的改善については、 気象庁のwebサイト の資料をご確認ください。
    • 本サービスは気象庁の緊急地震速報(予報)を基に配信しているため、この技術的改善の仕様に合わせて以下の変更があります。
      • 配信パラメータ:地震シーケンス番号(sequence)の最大値が増加
        • 地震シーケンス番号の設定値範囲が、1~99から1~359に変更。
      • 一地震に対するデータタイプ:緊急地震速報の配信回数(報数)が増加
        • 気象庁発表の緊急地震速報の発表報数が一般的に増えるとされており、本サービスからの配信回数も増加します。
        • 一例として気象庁のシミュレートで過去地震は以下の結果が出ております。
          • 東北地震(3/11): 15報が58報に増加
          • 熊本地震(4/14): 12報が20報に増加
          • 熊本地震(4/16): 6報が7報に増加
    • 上述以外の変更はありません。
      • 配信パラメータのデータ構造・内容・設定値は、地震シーケンス番号(sequence)の設定範囲値を除き変更ありません。

緊急地震速報の通知について

  • 気象庁発表の緊急地震速報を元に、地域毎の震度予測情報などをWebSocket API経由で通知します。
  • 本サービスでは、2次メッシュコード(10㎞四方)で分けられたエリアごとの地震情報を通知します。
  • 本サービスでは、 震度3(intensity値2.5)以上 と推測されたエリアの地震情報を通知します。
    • 2次メッシュコード以外のピンポイントエリアでの地震情報や、震度2以下も含む震度予測情報の通知利用など、ご要望がありましたらご相談ください。

WebSocket API 緊急地震速報通知メッセージ仕様

  • 緊急地震速報:WebSocket API通知メッセージ表

    セクション パラメータ タイプ 設定値 意味 備考
    version   Hash 以下の2パラメータを設定 メッセージのバージョン情報設定セクション  
      common_version String 任意 commonセクションのパラメータバージョン 現在は1のみ対応
      details_version String 任意 detailsセクションのパラメータバージョン 現在は1のみ対応
    common   Hash 以下の4パラメータを設定 メッセージの共通情報設定セクション 以下の4パラメータはバージョン1のもの
      datatype String earthquake メッセージのタイプ  
      msgid String 独自定義値 メッセージ毎の一意な番号 JMA-EQK-[地震ID]-[seqno]-ver[VER] など
      sendid String 独自定義値 メッセージの配信元情報 緊急地震速報配信サーバ(JMA) など
      senddatetime String YYYY-MM-DD HH:mm:SS+HH:mm形式 メッセージの送信時刻  
    details   Hash データタイプ毎のパラメータを設定 メッセージの詳細情報設定セクション 緊急地震速報情報を設定します。
  • WebSocket APIからの緊急地震速報通知メッセージ詳細

    • version区(セクション)

      • common_version:common区のバージョンが設定。(現在は"1"のみ利用)
      • details_version:details区(緊急地震速報)のバージョンが設定。(現在は"1"のみ利用)
    • common区(セクション)

      • common_version: "1"は、以下のパラメータを含みます。

        • datatype:緊急地震速報のdatatype名:"earthquake"が設定されます。

        • msgid:地震情報毎の一意な値が設定されます。

          書式:[sendid]-EQK-[地震ID]-[シーケンス番号]-ver[緊急地震速報バージョン]
            [sendid]:緊急地震速報の発信元情報です。
            EQK:地震情報を意味します。
            [地震ID]:地震情報ごとに気象庁が割り振る番号です。
            [シーケンス番号]:地震IDごとの地震発表時に気象庁が更新する番号です。キャンセル報の場合、シーケンス番号の末尾に「cancel」が付与されます。
            [緊急地震速報バージョン]:緊急地震速報通知のバージョン値(=details_version)です。
          
        • sendid:緊急地震速報の発信元情報が設定されます。(例:JMA など)

        • senddatetime:緊急地震速報通知メッセージの送信時刻が設定されます。(YYYY-MM-DD HH:mm:SS+HH:mm形式)

    • details区(セクション)


サンプルプログラム

  • html(javascript)

    • WebSocket APIへの接続と認証および緊急地震速報メッセージの受信表示処理

        1
        2
        3
        4
        5
        6
        7
        8
        9
       10
       11
       12
       13
       14
       15
       16
       17
       18
       19
       20
       21
       22
       23
       24
       25
       26
       27
       28
       29
       30
       31
       32
       33
       34
       35
       36
       37
       38
       39
       40
       41
       42
       43
       44
       45
       46
       47
       48
       49
       50
       51
       52
       53
       54
       55
       56
       57
       58
       59
       60
       61
       62
       63
       64
       65
       66
       67
       68
       69
       70
       71
       72
       73
       74
       75
       76
       77
       78
       79
       80
       81
       82
       83
       84
       85
       86
       87
       88
       89
       90
       91
       92
       93
       94
       95
       96
       97
       98
       99
      100
      101
      102
      103
      104
      105
      106
      107
      108
      109
      110
      111
      112
      <html>
      <head>
      </head>
      <body>
      <div id="output"></div>
      
      <script>
      (function() {
        // websocketサーバアドレスおよびポートを指定
        var ws = new WebSocket("wss://localhost:443");
      
        var output = document.getElementById('output');
      
        function logStr(eventStr, msg) {
          return '<div>' + eventStr + ':' + msg + '</div>';
        }
      
        // websoket接続確立イベント処理
        ws.onopen = function() {
          output.innerHTML += logStr('connect', 'success');
      
          // websocket認証メッセージ
          var auth_message = {
            version: {
              common_version:   "1",					// commonセクションバージョン
              details_version:  "1"					// detailsセクションバージョン
            },
            common: {
              datatype:     "authentication",				// データタイプ:認証(authenticaion指定)
              msgid:        "*",					// *を設定(認証では利用しない)
              sendid:       "*",					// *を設定(認証では利用しない)
              senddatetime: "*"					// *を設定(認証では利用しない)
            },
            details:      {
              password:     "trialpass"				// ユーザパスワードを設定(利用申請時に発行)
            },
            sender: {
              version:      "1",					// senderセクションバージョン
              userid:       "trialuser",				// ユーザIDを設定(利用申請時に発行)
              termid:       "000000001"				// 接続端末識別IDを設定(ユーザがユニークな値となるよう任意に採番)
            },
            receiver: {
              version:      "1",					// receiverセクションバージョン
              userid:       "*",					// *を設定(認証では利用しない)
              termid:       "*"					// *を設定(認証では利用しない)
            }
          };
          // JSON形式に変換し、websocketサーバに送信
          ws.send(JSON.stringify(auth_message));
        };
      
        // メッセージ受信イベント処理
        ws.onmessage = function(e) {
          // JSON形式からオブジェクトに変換
          var parse = JSON.parse(e.data);
      
          switch( parse.common.datatype ) {
            case "authentication":    // 認証メッセージ受信処理
              output.innerHTML += logStr('recieved', 'authentication result');
              if( parse.details.resultcode === '200' ) {
                // 認証成功
                output.innerHTML += logStr('authentication', 'success');
              } else {
                // 認証失敗
                output.innerHTML += logStr('authentication', 'failed');
              }
              break;
            case "earthquake":        // 緊急地震速報受信処理
              // 地震メッセージ種別判別
              switch( parse.details.type ) {
                case 0:  // 通常報
                  break;
                case 1:  // 訓練報
                  output.innerHTML += "<br><FONT color=\"#ff0000\">これは訓練報です。</FONT><br>";
                  break;
                case 2:  // 試験報
                  output.innerHTML += "<br><FONT color=\"#ff0000\">これはテスト報です。</FONT><br>";
                  break;
              }
              // 地震情報
              var od = new Date();
              od.setTime(parse.details.eewinfo.occured_datetime * 1000);
              var od_hh = od.getHours();
              var od_mm = od.getMinutes();
              var od_ss = od.getSeconds();
              output.innerHTML += od_hh + ":" + od_mm + ":" + od_ss + ":" + "頃 地震が発生しました。<br>";
              output.innerHTML += "震源地は、北緯" + parse.details.eewinfo.latitude + "度 東経" + parse.details.eewinfo.longitude + "度 深さ" + parse.details.eewinfo.depth + "km 地点です。<br>";
              output.innerHTML += "マグニチュード" + parse.details.eewinfo.magnitude + "と推測されます。<br>";
        
              // 地域予測震度情報(例:メッシュコード:533945=新宿区)
              if( parse.details.areainfo["533945"] !== void 0 ) {
                output.innerHTML += "このエリアの震度は" + parse.details.areainfo["533945"].intensity + "程度と推測されます。<br>";
                var sd = new Date();
                sd.setTime(parse.details.areainfo["533945"].s_time * 1000);
                var sd_hh = sd.getHours();
                var sd_mm = sd.getMinutes();
                var sd_ss = sd.getSeconds();
                output.innerHTML += "主要動の到達時刻は" + sd_hh + ":" + sd_mm + ":" + sd_ss + ":" + "頃と推測されます。<br>";
              }
              break;
          }
        };
      
        // 切断イベント処理
        ws.onclose = function (e) {
          output.innerHTML += logStr('disconnect', e.code + ' - ' + e.type);
        };
      }());
      
      </script>
      </body>
      </html>