====== Google Mapsをほどよくカスタマイズしてお手軽に表示 - Google Mapper ======
(更新履歴とコメントは[[http://0-oo.net/log/category/javascript/google-mapper/|Google Mapper Archive - ゼロと無限の間のログ]]でどうぞ。)
※Google Maps API V3を使いたい場合は、[[google-mapper-v3|Google Mapper V3]]をどうぞ。8-)
{{:php-tool-box:map-japan.gif|}}
Google Mapsっていざ使おうとすると意外と面倒。そこで手軽にGoogle Mapsを表示できるようにした。\\
マーカーの表示も使いたいので、配列に位置情報を入れておけばマーカーが表示できるようにした。
久しぶりにGoogle Maps APIを読み返した(意外に変わってた)ら、便利そうなライブラリ([[http://code.google.com/p/gmaps-utility-library/|gmaps-utility-library]])を見つけたのでついでに下記を取り込んでみた。8-)
* マーカーのアイコン画像を色を指定するだけで手軽に作成
* マーカーが表示範囲外にある場合、それが分かるように表示
バージョン0.2.0からは、左下に検索ボックスを表示するようにした。また、マウスホイールのスクロールによるズームにも対応した。
===== サンプル =====
[[http://0-oo.net/sam/google-mapper/v2.php|Google Mapper (V2) 動作サンプル]]
[[http://0-oo.net/aqua/|Japan Aquaria Map and Photos]]
[[http://0-oo.net/misc/wikipedia-map|ものすごい地図 - 伝説のリョコウバトのように日本、アメリカ、ヨーロッパ、そして世界を覆い尽くすものそれは...]]
===== 使い方の例 =====
事前にJavaScriptを読み込む。
後は表示するだけ。
//(マーカーを表示したい場合のみ)マーカーを表示する位置情報をセット
GoogleMapper.points = [
{lat: 35.7, lng: 139.7, title: "Tokyo", openFlg: true},
{lat: 35.2, lng: 136.9, title: "Nagoya"},
{lat: 34.7, lng: 135.5, title: "Osaka", soulFood: "Takoyaki"}
];
//地図を表示する要素(divなど)のidと緯度・経度・ズーム値を指定して表示する
GoogleMapper.load("map", 37, 136, 6);
===== ライセンス =====
[[http://0-oo.net/pryn/MIT_license.txt|MITライセンス]]で。
===== ダウンロード =====
[[http://g.0-oo.net/google-mapper.js|google-mapper.js]]
※ダウンロードできるのは最新のBeta版の場合もあります
===== ソースコード =====
/**
* GoogleMapper.js - (The Wrapper Class of Google Maps API V2)
* @see http://0-oo.net/sbox/javascript/google-mapper
* @version 0.2.1
* @copyright 2008-2010 dgbadmin@gmail.com
* @license http://0-oo.net/pryn/MIT_license.txt (The MIT license)
*
* See also Google Maps API documents.
* @see http://code.google.com/intl/en/apis/maps/documentation/reference.html
*/
var GoogleMapper = {
/**
* マーカーを表示する位置情報
* (例)
* GoogleMapper.points = [
* {lat: 35.7, lng: 139.7, title: "Tokyo", openFlg: true},
* {lat: 35.2, lng: 136.9, title: "Nagoya"},
* {lat: 34.7, lng: 135.5, title: "Osaka"}
* ];
* ・lat, lngは必須
* ・titleはMarkerにマウスカーソルを当てたときに表示される
* ・openFlg = true の場合、地図の初期表示時に吹き出しが表示される
* ・iconにGIconをセットすると個別のiconを表示できる
* ・その他に getInfoHtml() で使いたいデータを入れてもOK
*/
points: [],
/**
* 地図をクリックされた時に情報Windowを表示するかどうか
* trueにすると、副作用としてダブルクリックによるズームを無効にする
*/
pointable: false,
/**
* 検索結果に表示されるAdSenseの設定
* (例)
* GoogleMapper.barAdsOptions = {
* client: "partner-pub-xxxxxxxxxxxxxxxx",
* channel: "xxxxxxxxxx"
* };
*/
barAdsOptions: {},
/** loadしたGMap2オブジェクトがセットされる */
map: null,
/** サイトごとのカスタマイズをするための関数群 */
custom: {}
};
/**
* @param String mapId 地図表示に使う要素(div等)のid属性
* @param Float lat 初期表示する中心地点の緯度
* @param Float lng 初期表示する中心地点の経度
* @param Integer zoom 初期表示するズーム値
* @param Object loadOptions (省略可)Google Mapsをload時のオプション
*/
GoogleMapper.load = function(mapId, lat, lng, zoom, loadOptions) {
// @see http://code.google.com/intl/ja/apis/ajax/documentation/#GoogleLoad
google.load("maps", "2", loadOptions);
google.setOnLoadCallback(function() {
//IEのメモリリーク対策
// @see http://code.google.com/intl/ja/apis/maps/documentation/#Memory_Leaks
document.getElementsByTagName("body")[0].onunload = GUnload;
//ブラウザが対応しているかチェック
if (!GBrowserIsCompatible()) {
GoogleMapper.custom.onUnavailable();
return;
}
var map = (GoogleMapper.map = new GMap2(document.getElementById(mapId), {
googleBarOptions: {
style: "new", //新バージョンの検索窓
adsOptions: GoogleMapper.barAdsOptions
}
}));
GoogleMapper.setupMap(map);
GoogleMapper.custom.initCallback();
//地図を表示
map.setCenter(new GLatLng(lat, lng), zoom);
//マーカーを表示
var icon = GoogleMapper.custom.getIcon();
for (var i = 0; i < GoogleMapper.points.length; i++) {
GoogleMapper.addMarker(GoogleMapper.points[i], icon);
}
});
};
/**
* 地図の表示設定をする
* @param GMap2 map
*/
GoogleMapper.setupMap = function(map) {
var ui = map.getDefaultUI();
if (ui.controls.scalecontrol) { //largeの場合のみtrueになっている
ui.controls.scalecontrol = false; //縮尺
map.enableGoogleBar(); //統合検索コントロール
map.addControl(new GOverviewMapControl()); //概観地図
}
if (GoogleMapper.pointable) {
ui.zoom.doubleclick = false; //ダブルクリックによるズーム
//地図をクリックされた時のイベント
GEvent.addListener(map, "click", function(overlay, latlng) {
if (latlng) { //Windowを閉じる時のクリックは無視
map.openInfoWindowHtml(
latlng, GoogleMapper.custom.getClickInfoHtml(latlng)
);
}
});
}
map.setUI(ui);
map.enableContinuousZoom(); //滑らかなズームを有効にする
};
/**
* マーカーを追加する
* @param Object point
* @param GIcon defaultIcon
* @return GMarker
*/
GoogleMapper.addMarker = function(point, defaultIcon) {
var option = { title: point.title, icon: point.icon || defaultIcon };
var info = GoogleMapper.custom.getInfoHtml(point);
if (!info) {
option.clickable = false;
}
var marker = new GMarker(new GLatLng(point.lat, point.lng), option);
GoogleMapper.map.addOverlay(marker);
if (info) {
//クリックされたら吹き出しを表示する
GEvent.addListener(marker, "click", function(){ this.openInfoWindowHtml(info); });
if (point.openFlg) { //最初から吹き出しを表示する
marker.openInfoWindowHtml(info);
}
}
if (window["MarkerTracker"]) {
//現在の表示範囲の外にあるマーカーが分かるようにする
// @see http://gmaps-utility-library.googlecode.com/svn/trunk/markertracker/
(new MarkerTracker(marker, GoogleMapper.map));
}
return marker;
};
/******************************************************************************
* 以下はサイトに合わせて上書きする関数
******************************************************************************/
/**
* Google Mapsが使用できない環境の場合に呼ばれる
*/
GoogleMapper.custom.onUnavailable = function() {
alert("このブラウザでは地図を表示できません");
};
/**
* マーカーの画像を返す
*/
GoogleMapper.custom.getIcon = function() {
if (!window["MapIconMaker"]) {
return G_DEFAULT_ICON;
}
// @see http://gmaps-utility-library.googlecode.com/svn/trunk/mapiconmaker/
return MapIconMaker.createMarkerIcon({
//Sample
primaryColor: "#00FFFF", strokeColor: "#666666"
});
};
/**
* マーカーに表示する吹き出しの中身のHTMLを作成して返す
* @param Object point マーカー情報
*/
GoogleMapper.custom.getInfoHtml = function(point) {
//Sample
return point.title;
};
/**
* 地図をクリックされた時に表示する吹き出しの中身のHTMLを作成して返す
* (GoogleMapper.pointable = true の場合のみ有効)
* @param GLatlng latlng 緯度経度
*/
GoogleMapper.custom.getClickInfoHtml = function(latlng) {
//Sample
var info = "緯度: " + latlng.lat() + "
経度: " + latlng.lng();
info += "
ズーム: " + GoogleMapper.map.getZoom();
return info;
};
/**
* 初期表示時のコールバック関数
*/
GoogleMapper.custom.initCallback = function() { /* pass */ };