天気情報を地図上に表示する

説明

全国の天気などで日本地図の上に天気のアイコンが表示されます。このような処理はGoogle MapsとCGIとWebサービスの組み合わせ(マッシュアップ)で手軽に実現することができます。続きは書籍で、どうぞ...
逆引きGoogle Maps APIリファレンス  詳しい解説などは逆引きGoogle Maps APIリファレンス、またはGoogle Maps APIリファレンスを参照してください。

サンプルコード [実行]

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Sample</title>
<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAasAJryKxWJnBFVJa487d9hTHGAxTVT7IRADYa-JdYz7xQ8IQZBSthgDZdggYpQHsmm6WYtHstQFfLA" type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
var map, httpObj, count, wData;
window.onload = function() {
map = new GMap2(document.getElementById("gmap"));
map.setCenter(new GLatLng(37, 138), 6);
map.addControl(new GLargeMapControl());

var msec = (new Date()).getTime();
httpObj = GXmlHttp.create();
httpObj.open("get", "./point.csv?cache="+msec);
httpObj.onreadystatechange = function() {
if ((httpObj.readyState == 4) && (httpObj.status == 200)) {
var CR = String.fromCharCode(13);
var tmp = httpObj.responseText;
wData = tmp.split(CR); // 行単位で配列に格納
count = 0; // 読み込み地域を示すカウンタを初期化
readWeatherData(); // 1行ごと地域の天気を読み込み
};
}
httpObj.send(null);
}
function readWeatherData() { // 天気情報を読み込み
var cityNo = wData[count].split(",")[2]; // 三番目が都市番号
var msec = (new Date()).getTime();
httpObj = GXmlHttp.create();
httpObj.open("get", "./getWeather.cgi?city="+cityNo+"&cache="+msec);
httpObj.onreadystatechange = function() {
if ((httpObj.readyState == 4) && (httpObj.status == 200)) setMarker();
}
httpObj.send(null);
}
function setMarker() { // 天気アイコンを表示
var XML = httpObj.responseXML;
var imgTag = XML.getElementsByTagName("image")[0];
var imgSrc = imgTag.getElementsByTagName("url")[0].firstChild.nodeValue;
var pnt = wData[count].split(",");
var iconObj = new GIcon();
iconObj.image = imgSrc;
iconObj.iconSize = new GSize(50,31);
iconObj.iconAnchor = new GPoint(25, 15);
var marker = new GMarker(new GLatLng(pnt[1], pnt[0]), iconObj);
map.addOverlay(marker);
count++;
if (count < wData.length) readWeatherData(); // 全ての地域を表示するまで繰り返す
}
//]]>
</script>
</head>
<body>
<div id="gmap" style="width: 500px; height: 500px"></div>
</body>
</html>