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