JSONまたはXMLなどの外部データを読み込んで、複数のマーカーをGoogle Maps API V3 に追加してみました。
Reference
Google公式のリファレンスを参考にしました。
- 参考:Google Maps Javascript API V3 Reference
- Google Maps JavaScript API V3 は IE6 サポート対象外 なのでお気をつけ下さい。
JSONデータからMarkerを生成
JSONファイルを読み込んで、複数のMarkerをマップ上に追加してみました。
1. JSONファイルを読み込む
Google Maps JavaScript API V3 から、XMLファイルの読み込み関数 と XMLパーサーのライブラリがなくなりました。
バージョン2でいうと、GDownloadUrl
関数 や GXml.parse
などです。
なので、jQueryでJSONファイルを読み込んでいきます。
{"Marker":[ {"lat":"35.507456","lng":"139.61758499999996","content":"<p>新横浜駅</p>"}, {"lat":"35.5122276","lng":"139.62016470000003","content":"<p>横浜アリーナ</p>"}, {"lat":"35.5109943","lng":"139.60557760000006","content":"<p>日産スタジアム</p>"}, {"lat":"35.510076067585594","lng":"139.61664086242672","content":"<p>新横浜国際ホテル</p>"} ]}
$.ajax({ url:"map.json", cache:false, dataType:"json", success:function(json){ // 読み込み完了 var data=jsonRequest(json); } });
読み込んだJSONファイルを配列にまとめます。
マーカーで使うデータを Markerオブジェクトから集めて配列を作成します。
function jsonRequest(json){ var data=[]; if(json.Marker){ var n=json.Marker.length; for(var i=0;i<n;i++){ data.push(json.Marker[i]); } } return data; }
2. 複数のMarkerクラスを生成
Mapクラスを生成して、配列からネストしながら Markerクラスを追加していきます。
function initialize(data/*Array*/){ var op={ zoom:15, center:new google.maps.LatLng(35.507456,139.617585), mapTypeId:google.maps.MapTypeId.ROADMAP }; var map=new google.maps.Map(document.getElementById("map_canvas"),op); var i=data.length; while(i-- >0){ var dat=data[i]; var obj={ position:new google.maps.LatLng(dat.lat,dat.lng), map:map }; var marker=new google.maps.Marker(obj); } }
まとめ
1〜2をまとめると以下のようになります。
<html lang="ja"> <head> <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false&language=ja"></script> <script type="text/javascript" src="jquery-1.5.2.js"></script> <script type="text/javascript"> // <![CDATA[ $(function(){ // JSONファイル読み込み開始 $.ajax({ url:"map.json", cache:false, dataType:"json", success:function(json){ var data=jsonRequest(json); initialize(data); } }); }); // JSONファイル読み込み完了 function jsonRequest(json){ var data=[]; if(json.Marker){ var n=json.Marker.length; for(var i=0;i<n;i++){ data.push(json.Marker[i]); } } return data; } // マップを生成して、複数のマーカーを追加 function initialize(data/*Array*/){ var op={ zoom:15, center:new google.maps.LatLng(35.507456,139.617585), mapTypeId:google.maps.MapTypeId.ROADMAP }; var map=new google.maps.Map(document.getElementById("map_canvas"),op); var i=data.length; while(i-- >0){ var dat=data[i]; var obj={ position:new google.maps.LatLng(dat.lat,dat.lng), map:map }; var marker=new google.maps.Marker(obj); } } // ]]> </script> </head> <body> <div id="map_canvas" style="width:550px;height:400px"></div> </body>
サンプル
- Example:gmap-sample-4.html
XMLデータからMarkerを生成
XMLファイルから、複数のMarker情報を読み込んでみます。
XMLが読み込まれたら、XMLパーサーを経由して配列にしています。
JSONデータからMarkerを生成 で使用した、jsonRequest
メソッドを xmlRequest
メソッドに置き換えました。あとは、ほぼ同じです。
<?xml version="1.0" encoding="utf-8"?> <root> <MarkerData> <marker lat="35.507456" lng="139.61758499999996"> <icon>atlas</icon> <content><![CDATA[ <p>新横浜駅</p> ]]></content> </marker> <marker lat="35.5122276" lng="139.62016470000003"> <icon>atlas</icon> <content><![CDATA[ <p>横浜アリーナ</p> ]]></content> </marker> <marker lat="35.5109943" lng="139.60557760000006"> <icon>atlas</icon> <content><![CDATA[ <p>日産スタジアム</p> ]]></content> </marker> <marker lat="35.510076067585594" lng="139.61664086242672"> <icon>atlas</icon> <content><![CDATA[ <p>新横浜国際ホテル</p> ]]></content> </marker> </MarkerData> </root>
<html lang="ja"> <head> <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false&language=ja"></script> <script type="text/javascript" src="jquery-1.5.2.js"></script> <script type="text/javascript"> // <![CDATA[ $(function(){ // XMLファイル読み込み開始 $.ajax({ url:"map.xml", cache:false, dataType:"xml", success:function(xml){ var data=xmlRequest(xml); initialize(data); } }); }); // XMLファイル読み込み完了 function xmlRequest(json){ var data=[]; $(xml).find("MarkerData > marker").each(function(){ var dat={}; dat.lat=this.getAttribute("lat"); dat.lng=this.getAttribute("lng"); $(this).children().each(function(){ if(this.childNodes.length>0)dat[this.tagName]=this.childNodes[0].nodeValue; }); data.push(dat); }); return data; } // マップを生成して、複数のマーカーを追加 function initialize(data/*Array*/){ var op={ zoom:15, center:new google.maps.LatLng(35.507456,139.617585), mapTypeId:google.maps.MapTypeId.ROADMAP }; var map=new google.maps.Map(document.getElementById("map_canvas"),op); var i=data.length; while(i-- >0){ var dat=data[i]; var obj={ position:new google.maps.LatLng(dat.lat,dat.lng), map:map }; var marker=new google.maps.Marker(obj); } } // ]]> </script> </head> <body> <div id="map_canvas" style="width:550px;height:400px"></div> </body>
サンプル
- Example:gmap-simple-4-2.html
Geocoderで緯度経度を検索
住所から緯度経度を取得するために、以下のツールを作って調べました。
Geocoderで住所検索しています。