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

緊急地震速報(警報)について

  • 緊急地震速報(警報)とは、地震波が2点以上の地震観測点で観測され、最大震度が5弱以上または最大長周期地震動階級が3以上と予想された場合に、地震の発生時刻、発生場所(震源)の推定値、地震発生場所の震央地名、強い揺れ(震度5弱以上または長周期振動階級3以上)が予想される地域及び震度4が予想される地域名を知らせるものです。
  • 緊急地震速報(警報)で続報を発表する場合
    • 警報が発表されていない地域に、新たに震度5弱以上または長周期地震動階級3以上が予想された場合に、続報を発表します。
    • 続報では、新たに震度5弱以上または長周期地震動階級3以上が予想された地域及び新たに震度4が予想された地域を発表します。
    • 落雷等の地震以外の現象を地震と誤認して発信された緊急地震速報(誤報)のみ取り消すこととし、例えば震度5弱と予想していた地域が震度3以下との予想となった場合などは取り消しません。
  • 予報との違い
    • 警報
      • 最大震度5弱以上または最大長周期地震動階級3以上の揺れが予想されたときに、強い揺れが予想される地域に対し地震動により重大な災害が起こるおそれのある旨を警告して発表するものです。
      • このうち、震度6弱以上または長周期地震動階級4の揺れが予想される場合を特別警報に位置付けます。
    • 予報
      • 最大震度3以上または長周期地震動階級1以上、マグニチュード3.5以上等と予想されたときに発表するものです。
  • 本データタイプ:"jmaearthquake_warning"は、気象庁が定義する 「一般向けの緊急地震速報(警報)」 を提供するサービスです。

注意事項

  • 本サービスは、地震の発生を予知するものではありません。地震の観測情報や震度、最大長周期地震動階級などをお知らせするものです。
  • 本サービスは、気象庁が発表する緊急地震速報(警報)に含まれる情報を元に最大震度が5弱以上または最大長周期地震動階級が3以上と予想された地域を通知するものです。
  • 緊急地震速報(警報)についての詳細は、 気象庁のwebサイト でご確認ください。

取り扱い対象データについて

  • 本サービスで取り扱うデータには、「通常報」「訓練報」「試験報」の3つのモード(運用種別)が存在しております。
    データを利用する際は、これらのモードに対して適切な処理を行ってください。
    • 例えば「訓練報」「試験報」モードのデータは利用しない、利用する場合は明らかに 訓練試験 であることが分かるようにするなど、利用者の混乱を避けてください。
    • 「訓練報」「試験報」モードのデータを、「通常報」データであるかのような処理は 行わない でください。
    • モードの誤用によるトラブルについては、弊社は一切の責任を負わないものとします。
  • 取り扱うモードは利用するサーバによって異なります。各サーバで取り扱うモードは、以下の通りといたします。

本番系WebSocketサーバでのAPI利用の場合

  • 本番系WebSocketサーバでは、「通常報」のみを取り扱い、それ以外のモードは取り扱いません。

トライアル/開発系WebSocketサーバでのAPI利用の場合

  • トライアル/開発系WebSocketサーバでは、「通常報」「訓練報」「試験報」の3つのモードを取り扱います。

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

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

    セクション パラメータ タイプ 設定値 意味 備考
    version   Hash 以下の2パラメータを設定 メッセージのバージョン情報設定セクション  
      common_version String 任意 commonセクションのパラメータバージョン 現在は1のみ対応
      details_version String 任意 detailsセクションのパラメータバージョン 現在は1のみ対応
    common   Hash 以下の4パラメータを設定 メッセージの共通情報設定セクション 以下の4パラメータはバージョン1のもの
      datatype String jmaearthquake_warning メッセージのデータタイプ  
      msgid String 独自定義値 メッセージ毎の一意な番号 JMA-EQW-[地震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名:"jmaearthquake_warning"が設定されます。

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

          書式:[sendid]-EQW-[地震ID]-[シーケンス番号]-ver[緊急地震速報(警報)バージョン]
            [sendid]:緊急地震速報(警報)の発信元情報です。
            EQW:地震情報を意味します。
            [地震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
      113
      114
      115
      116
      117
      118
      119
      120
      121
      122
      123
      124
      125
      126
      127
      128
      129
      130
      131
      132
      133
      134
      135
      136
      <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 "jmaearthquake_warning":        // 緊急地震速報(警報)受信処理
             // 地震メッセージ種別判別
             switch( parse.details[0].controlstatuscode ) {
              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(parse.details[0].eewinfo.occured_datetime);
            //od = parse.details[0].eewinfo.occured_datetime;
            var od_hh = od.getHours();
            var od_mm = od.getMinutes();
            var od_ss = od.getSeconds();
            output.innerHTML += od_hh + ":" + od_mm + ":" + od_ss + ":" + "頃 地震が発生しました。<br>";
      
      
            //緯度・経度・深さを文字列として取得
            var latitude = parse.details[0].eewinfo.latitude
            var longitude = parse.details[0].eewinfo.longitude
            var depth = parse.details[0].eewinfo.depth
      
            // 数字に変換
            var numlatitude = Number(latitude);
            var numlongitude = Number(longitude);
            var numdepth = Number(depth);
      
            if(latitude.indexOf('+') !== -1 && longitude.indexOf('+') !== -1) {
                output.innerHTML += "震源地は、北緯" + Math.abs(numlatitude) + "度 東経" + Math.abs(numlongitude) + "度 深さ" + Math.abs(depth/1000) + "km 地点です。<br>";
            }else if (latitude.indexOf('-') !== -1 && longitude.indexOf('+') !== -1) {
                output.innerHTML += "震源地は、南緯" + Math.abs(numlatitude) + "度 東経" + Math.abs(numlongitude) + "度 深さ" + Math.abs(depth/1000) + "km 地点です。<br>";
            }else if(latitude.indexOf('+') !== -1 && longitude.indexOf('-') !== -1) {
                output.innerHTML += "震源地は、北緯" + Math.abs(numlatitude) + "度 西経" + Math.abs(numlongitude) + "度 深さ" + Math.abs(depth/1000) + "km 地点です。<br>";
            }else{
                output.innerHTML += "震源地は、南緯" + Math.abs(numlatitude) + "度 西経" + Math.abs(numlongitude) + "度 深さ" + Math.abs(depth/1000) + "km 地点です。<br>";
            }
            output.innerHTML += "マグニチュード" + parse.details[0].eewinfo.magnitude + "と推測されます。<br>";
      
            // 地域予測震度情報
             if( parse.details[0].ebi["100"] !== void 0) {
               output.innerHTML += "このエリアの震度は" + parse.details[0].ebi["100"].intensity_min + " ~ "+ parse.details[0].ebi["100"].intensity_max + "程度と推測されます。<br>";
               output.innerHTML += "このエリアの長周期地震動階級は" + parse.details[0].ebi["100"].lgintensity_min + " ~ "+ parse.details[0].ebi["100"].lgintensity_max + "程度と推測されます。<br>";
               var sd = new Date(parse.details[0].ebi["100"].s_time);
               var sd_hh = sd.getHours();
               var sd_mm = sd.getMinutes();
               var sd_ss = sd.getSeconds();
               if(sd_hh == NaN || sd_mm == NaN || sd_ss == NaN){
                output.innerHTML += "主要動は到達しました。"
               }else{
                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>