Sealyu

          --- 博客已遷移至: http://www.sealyu.com/blog

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            618 隨筆 :: 87 文章 :: 225 評(píng)論 :: 0 Trackbacks

          We’re building a Django application at work, and I had to implement a way for a user to select a location on a map, in order to be able to save the exact coordinates and the zoom level the user chose.
          I looked around to see if something similar had been developed, but I did not find anything so simple and useful as what I later developed, so for the sake of open source-ness I’m sharing it here with you.
          It is implemented as a standard Django form widget so just do as any other Django widget, for example:

          class PersonForm(forms.Form):
          name = forms.CharField()
          website = forms.URLField()
          location = forms.CharField(widget=GMapInput(attrs={'width':'600', 'height':'400'}))

          Here’s the code for the GMapInput class (sorry for the docs in Spanish, but I’m in Mexico):

          from django.forms.widgets import Input
          from django.utils.safestring import mark_safe
           
          class GMapInput(Input):
          """
          Widget para seleccionar un punto en un mapa de Google
          """

           
          def render(self, name, value, attrs=None):
          """
          Atributos extras:
          - width: ancho del mapa en pixeles
          - height: alto del mapa en pixeles
          - center: latitud,longitud del punto central del mapa
          - zoom: zoom inicial del mapa, 1 - 17
          """

           
          final_attrs = self.build_attrs(attrs)
          width = final_attrs['width'] if 'width' in final_attrs else '500'
          height = final_attrs['height'] if 'height' in final_attrs else '300'
          center = final_attrs['center'] if 'center' in final_attrs else '21.983801,-100.964355' # Centro de México
          zoom = final_attrs['zoom'] if 'zoom' in final_attrs else '4' # Zoom amplio, se ve todo un país
           
          widget = u'''<div style="margin-left:7em; padding-left:30px;">
          <input type="hidden" value="%(value)s" name="%(name)s" id="%(id)s" />
          <div id="%(id)s_map" style="width: %(width)spx; height: %(height)spx"></div></div>
          <script type="text/javascript">
          var %(id)s_map = new GMap2(document.getElementById("%(id)s_map"));
          %(id)s_map.addControl(new GLargeMapControl3D());
           
          var %(id)s_marker;
          function %(id)s_updateField() {
          document.getElementById("%(id)s").value = %(id)s_marker.getLatLng().toUrlValue() + "|" + %(id)s_map.getZoom();
          %(id)s_map.panTo(%(id)s_marker.getLatLng(), true);
          }
          '
          '' % { 'value': value, 'name': name, 'id': final_attrs['id'], 'width': width, 'height': height }
           
          if value is None or value == '':
          widget = widget + u'''
          %(id)s_map.setCenter(new GLatLng(%(center)s), %(zoom)s);
          var %(id)s_clickListener = GEvent.addListener(%(id)s_map, "click", function(overlay, latlng) {
          if(latlng) {
          %(id)s_marker = new GMarker(latlng, {draggable: true});
          %(id)s_map.addOverlay(%(id)s_marker);
          %(id)s_updateField();
           
          GEvent.addListener(%(id)s_marker, "dragend", %(id)s_updateField);
          GEvent.addListener(%(id)s_map, "zoomend", %(id)s_updateField);
          GEvent.addListener(%(id)s_map, "dblclick", function (overlay, latlng) { %(id)s_marker.setLatLng(latlng); %(id)s_updateField(); });
          GEvent.removeListener(%(id)s_clickListener);
          }
          });
          </script>'
          '' % { 'id': final_attrs['id'], 'center': center, 'zoom': zoom }
          else:
          values = value.partition('|')
           
          widget = widget + u'''
          %(id)s_map.setCenter(new GLatLng(%(coords)s), %(zoom)s);
          %(id)s_marker = new GMarker(new GLatLng(%(coords)s), {draggable: true});
          %(id)s_map.addOverlay(%(id)s_marker);
           
          GEvent.addListener(%(id)s_marker, "dragend", %(id)s_updateField);
          GEvent.addListener(%(id)s_map, "zoomend", %(id)s_updateField);
          GEvent.addListener(%(id)s_map, "dblclick", function (overlay, latlng) { %(id)s_marker.setLatLng(latlng); %(id)s_updateField(); });
          '
          '' % { 'id': final_attrs['id'], 'coords': values[0], 'zoom': values[2] }
           
          return mark_safe(widget)

          Don’t forget to add the <script> tag linking to the Google Maps API.

          It is yet far from perfect, but I still hope it helps someone out there.

          posted on 2010-05-11 03:42 seal 閱讀(475) 評(píng)論(0)  編輯  收藏 所屬分類: Python
          主站蜘蛛池模板: 陵水| 疏勒县| 海淀区| 蒲江县| 连州市| 丹阳市| 桂阳县| 新营市| 虹口区| 荣成市| 新津县| 得荣县| 酒泉市| 富平县| 新宾| 东乌珠穆沁旗| 湟源县| 尖扎县| 天全县| 三门峡市| 阿巴嘎旗| 宣武区| 南部县| 新乡县| 长泰县| 阿图什市| 福清市| 青河县| 宣汉县| 高碑店市| 饶平县| 汪清县| 湘阴县| 营口市| 南召县| 同德县| 四平市| 辽中县| 闽侯县| 平阴县| 西林县|