Google Mapsで複数のマーカーを立てた際、近いマーカーをまとめて表示できるMarker Clustererを使ってみます。
使い方
Marker ClustererはGoogle MapsのUtility libraryのうちの一つです。
上記ページからダウンロードしておいてください。
まずはMarker Clustererを導入する前の状態を試してみます。
以前投稿した以下記事の内容を流用します。
Google Maps APIでjsonのデータからマーカーを設置する
使用するjsonファイルはこちらの内容で、マップを生成するJavaScriptは以下のようになっています。
var ready = { api: false, ajax: false };
var map;
var mapData;
var mapOptions = {
center: { // 地図の緯度経度
lat: 35.700000,
lng: 139.772000
},
zoom: 17, // 地図の拡大率
scrollwheel: false, // ホイール操作で拡大縮小させるかどうか
mapTypeControl: false, // マップ切り替えのコントロールを表示するかどうか
streetViewControl: false // ストリートビューのコントロールを表示するかどうか
}
$(function() {
$.ajax({
url: 'data.json',
cache: false
})
.then(
function (data) {
mapData = data['data'];
ready['ajax'] = true;
generate_map();
},
function () {
console.log('取得に失敗しました。');
}
);
});
/**
* Google Maps APIの準備完了後の処理
*/
function api_ready() {
ready['api'] = true;
generate_map();
}
/**
* 地図を生成する
*/
function generate_map() {
if(ready['api'] && ready['ajax']) {
map = new google.maps.Map(document.getElementById('map'), mapOptions);
add_marker();
}
}
/**
* 地図にマーカーを追加する
*/
function add_marker() {
for (var i = 0; i < mapData.length; i++) {
var item = mapData[i];
// マーカーの設置
var marker = new google.maps.Marker({
position: item['latlng'],
map: map
});
// 吹き出しの生成
var ins = '<div class="map-window">';
ins += '<p class="map-window_name">' + item['name'] + '</p>';
ins += '</div>';
var infoWindow = new google.maps.InfoWindow({
content: ins
});
// マーカーのイベント設定
add_event_to_marker(marker, infoWindow, i);
}
}
/**
* マーカーにイベントを追加する
* @param {object} marker (required) マーカーの情報
* @param {object} infoWindow (required) 吹き出しの情報
* @param {number} index (required) 地図情報のインデックス番号
*/
function add_event_to_marker(marker, infoWindow, index) {
var item = mapData[index];
item['marker'] = marker;
item['infoWindow'] = infoWindow;
// マーカークリック時に吹き出しを表示する
item['marker'].addListener('click', function(e) {
infoWindows_hide();
item['infoWindow'].open(map, item['marker']);
});
}
/**
* 吹き出しを非表示にする
*/
function infoWindows_hide() {
for (var i = 0; i < mapData.length; i++) {
mapData[i]['infoWindow'].close();
}
}
次にMarker Clustererを試してみます。
先ほどダウンロードしたファイルのmarkerclustererディレクトリ内を使用します。
ファイルの読み込みにsrcディレクトリ内にあるmarkerclusterer.jsを追加します。
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script> <script src="./markerclusterer.js"></script> <script src="https://maps.googleapis.com/maps/api/js?key=【APIキー】&callback=api_ready"></script>
地図を読み込むJavaScriptの記述を変更します。
var ready = { api: false, ajax: false };
var map;
var mc;
var mapData;
var mapOptions = {
center: { // 地図の緯度経度
lat: 35.700000,
lng: 139.772000
},
zoom: 17, // 地図の拡大率
scrollwheel: false, // ホイール操作で拡大縮小させるかどうか
mapTypeControl: false, // マップ切り替えのコントロールを表示するかどうか
streetViewControl: false // ストリートビューのコントロールを表示するかどうか
}
$(function() {
$.ajax({
url: 'data.json',
cache: false
})
.then(
function (data) {
mapData = data['data'];
ready['ajax'] = true;
generate_map();
},
function () {
console.log('取得に失敗しました。');
}
);
});
/**
* Google Maps APIの準備完了後の処理
*/
function api_ready() {
ready['api'] = true;
generate_map();
}
/**
* 地図を生成する
*/
function generate_map() {
if(ready['api'] && ready['ajax']) {
map = new google.maps.Map(document.getElementById('map'), mapOptions);
add_marker();
}
}
/**
* 地図にマーカーを追加する
*/
function add_marker() {
var markers = [];
for (var i = 0; i < mapData.length; i++) {
var item = mapData[i];
// マーカーの設置
var marker = new google.maps.Marker({
position: item['latlng']
});
// 吹き出しの生成
var ins = '<div class="map-window">';
ins += '<p class="map-window_name">' + item['name'] + '</p>';
ins += '</div>';
var infoWindow = new google.maps.InfoWindow({
content: ins
});
// マーカーのイベント設定
add_event_to_marker(marker, infoWindow, i);
// MarkerClusterer用にマーカーの情報を配列にまとめる
markers.push(marker);
}
mg = new MarkerClusterer(map, markers);
}
/**
* マーカーにイベントを追加する
* @param {object} marker (required) マーカーの情報
* @param {object} infoWindow (required) 吹き出しの情報
* @param {number} index (required) 地図情報のインデックス番号
*/
function add_event_to_marker(marker, infoWindow, index) {
var item = mapData[index];
item['marker'] = marker;
item['infoWindow'] = infoWindow;
// マーカークリック時に吹き出しを表示する
item['marker'].addListener('click', function(e) {
infoWindows_hide();
item['infoWindow'].open(map, item['marker']);
});
}
/**
* 吹き出しを非表示にする
*/
function infoWindows_hide() {
for (var i = 0; i < mapData.length; i++) {
mapData[i]['infoWindow'].close();
}
}
先ほどからの変更箇所はハイライトしていますが、61行目部分でmap指定していた記述を削除、76行目で各マーカーを配列にまとめて、78行目でMarker Clustererを設定しています。
Marker Clusterer使用後のデモページ
【参考サイト】
- GitHub – googlemaps/v3-utility-library: Utility libraries for Google Maps JavaScript API v3
- MarkerCluster for v3 Documentation: Examples
- MarkerClusterer for Google Maps v3 version 1.0 Reference
コメントが承認されるまで時間がかかります。