2008年7月14日月曜日

展覧会案内にGoogleMapを追加

展覧会案内ページに、会場の地図を表示するようにしたので忘れる前にメモ


まず入力ページのヘッダにgooglemapを使用するために以下を追加
keyは予め取得しておく
  1. <script type="text/javascript" src="http://www.google.com/jsapi?key=key"></script>  
  2. <script type="text/javascript">google.load("maps", "2.x");</script>  


続けて javascript で動作を書く
  1. <script type="text/javascript"><!--  
  2.  var map = null;  
  3.  var geocoder = null;  
  4.  var marker = null;  
  5.  function initialize() {  
  6.    map = new GMap2(document.getElementById("map_canvas"));  
  7.    if (GBrowserIsCompatible()) {  
  8.      var lat = document.getElementById("lat");  
  9.      var lng = document.getElementById("lng");  
  10.      var latlng = null;  
  11.      if (lat.value != "" && lng.value) {  
  12.        latlng = new GLatLng(lat.value,lng.value);  
  13.      } else {  
  14.        latlng = new GLatLng(35.671940094926995,139.76398944854736);  
  15.      }  
  16.      map.setCenter(latlng, 17);  
  17.      map.addControl(new GLargeMapControl());  
  18.      geocoder = new GClientGeocoder();  
  19.      marker = new GMarker(latlng,{draggable: true});  
  20.      map.addOverlay(marker);  
  21.      GEvent.addListener(marker, "dragend"function(){  
  22.        markerToform(marker.getLatLng());  
  23.      });  
  24.      GEvent.addListener(map, "dblclick"function(overlay,point) {  
  25.        marker.setPoint(point);  
  26.        markerToform(point);  
  27.      });  
  28.    }  
  29.  }  
  30.   
  31.   
  32. function markerToform(latlng)  
  33. {  
  34. var lat = document.getElementById("lat");  
  35. var lng = document.getElementById("lng");  
  36. lat.value = latlng.lat();  
  37. lng.value = latlng.lng();  
  38. document.getElementById("mapenable").checked=true;  
  39. }  
  40.   
  41.   
  42. function showAddress() {  
  43. address = document.getElementById("address").value;  
  44. geocoder.getLatLng(  
  45.  address ,  
  46.  function(point) {  
  47.    if (!point) {  
  48.      alert(address + " \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002");  
  49.    } else {  
  50.      map.setCenter(point, 13);  
  51.      marker.setPoint(point);  
  52.      markerToform(point);  
  53.    }  
  54.  }  
  55. );  
  56. }  
  57.   
  58. // --></script>  


入力ページを開いたときにinitialize()を実行する
initialize()は
html内の map_canvas エレメントにgooglemapを挿入する。
初期位置をformのid=lat,id=lngより取得する(lat,lngはpythonで予め埋め込む)
markerオブジェクトとGeocoderオブジェクトを作っておく
markerをドラッグして移動したときと、地図をダブルクリックした時にformのlat,lngを書き換えるようにイベント登録しておく

function markerToform(latlng) で、マーカーの位置をformのlat,lngに反映させる処理をする。地図を使用するcheckboxにもチェックを入れておく

function showAddress() は、会場住所から場所を検索できるようにgeocoderを使用した処理をする。(サンプルをコピペ)

htmlソース
  1. <input type="button" name="showaddr" id="showaddr" onclick="showAddress()" value="地図"/>  
  2. <label class="description" for="mapenable">地図</label>  
  3. <input type="checkbox" id="mapenable" name="mapenable" value="enable" {% if entity.point %}checked{% endif %}/>地図を使用する  
  4. <input type="hidden" id="lat" name="lat" value="{{ entity.point.lat|default:"" }}" />  
  5. <input type="hidden" id="lng" name="lng" value="{{ entity.point.lon|default:"" }}" />  
  6. <div id="map_canvas" style="width: 500px; height: 300px">  
  7. </div>  


案内状表示ページのhtmlにも同様にgooglemapのjavascriptを追加しておく

  1. <script type="text/javascript" src="http://www.google.com/jsapi?key=key"></script>  
  2. <script type="text/javascript">google.load("prototype", "1.6.0.2");</script>  
  3. <script type="text/javascript">google.load("maps", "2.x");</script>  
  4. <script type="text/javascript"><!--  
  5.   var WEEK ='week2';  
  6.   function viewmap(obj,lat,lng)  
  7.   {  
  8.     var par = obj.parentNode.parentNode;  
  9.     var elm = par.childNodes;  
  10.     var cld = elm[1];  
  11.     cld.style.display="block";  
  12.     elm[0].childNodes[0].style.display="block";  
  13.     obj.style.display = "none";  
  14.     var map = new google.maps.Map2(cld);  
  15.     map.addControl(new GLargeMapControl());  
  16.     map.setCenter(new google.maps.LatLng(lat, lng), 17);  
  17.     map.addOverlay(new GMarker(new GLatLng(lat, lng)));  
  18.   }  
  19.   function closemap(obj)  
  20.   {  
  21.     var par = obj.parentNode.parentNode;  
  22.     var elm = par.childNodes;  
  23.     elm[0].childNodes[1].style.display="block";  
  24.     obj.style.display = "none";  
  25.     var cld = elm[1];  
  26.     cld.style.display="none";  
  27.     cld.innerHTML="";  
  28.   }  
  29. // --></script>  


案内状では、地図ボタンを押したときに地図を表示、閉じるボタンを押したときに地図表示を閉じるようにしたい

function viewmap(obj,lat,lng) と function closemap(obj)

案内状表示ページを生成するpythonのコード(地図の部分抜粋)

  1. if entity.point:  
  2.   cards+=u""" 
  3.     <div class="maps"><div class="maphed"><div class="btnclose" onclick="closemap(this)"></div><div class="btnopen" onclick="viewmap(this,%f,%f)"></div>地図</div><div id="map" name="map"></div> 
  4.     </div>""" % (entity.point.lat,entity.point.lon)  


btnopenをクリックしたときにviewmap(this,point.lat,point.lon)が呼ばれる
viewmap スクリプトで
this オブジェクト以下の id=mapにgooglemapを表示する様にしたかったけど、id=mapのエレメントへの参照の仕方がわからなかったので
  1. function viewmap(obj,lat,lng)  
  2.   {  
  3.     var par = obj.parentNode.parentNode;  
  4.     var elm = par.childNodes;  
  5.     var cld = elm[1];  

みたいな、わけわからん参照になってしまった...

入力ページからPOSTされたデータを処理するpythonプログラム(抜粋)

  1. mapen = self.request.get('mapenable')  
  2. if mapen == "enable":  
  3.   try:  
  4.     lat = self.request.get('lat')  
  5.     lng = self.request.get('lng')  
  6.     postcard.point = db.GeoPt(lat,lng)  
  7.   except:  
  8.     postcard.point = None  
  9. else:  
  10.   postcard.point = None  


ソースの表示にBlogger Syntax Highlighterを使用してみた。
http://www.kuribo.info/2008/06/blogger-syntax-highlighter.html

0 件のコメント: