PHPで直近の地震情報を表示する

(1/1)
東日本大震災の余震と見られる地震が収まらない。
そこで今回は、気象庁の地震情報のサイトから、直近の地震情報を取得する PHP スクリプトを作成してみることにする。

※2019 年(平成 31 年)3 月 16 日、Yahoo! JavaScript マップも利用できるようにした。

サンプル・プログラムの実行例

PHPで直近の地震情報を表示する
Google マップ表示

サンプル・プログラム

圧縮ファイルの内容
earthquake.phpサンプル・プログラム本体。
pahooGeoCode.php住所・緯度・経度に関わるクラス pahooGeoCode。
使い方は「PHPで住所・ランドマークから最寄り駅を求める」などを参照。include_path が通ったディレクトリに配置すること。

プログラムの方針

気象庁の地震情報(http://www.jma.go.jp/jp/quake/)では、直近の地震情報を表示している。
この HTML から
  1. 発生日時
  2. 震源地
  3. 震源の位置
  4. 震源の深さ
  5. 規模
  6. 最大震度
の 6 つを取り出すことにする。正規表現を使えば簡単に取り出せる。また、震源の位置を Google マップ上にプロットすることにする。

準備:pahooGeoCode クラス

0026: class pahooGeoCode {
0027:     var $items;      //検索結果格納用
0028:     var $error;      //エラーフラグ
0029:     var $hits;       //検索ヒット件数
0030:     var $webapi; //直前に呼び出したWebAPI URL
0031: 
0032:     //Google Cloud Platform APIキー
0033:     //https://cloud.google.com/maps-platform/
0034:     //※Google Maps APIを利用しないのなら登録不要
0035:     var $GOOGLE_API_KEY_1 = '**************************';   //HTTPリファラ用
0036:     var $GOOGLE_API_KEY_2 = '**************************';   //IP制限用
0037: 
0038:     //Yahoo! JAPAN Webサービス アプリケーションID
0039:     //https://e.developer.yahoo.co.jp/register
0040:     //※Yahoo! JAPAN Webサービスを利用しないのなら登録不要
0041:     var $YAHOO_APPLICATION_ID = '*****************************';

地図描画のために、クラスファイル "pahooGeoCode.php" を使用する。組み込み関数  require_once  を使って読めるディレクトリに配置する。ディレクトリは、設定ファイル php.ini に記述されているオプション設定 include_path に設定しておく。
クラスについては「PHP でクラスを使ってテキストの読みやすさを調べる」を参照されたい。

地図として Google マップを利用するのであれば、Google Cloud Platform API キー が必要で、その入手方法は「Google Cloud Platform - WebAPI の登録方法」を、YOLP マップを利用するのであれば、Yahoo! JAPAN Web サービス アプリケーション IDが必要で、その入手方法は「Google Cloud Platform - WebAPI の登録方法」を、それぞれ参照されたい。

準備:地図サービス(WebAPI)の選択

0024: //地図サービス(WebAPI)の選択
0025: //    0:Google
0026: //    1:Yahoo!JAPAN
0027: define('GEOSERVICE', 0);

表示する地図は、Google マップと Yahoo!マップ(YOLP 地図)から選べる。
あらかじめ、定数 GEOSERVICE に値を設定すること。
PHPで直近の地震情報を表示する
Yahoo!マップ表示

解説:地震情報の取り出し

0091: /**
0092:  * 地震情報取得(JMAから)
0093:  * @param array $item 情報を格納する配列
0094:  * @return int (-1) : 取得失敗(ネットワーク接続異常)
0095:  *                0  : 情報無し
0096:  *              (+1) : 取得成功
0097: */
0098: function get_earthquake(&$item) {
0099:     //JMAサイトから情報取り出し
0100:     $url = JMA_QUAKE;
0101:     $pat = "/気象庁発表(<br>)+(.+。)/ui";  //Ver.1.2
0102:     $infp = fopen($url, 'r');
0103:     if ($infp == FALSEreturn (-1);
0104:     $sour = '';
0105:     while (! feof($infp)) {
0106:         $str = fgets($infp);
0107:         if (preg_match($pat$str$arr) > 0) {
0108:             $sour = $arr[2];
0109:             break;
0110:         }
0111:     }
0112:     fclose($infp);
0113: 
0114:     //マッチする文がない
0115:     if ($sour == '')   return 0;
0116: 
0117:     $sour = preg_replace("/&nbsp/", '', $sour);
0118:     $sour = strip_tags($sour);
0119:     $sour = preg_replace("/./", '.', $sour);
0120:     $sour = mb_convert_kana($sour, 'nr');
0121: 
0122:     if (preg_match('/([0-9]+)日([0-9]+)時([0-9]+)分.+地震がありました/ui', $sour$arr) > 0) {
0123:         $item['year']    = date('Y');
0124:         $item['month']   = date('n');
0125:         $item['day']     = (int)$arr[1];
0126:         $item['hour']    = (int)$arr[2];
0127:         $item['minuite'] = (int)$arr[3];
0128:     } else {
0129:         return 0;
0130:     }
0131:     if (preg_match('/震源地は、([^(]+)(北緯[0-9|\.]+度、/ui', $sour$arr) > 0) {
0132:         $item['location']  = $arr[1];
0133:     } else {
0134:         $item['location'] = '不明';
0135:     }
0136:     if (preg_match('/(北緯([0-9|\.]+)度、東経([0-9|\.]+)度)/ui', $sour$arr) > 0) {
0137:         $item['latitude']  = $arr[1];
0138:         $item['longitude'] = $arr[2];
0139:     } else {
0140:         return 0;
0141:     }
0142:     if (preg_match('/震源の深さは([^、]+)、/ui', $sour$arr) > 0) {  //Ver.2.2
0143:         $item['depth'] = $arr[1];
0144:     } else {
0145:         $item['depth'] = '不明';
0146:     }
0147:     if (preg_match('/地震の規模(マグニチュード)は([0-9|\.]+)と/ui', $sour$arr) > 0) {
0148:         $item['magnitude'] = $arr[1];
0149:     } else {
0150:         $item['magnitude'] = '不明';
0151:     }
0152:     if (preg_match('/観測された最大震度は([0-9|強|弱]+)です/ui', $sour$arr) > 0) {
0153:         $item['maxintensity'] = $arr[1];
0154:     } else {
0155:         $item['maxintensity'] = '不明';
0156:     }
0157: 
0158:     return 1;
0159: }

PHP で台風情報を取得する」で紹介したように、正規表現を用いて情報を取り出してゆく。

まず、関数  strip_tags  によって HTML タグを除き、次に変数 $pat に定義する正規表現パターンで必要な部分を切り出す。
切り出したテキストに対して、前述の 76 つの項目を 1 つずつ、正規表現パターンで取り出してゆく。

取り出した緯度・経度情報から地図を描画する方法については、「PHP で住所・ランドマークから最寄り駅を求める」を参照されたい。

なお、気象庁の発表書式が変わることもあり、その場合は各自でパターンを改良するなり対応をお願いしたい。

活用例

みんなの知識 ちょっと便利帳」では、「日本の直近の地震情報」で本プログラムを利用し、見やすいページを提供している。ありがとうございます。

参考サイト

(この項おわり)
header