Note: この記事は、3年以上前に書かれています。Webの進化は速い!情報の正確性は自己責任で判断してください。
Google Mapsのドキュメントから基本部分だけサクッと抜粋。この辺押さえておけば、普通に使う分には大丈夫でしょう。あとは必要に応じてリファレンス浚う感じで良いかな~、とか。
- 基本ソース
- 対応ブラウザ・チェック
- 基本部分
- 移動(アニメーション)
- コントロール・ボタン追加
- マーカー設置
- 線を引く
- イベント・リスナー
- 情報ウィンドウを開く
- マーカーの上に情報ウィンドウを開く
- 情報ウィンドウ(タブ付)を開く
- オリジナル・アイコンを設置する
- ドラッグ可能なマーカーを設置する
- XMLファイルを利用する
- メモリー・リーク対策
- 関連記事、公式資料
サンプル用意したほうが良いかな? 催促されたら考えよう。 → ということで、用意してみた
基本ソース
<!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>Google Maps JavaScript API Example</title>
<script type="text/javascript" src="http://maps.google.com/maps?file=api&v=2&key=abcdefg"></script>
<script type="text/javascript">
//<![CDATA[
function load() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("map"));
map.setCenter(new GLatLng(37.4419, -122.1419), 13);
}
}
//]]>
</script>
</head>
<body onload="load()" onunload="GUnload()">
<div id="map" style="width: 500px; height: 300px"></div>
</body>
</html>
Google のお手本。必ずしも onload で呼び出す必要はないけれど、実行タイミングによってはエラーが出たりするので気をつけよう。コードは function なりオブジェクトなりでカプセル化してやると良いように思う。
ちなみに、API Keyはディレクトリ単位で入手する必要がある。「http://archiva.jp/」で入手したAPI Keyは「http://archiva.jp/web/」では使えない。サブドメインも不可。
対応ブラウザ・チェック
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("map"));
map.setCenter(new GLatLng(37.4419, -122.1419), 13);
}
基本部分
var map = new GMap2(document.getElementById("map"));
map.setCenter(new GLatLng(35.319031, 139.550703), 14);
マップを表示するボックスを指定。初期表示位置とズーム値を設定する。目的地の座標を取得するには、Geocodingなんかが便利。
移動(アニメーション)
window.setTimeout(function() {
map.panTo(new GLatLng(37.4569, -122.1569));
}, 1000);
指定した座標まで移動する。
コントロール・ボタン追加
map.addControl(new GSmallMapControl());
map.addControl(new GLargeMapControl());
map.addControl(new GMapTypeControl());
map.addControl(new GSmallZoomControl());
map.addControl(new GScaleControl());
map.addControl(new GOverviewMapControl ());
スライダーとかズームコントロールとか、航空写真への切り替えとか。
マーカー設置
var point = new GLatLng(35.673020,139.552449);
map.addOverlay(new GMarker(point));
マップに刺さってるピンみたいなやつ。
線を引く
var points = [];
points.push(new GLatLng(35.314937,139.546167));
points.push(new GLatLng(35.319857,139.551422));
points.push(new GLatLng(35.320093,139.552432));
map.addOverlay(new GPolyline(points));
経路表示とかに使われてるライン。基本は配列なので、以下のように書くこともできる。
var polyline = new GPolyline([
new GLatLng(35.314937, 139.546167),
new GLatLng(35.319857, 139.551422),
new GLatLng(35.320093, 139.552432)
], "#FF0000", 10);
map.addOverlay(polyline);
なお、「IEで見るためには以下の記述を付けろ」とのこと
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml">
イベント・リスナー
GEvent.addListener(map, "moveend", function() {
var center = map.getCenter();
document.getElementById("message").innerHTML = center.toString();
});
map.setCenter(new GLatLng(37.4419, -122.1419), 13);
イベントを付加する。上記はマップ移動後の座標を示し、下記はマーカーをクリックで設置/撤去の切り替える。
GEvent.addListener(map, "click", function(marker, point) {
if (marker) {
map.removeOverlay(marker);
} else {
map.addOverlay(new GMarker(point));
}
});
情報ウィンドウを開く
map.openInfoWindow(map.getCenter(), document.createTextNode("Hello, world"));
吹き出しメモみたいなやつ。
マーカーの上に情報ウィンドウを開く
function createMarker(point, number) {
var marker = new GMarker(point);
GEvent.addListener(marker, "click", function() {
marker.openInfoWindowHtml("Marker #<b>" + number + "</b>");
});
return marker;
}
map.addOverlay(createMarker(point, 1));
マーカーをクリックで、その場所についての情報を表示。
情報ウィンドウ(タブ付)を開く
var infoTabs = [
new GInfoWindowTab("Tab #1", "This is tab #1 content"),
new GInfoWindowTab("Tab #2", "This is tab #2 content")
];
var marker = new GMarker(map.getCenter());
GEvent.addListener(marker, "click", function() {
marker.openInfoWindowTabsHtml(infoTabs);
});
map.addOverlay(marker);
marker.openInfoWindowTabsHtml(infoTabs);
吹き出しにタブ切り替えを付ける。
オリジナル・アイコンを設置する
var icon = new GIcon();
icon.image = "http://labs.google.com/ridefinder/images/mm_20_blue.png";
icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
icon.iconSize = new GSize(12, 20);
icon.shadowSize = new GSize(22, 20);
icon.iconAnchor = new GPoint(6, 20);
icon.infoWindowAnchor = new GPoint(5, 1);
var point = new GLatLng(35.314937,139.546167);
var marker = new GMarker(point, icon);
map.addOverlay(marker);
マーカーの画像を自分で用意するときに。オブジェクトの継承を利用して以下のように書けば、、複数のアイコンを使いまわすことができる。同じ大きさ/形で色だけ違う場合とか。
var icon2 = new GIcon(icon);
icon2.image = "http://www.google.com/mapfiles/marker2.png";
var marker = new GMarker(point, icon2);
ドラッグ可能なマーカーを設置する
var point = new GLatLng(35.314937,139.546167);
var marker22 = new GMarker(point, {draggable: true});
map.addOverlay(marker22);
XMLファイルを利用する
<markers>
<marker lat='35.31945' lng='139.551371' shop='イワタコーヒー店'><![CDATA[ <a href="./shop.html">イワタコーヒー店</a><br />(カフェ) ]]></marker>
<marker lat='35.319857' lng='139.551422' shop='なると屋+展座'><![CDATA[ <a href="./shop.html">なると屋+展座</a><br />(和食) ]]></marker>
<marker lat='35.320093' lng='139.55243' shop='長兵衛'><![CDATA[ <a href="./shop.html">長兵衛</a><br />(居酒屋) ]]></marker>
... goodness ...
</markers>
上記のようなXMLファイルから、情報を取得する場合は以下のようになる。
var request = GXmlHttp.create();
request.open("GET", "/shops.xml", true);
request.onreadystatechange = function() {
if (request.readyState == 4) {
var xmlDoc = request.responseXML;
var markers = xmlDoc.documentElement.getElementsByTagName("marker");
for (var i = 0; i < markers.length; i++) {
var lat = parseFloat(markers[i].getAttribute("lat"));
var lng = parseFloat(markers[i].getAttribute("lng"));
var point = new GLatLng(lat,lng);
var html = markers[i].firstChild.nodeValue;
var shop = markers[i].getAttribute("shop");
var marker = createMarker(point,html,shop);
map.addOverlay(marker);
}
}
}
request.send(null);
XML HTTP Requestを知っていれば判りやすい。XHRに関しては以前書いた記事を参照のこと。
以下は、もうちょいシンプルなメソッド。ただしHTTP GET リクエストで呼び出し、なおかつreadystate による状態のチェックをしない場合。
GDownloadUrl("data.xml", function(data, responseCode) {
var xml = GXml.parse(data);
var markers = xml.documentElement.getElementsByTagName("marker");
for (var i = 0; i < markers.length; i++) {
var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
parseFloat(markers[i].getAttribute("lng")));
map.addOverlay(new GMarker(point));
}
});
メモリー・リーク対策
<body onunload="GUnload()">
Note: スパム対策が面倒なので、コメント投稿を廃止しました。以前のコメントは残します。
ご意見・ご要望はtwitter@sigwygかはてブコメントにて。
4 Comments
ということで、適当コーディングですが、この記事書いたときに作ってた奴を置いてみます。
ちょっと思うところがあるので、ちゃんとした奴は機を改めてでも。
http://archiva.jp/test/set/gmaps_sample/index.html
久しぶりに見てみると、本家のドキュメントもけっこう変わってますね。
いちお本家にもサンプルは置いてあるんですが ...パーマリンクってなんだろう... --) 2007–10–04 03:45
また、不明な点が出てきたので、お暇な時に、お願いしたく思います。
■質問1:xmlをジオコーディングで、マーカー表示
色々調べていくうちに、各スポット毎に、経度緯度を調べて、掘り込む作業を繰り返してましたが、ジオコーディングのapiが見つかり、なんと住所から経度緯度を割り出す方法が載ってました。
しかし、多くのページが、フォーム内に住所を書いて検索すると、その経度緯度を発見させてマーカー表示させています。
これでは、少し実用性がないので、以前Sigさんに書いていただいたxml内に、経度緯度を書かず、住所とそれ以外の要素を表記(例えば、住所をaddressと)し、
html内のjavascriptで、addressを読み込むと同時にジオコーディング(経度緯度を算出)し、googlemap上にxmlの内容に沿ってマーカーが表示される方法が出来たら最高だ!っと思っております。
こんな事って出来るんでしょうか?
簡単さってなもんでしたら、よければ、またお時間あられるときに、作成いただけましたら、
何とも嬉しいです。
■質問2:複数のxmlの表示の仕方
質問1とあわせてなんですが、例えば、観光スポットのサイトを作成している場合、京都観光スポットマップと、大阪観光スポットマップ、東京・・・と複数のxmlに分けている場合、ユーザーからしたら、いったんページを脱出し、他のスポットマップに飛ぶっていうのは、アクセスしにくいっと思い、一つのgooglemap上で、複数のxmlを読み込み、例えば、京都スポットマップリンクを押すと、京都スポットマップxmlを読み込み、googlemap上に表示したり・・・
ってのがやりたいですが・・・これは、色々と勉強して、なんとか出来そうなんですが・・・どうもコードが汚くて
もっさりしてしまいます。そこで、Sigさんならどういう風に、されるのかな?っと思い、ご質問させて頂きました。
以上、
勝手に長々と書いてしまいましたが、ほんとに、お暇な時に、今日はノッテルゼ!ってな時に
また、htmlとxmlを書いていただけると、至極嬉しく思います。 2007–10–22 10:49