ストラテジー株式会社が提供している高度利用者向け緊急地震速報専用受信ソフトウエア SignalNow Express(以下SNE) をインストールしてみた。
 P2P地震情報@wikiを見ると、なるほど通知に関してはhtmlとjavascriptがメインなんだ。
 とゆーことで、表示位置の改善と、到達時間の読み上げをメインにちょっといじってみる。

 とりあえずwikiのようにアイコンの変更HomePyontaと登録地点を自宅に。
 SignalNow Express が IE8 に対して投げるURLは file:///C:/Program%20Files/SignalNow%20Express/map.html?cmd=quake&stime=38.77&tick=22.64&elat=37.0&elan=140.5&clat=36.0&clan=140.0 のような感じで、どうやらブラウザにマグニチュードや震度は渡されていない為、SNEのブラウザコントロール中で処理するのは無理。
 よって、とりあえず表示位置の改善と、到達時間の読み上げ(カウントダウン)処理を追加してみる。

表示位置

javascriptメイン部

var midLat = (Number(get["elat"]) + Number(get["clat"])) / 2;		// 緯度中間値
var midLng = (Number(get["elan"]) + Number(get["clan"])) / 2;		// 経度中間値
var centerPos = new google.maps.LatLng(midLat, midLng);		//それを中心座標にして
var zoomlevel;
var count = 0;				// カウントダウン回数保存用(音声読み上げ用)
var rest = 0;				// 残り時間(音声読み上げ用)
if(distance >= 1200){
	zoomlevel = 5;
} else if(distance >= 600){
	zoomlevel = 6;
} else if(distance >= 300){
	zoomlevel = 7;
} else if(distance >= 150){
	zoomlevel = 8;
} else if(distance >= 75){
	zoomlevel = 9;
} else {
	zoomlevel = 10;
}
としておいて

javascript - initialize()

//initialize
function initialize(){
	//map
	var mapOptions;
	if(get["cmd"] == "quake"){
		mapOptions = {
			disableDoubleClickZoom : true,
			scrollwheel: true,
			zoom : zoomlevel,			// ←ここでズームレベルを与えてやる
			center : centerPos,
			navigationControl: true,
			navigationControlOptions : {
				position : google.maps.ControlPosition.TOP_RIGHT
			},
			mapTypeControl: false,
			scaleControl: true,
			mapTypeId: google.maps.MapTypeId.TERRAIN
		};
 と、こんな感じで、震央と登録地の中間点を中心としたマップが表示される。

残り時間読み上げ(カウントダウン)


CSS部


<style type="text/css"> 
<!-- 
	div#map {
		position:absolute; 
		top:0px; 
		left:0px;
	}
	div#notice{		/* このnotice部を表示用に流用 */
		position:absolute;
		top: 200px;
		left: 0;
		width:100%;
		text-align:center;
		font-family: "DFP極太明朝体", sans-serif;
		font-size:200px;
		font-weight:bold;
		filter:alpha(opacity=65);
		color:yellow;
	}
	.num{			/* 数字部分 */
		font-family: "Impact", sans-serif;
		display:inline-block;
		width:220px;
	}
	.pre{			/* 数字の前 */
		font-size:40%;
		margin-top:30px;
		vertical-align:top;
	}
	.post{			/* 数字の後 */
		font-size:40%;
		margin-top:60px;
	}
 -->
</style>

HTML部

<body>
<bgsound src="mp3/kinkyu.mp3" id="sound></bgsound>	<!-- IEなのでbgsoundで音を鳴らす -->
<div id="map">
	<div id="map_canvas" style="width:625px;height:626px"></div>
</div>
<div id="notice">
<span style='font-size:80px;color:red;vertical-align:middle'>緊急地震速報</span>	<!-- とりあえず速報と書いておく -->
</div>
</body>
 ってな感じにしておいて、

javascript

// earthQuake
function earthQuake(){
    tick++;
    quakeRadius = SPEED_S * tick;
    circle.setRadius(quakeRadius * 1000);
    if(quakeRadius < distance){
        if(count == 1){
            document.getElementById("sound").setAttribute("src","mp3/ato.mp3");
        } else if(count >= 3){
            rest = Math.floor((distance - quakeRadius) / SPEED_S);
            if(rest < 50){
                if(rest > 0){
                    document.getElementById("notice").innerHTML = 
                    "<span class='pre'>あと </span><span class='num'>" + rest + "</span><span class='post'> 秒</span>";
                    if(count == 0){
                        document.getElementById("sound").setAttribute("src","mp3/" + rest + ".mp3");
                    } else {
                        if(rest == 10){
                            document.getElementById("sound").setAttribute("src","mp3/10m.mp3");
                        } else if(rest == 5){
                            document.getElementById("sound").setAttribute("src","mp3/05m.mp3");
                        } else if(rest <= 9){
                            document.getElementById("notice").style.color = "red";
                            document.getElementById("sound").setAttribute("src","mp3/0" + rest + "s.mp3");
                        } else {
                            document.getElementById("sound").setAttribute("src","mp3/" + rest + ".mp3");
                        }
                    }
                } else {
                    document.getElementById("notice").innerHTML = 
                    "<span class='pre'>あと </span><span class='num'>0</span><span class='post'> 秒</span>";
                    document.getElementById("sound").setAttribute("src","mp3/arrived3.mp3");
                }
            } else {
                if(count == 3){
                    document.getElementById("sound").setAttribute("src","mp3/50o.mp3");
                }
            }
        }
        count++;
        setTimeout("earthQuake()", INTERVAL);
    } else {    
        if(count >= 2){
            document.getElementById("notice").style.color = "red";
            document.getElementById("notice").innerText = "到達";
        } else {
            document.getElementById("notice").style.fontSize = "30px";
            document.getElementById("notice").innerText = "過去の地震";
        }
    }
}
 と、書いて、音声ファイルのSNE_mp3.zip(SNEの警報音に合わせてゲインを上げてある(99db)ので、mp3gain等を使用して適宜音量調整)をインストールディレクトリのmp3以下に置いてやると、
 まぁ、これはIE8に上でも書いたURL「file:///C:/Program%20Files/SignalNow%20Express/map.html?cmd=quake&stime=38.77&tick=22.64&elat=37.0&elan=140.5&clat=36.0&clan=140.0」を表示させてやっているので、実際のプログラム実行画面とは異なるし、プログラムのカウントダウンとも若干ずれることもあるんだけど、画面を見に行かなくてもだいたいの感じはつかめるかな。
 マグニチュードと予想震度を表示させるには、ローカルにWebサーバーを立てて、phpなりでquake.xmlやsne.logを読みに行ってやればできそう。map.htmlからリダイレクトで飛ばしてやれば表示できるはずだし。
 ajaxで数値を定期的に受け取ってやれば、Webサービスとしても稼働できそうな感じではある。
 上記をまとめたmap.htmlをzipで固めたmap.zip
>>続報あり