東京アメッシュのサイトを解析して、ある地域(今回は東東京のあたり)において雨が観測されているかどうかを検知してみます。
スポンサーリンク
デモ画面では、東京アメッシュの地図上(画像サイズ 770×480 ピクセル)において、地点A-Bを対角線とする四角形の範囲(東東京)を指定し、その範囲において雨が観測されているかどうかを検知しています。
東京アメッシュの仕組み
東京アメッシュは5分ごとに観測データが更新されています。大まかな仕組みとしては、地図画像(770×480 ピクセル)の上に、雨観測データとしての透過GIF画像(770×480 ピクセル)が重なっています。その透過GIF画像が5分ごとに更新され、雨雲が移動しているように見えます。
更新日時は以下のURLで取得できます。また透過GIF画像のファイル名は「更新日時+gif拡張子」となっています。
1 |
http://tokyo-ame.jwa.or.jp/scripts/mesh_index.js |
透過GIF画像のファイル名の一例
201604051240.gif
デモ画面の仕組み
まず更新されている雨観測データの最新透過GIF画像を取得します。その画像をグラフィックライブラリであるGDを利用して、指定した範囲のピクセル状態を取得し調べます。もし調べたピクセルのalpha値が0であるならば、その部分は透明ではなく雨が観測されているということになります。
amesh.php(デモ画面)
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 |
<?php //更新日時の取得 $jsonp = file_get_contents('http://tokyo-ame.jwa.or.jp/scripts/mesh_index.js'); echo "<pre>"; print_r($jsonp); echo "</pre>"; //前後の文字列を消去しJSONとして利用できるようにする $object = json_decode(substr($jsonp, 19, -6)); //最新のGIF画像を取得するURL $url = "http://tokyo-ame.jwa.or.jp/mesh/000/{$object[0]}.gif"; //img-now.gifという名前で画像ファイルを保存 $filename = "img-now.gif"; $data = file_get_contents($url); file_put_contents('./'.$filename,$data); //1秒遅らせる sleep(1); //画像をオープンする $img = ImageCreateFromGIF('img-now.gif'); //A地点(400,170) $a_x = 400; $a_y = 170; //B地点(550,300) $b_x = 550; $b_y = 300; for($y = $a_y; $y <= $b_y; $y++){ for($x = $a_x; $x <= $b_x; $x++){ //色を取得 $color_index = imagecolorat($img, $x, $y); //可読形式にする $color_tran = imagecolorsforindex($img, $color_index); //アルファ値を取得 $area[] = $color_tran[alpha]; } } //$area配列に0があるかどうか if( in_array(0, $area) ){ echo "<p>指定した範囲の中で雨を観測しています</p>"; }else{ echo "<p>指定した範囲の中では雨を観測していません</p>"; } |
24行目
もしGIF画像ではなくJPEG画像の場合は、ImageCreateFromJPEG関数を利用します。画像形式によりそれぞれの関数を利用します。
34〜44行目
指定した地域のピクセルのアルファ値(alpha)を取得しています。
37行目のimagecolorat関数は、ピクセルの色のインデックスを返します。
39行目のimagecolorsforindex関数は、指定したインデックスに対する色(RGB)とアルファ値を返します。
39行目の$color_tranの値にはピクセルが無色透明の場合、以下のような配列が入ります。
1 |
Array( [red]=>0 [green]=>0 [blue]=>0 [alpha]=>127) |
47〜51行目
alphaの値は0から127まであり、透過GIF画像の場合は0か127のどちらかになります。雨が降っていない場合は透明であり、alphaの値は127となります。 alphaが0(ゼロ)の場合は透明でない場合で、雨が観測されていることになります。
つまり$area配列の値に0が一つでもあれば、雨が観測されていることになります。
参照ページ
PHPマニュアル