2015/08/04
Google Map APIでMapの表示とマーカーのコントロール
Google Map APIを使うと、簡単にWebページ上にGoogleマップを表示することができるため、
Webページの制作に関わる方はよく利用する機会があると思います。
地図の中に目的地のマーカーを設置する場合もあると思います。
今回は、マップ外に目的地のリストを表示し、
目的のリンクをクリックした時に、
マップ内のマーカーの情報を表示するという処理が必要な場合の方法についてご紹介いたします。
↓こちらがそのDEMOです
方法
手順
- HTML、CSSを準備してGoogleMapAPIを読み込み、APIの基本設定を行う
- マーカーの設定とマーカーの詳細の設定を行う
- マップ外の目的地リストをクリックしたときの設定を行う
1. HTML、CSSを準備してGoogleMapAPIを読み込む
HTML body内
1 2 3 | <div id="mapWrapper"> <div id="map-canvas"></div> </div> |
CSS
1 2 3 4 5 6 7 8 9 10 11 12 | #mapWrapper { width: 100%; padding-bottom: 75%; position: relative; } #map-canvas { width: 100%; height: 100%; position: absolute; top: 0; left: 0; } |
HTML head内
1 2 3 4 5 6 7 8 9 10 11 12 | <script src="http://maps.google.com/maps/api/js?sensor=false"></script> <script> function initialize() { var mapOptions = { center: new google.maps.LatLng(35.712213, 139.706726), //Map中心の座標 zoom: 16 //Mapのズーム }; //Mapを表示する要素のIDを指定してMapを読み込み var map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions); } google.maps.event.addDomListener(window, 'load', initialize); //Google Map APIの実行 </script> |
HTMLでマップを表示する要素を配置し、CSSで表示を調整します。
その後、HTMLのhead内にGoogle Map APIの読み込みと、
表示のための記述を行います。
地図だけを表示するだけなら、上記のような記述でGoogle Mapを表示できます。
2. マーカーの設定とマーカーの詳細の設定を行う
続いて、GoogleMap上にマーカーを設置するための設定を行います。
今回は、複数のマーカーを設置する場合の方法についてご紹介いたします。
先ほどのHTML head内に記述したscriptを以下のように書き換えてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | /* map関係のオブジェクトをグローバルで定義 */ var markers = [], marker = [], infoWindow = [], map = {}; function initialize() { var mapOptions = { center: new google.maps.LatLng(35.712213, 139.706726), //Map中心の座標 zoom: 16 //Mapのズーム }; map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions); //Mapを表示する要素のIDを指定してMapを読み込み /* マーカーの情報を設定 */ markers = [ { position: new google.maps.LatLng(35.712213, 139.706726), title: 'ロケーション1', summary: '説明が入ります説明が入ります説明が入ります', figure: 'images/figure01.jpg' }, { position: new google.maps.LatLng(35.712518, 139.708085), title: 'ロケーション2', summary: '説明が入ります説明が入ります説明が入ります', figure: 'images/figure02.jpg' }, { position: new google.maps.LatLng(35.712449, 139.705825), title: 'ロケーション3', summary: '説明が入ります説明が入ります説明が入ります', figure: 'images/figure03.jpg' }, { position: new google.maps.LatLng(35.713205, 139.705060), title: 'ロケーション4', summary: '説明が入ります説明が入ります説明が入ります', figure: 'images/figure04.jpg' }, { position: new google.maps.LatLng(35.713478, 139.707359), title: 'ロケーション5', summary: '説明が入ります説明が入ります説明が入ります', figure: 'images/figure05.jpg' } ]; /* マーカーのアイコンの設定 */ var image = { url: "images/mark.png", //画像のURL size: new google.maps.Size(32, 32), //サイズ origin: new google.maps.Point(0, 0), //アイコンの基準位置 anchor: new google.maps.Point(16, 32), //アイコンのアンカーポイント scaledSize: new google.maps.Size(32, 32) //アイコンのサイズ }; /* マーカの実装 */ for(var i = 0; i < markers.length; i++){ marker[i] = new google.maps.Marker({ position: markers[i].position, map: map, icon: image, title: markers[i].title, zIndex: markers.length - i }); /* 場所の詳細の準備 */ infoWindow[i] = new google.maps.InfoWindow({ content: '<section style="margin-top:5px;"><figure style="float: left;"><img src="' + markers[i].figure + '" width="64px"></figure><div style="margin-left: 74px;"><h2 style="margin-bottom: 5px;font-size: 1.17em;">' + markers[i].title + '</h2><p style="font-size: 0.84em;">' + markers[i].summary + '</p></div></section>' }); /* マーカーをクリックしたら場所の詳細を表示 */ google.maps.event.addListener(marker[i], 'click', function(e) { for(var i = 0; i < markers.length; i++) { if(marker[i].position.G == e.latLng.G && marker[i].position.K == e.latLng.K) { //クリックしたマーカーだったら詳細を表示 infoWindow[i].open(map, marker[i]); } else { //クリックしたマーカーでなければ詳細を閉じる infoWindow[i].close(); } } }); } } google.maps.event.addDomListener(window, 'load', initialize); //Google Map APIの実行 |
ここでのポイントは、後ほどマップの外部の要素からマップを操作するので、
マップに関連するオブジェクトをグローバルで予め定義しておくことです。
1 2 3 4 5 | /* map関係のオブジェクトをグローバルで定義 */ var markers = [], marker = [], infoWindow = [], map = {}; |
マーカーの設置は以下のコードで行っています。
今回は複数なので、配列により設定しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var image = { url: "images/mark.png", //画像のURL size: new google.maps.Size(32, 32), //サイズ origin: new google.maps.Point(0, 0), //アイコンの基準位置 anchor: new google.maps.Point(16, 32), //アイコンのアンカーポイント scaledSize: new google.maps.Size(32, 32) //アイコンのサイズ }; marker[i] = new google.maps.Marker({ position: google.maps.LatLng(35.712213, 139.706726), map: map, icon: image, title: "タイトル", zIndex: 1 }); |
マーカーの情報は以下のコードで行っています。
こちらも同様に配列により設定しています
1 2 3 | infoWindow[i] = new google.maps.InfoWindow({ content: '<section style="margin-top:5px;"><figure style="float: left;"><img src="images/figure01.jpg" width="64px"></figure><div style="margin-left: 74px;"><h2 style="margin-bottom: 5px;font-size: 1.17em;">タイトル1</h2><p style="font-size: 0.84em;">説明が入ります</p></div></section>' }); |
content: で記述した内容がマーカーの情報として表示されます。
style属性などを使うことで、自由にレイアウトできます。
追記 : 2015.08.28)
現在はマップがiframeではなく直接HTML上に描画されているので、
以下のようにclassをつければ、直接CSSでレイアウトできるようです。
1 2 3 | infoWindow[i] = new google.maps.InfoWindow({ content: '<section class="infoWindowSection"><figure><img src="images/figure01.jpg"></figure><div><h2>タイトル1</h2><p>説明が入ります</p></div></section>' }); |
最後に、マーカーをクリックしたときに対象のマーカーの情報を表示するための記述を行います。
1 2 3 4 5 6 7 8 9 10 11 12 | /* マーカーをクリックしたら場所の詳細を表示 */ google.maps.event.addListener(marker[i], 'click', function(e) { for(var i = 0; i < markers.length; i++) { if(marker[i].position.G == e.latLng.G && marker[i].position.K == e.latLng.K) { //クリックしたマーカーだったら詳細を表示 infoWindow[i].open(map, marker[i]); } else { //クリックしたマーカーでなければ詳細を閉じる infoWindow[i].close(); } } }); |
クリックしたマーカーの場所の情報を取得し、一致したマーカーの詳細を表示し、
それ以外の詳細は閉じます。
3. マップ外の目的地リストをクリックしたときの設定を行う
以下の様な目的地のリストをマップ外に用意し、
どれかをクリックしたら、対象のマーカーの詳細を表示するようにします。
1 2 3 4 5 6 7 | <ul class="location"> <li><a href="#" data-title="ロケーション1">ロケーション1</a></li> <li><a href="#" data-title="ロケーション2">ロケーション2</a></li> <li><a href="#" data-title="ロケーション3">ロケーション3</a></li> <li><a href="#" data-title="ロケーション4">ロケーション4</a></li> <li><a href="#" data-title="ロケーション5">ロケーション5</a></li> </ul> |
今回の方法では目的地のリストの<a>にdata-title属性を付け、
マーカーのtitleと一致した場合に詳細を表示するようにします。
以下のコードはjQueryを使っていますので、
jQueryの読み込みを事前に行ってください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $(function() { /* 対象となるタイトルを持ったマーカーの詳細を開く */ $(".location a").click(function() { for(var i = 0; i < markers.length; i++) { if(marker[i].title == $(this).attr("data-title")) { //マーカーとタイトルが一致したら詳細を表示 infoWindow[i].open(map, marker[i]); } else { //マーカーとタイトルが一致しなければ詳細を閉じる infoWindow[i].close(); } } return false; }); }); |
これで完了です。
参考サイト
Markers | Google Maps JavaScript API | Google Developers
Info Windows | Google Maps JavaScript API | Google Developers
Author Profile
NINOMIYA
Webデザイナー兼コーダー出身のフロントエンド開発者です。 UXデザインやチーム開発の効率化など、勉強中です。
SHARE