PageRenderTime 175ms CodeModel.GetById 131ms app.highlight 24ms RepoModel.GetById 16ms app.codeStats 0ms

/django/contrib/gis/templates/gis/admin/openlayers.js

https://code.google.com/p/mango-py/
JavaScript | 168 lines | 143 code | 0 blank | 25 comment | 37 complexity | 8d2bb35ec5985656f5deff82a1f3b958 MD5 | raw file
  1{# Author: Justin Bronn, Travis Pinney & Dane Springmeyer #}
  2OpenLayers.Projection.addTransform("EPSG:4326", "EPSG:3857", OpenLayers.Layer.SphericalMercator.projectForward);
  3{% block vars %}var {{ module }} = {};
  4{{ module }}.map = null; {{ module }}.controls = null; {{ module }}.panel = null; {{ module }}.re = new RegExp("^SRID=\d+;(.+)", "i"); {{ module }}.layers = {};
  5{{ module }}.modifiable = {{ modifiable|yesno:"true,false" }};
  6{{ module }}.wkt_f = new OpenLayers.Format.WKT();
  7{{ module }}.is_collection = {{ is_collection|yesno:"true,false" }};
  8{{ module }}.collection_type = '{{ collection_type }}';
  9{{ module }}.is_linestring = {{ is_linestring|yesno:"true,false" }};
 10{{ module }}.is_polygon = {{ is_polygon|yesno:"true,false" }};
 11{{ module }}.is_point = {{ is_point|yesno:"true,false" }};
 12{% endblock %}
 13{{ module }}.get_ewkt = function(feat){return 'SRID={{ srid }};' + {{ module }}.wkt_f.write(feat);}
 14{{ module }}.read_wkt = function(wkt){
 15  // OpenLayers cannot handle EWKT -- we make sure to strip it out.
 16  // EWKT is only exposed to OL if there's a validation error in the admin.
 17  var match = {{ module }}.re.exec(wkt);
 18  if (match){wkt = match[1];}
 19  return {{ module }}.wkt_f.read(wkt);
 20}
 21{{ module }}.write_wkt = function(feat){
 22  if ({{ module }}.is_collection){ {{ module }}.num_geom = feat.geometry.components.length;}
 23  else { {{ module }}.num_geom = 1;}
 24  document.getElementById('{{ id }}').value = {{ module }}.get_ewkt(feat);
 25}
 26{{ module }}.add_wkt = function(event){
 27  // This function will sync the contents of the `vector` layer with the
 28  // WKT in the text field.
 29  if ({{ module }}.is_collection){
 30    var feat = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.{{ geom_type }}());
 31    for (var i = 0; i < {{ module }}.layers.vector.features.length; i++){
 32      feat.geometry.addComponents([{{ module }}.layers.vector.features[i].geometry]);
 33    }
 34    {{ module }}.write_wkt(feat);
 35  } else {
 36    // Make sure to remove any previously added features.
 37    if ({{ module }}.layers.vector.features.length > 1){
 38      old_feats = [{{ module }}.layers.vector.features[0]];
 39      {{ module }}.layers.vector.removeFeatures(old_feats);
 40      {{ module }}.layers.vector.destroyFeatures(old_feats);
 41    }
 42    {{ module }}.write_wkt(event.feature);
 43  }
 44}
 45{{ module }}.modify_wkt = function(event){
 46  if ({{ module }}.is_collection){
 47    if ({{ module }}.is_point){
 48      {{ module }}.add_wkt(event);
 49      return;
 50    } else {
 51      // When modifying the selected components are added to the
 52      // vector layer so we only increment to the `num_geom` value.
 53      var feat = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.{{ geom_type }}());
 54      for (var i = 0; i < {{ module }}.num_geom; i++){
 55	feat.geometry.addComponents([{{ module }}.layers.vector.features[i].geometry]);
 56      }
 57      {{ module }}.write_wkt(feat);
 58    }
 59  } else {
 60    {{ module }}.write_wkt(event.feature);
 61  }
 62}
 63// Function to clear vector features and purge wkt from div
 64{{ module }}.deleteFeatures = function(){
 65  {{ module }}.layers.vector.removeFeatures({{ module }}.layers.vector.features);
 66  {{ module }}.layers.vector.destroyFeatures();
 67}
 68{{ module }}.clearFeatures = function (){
 69  {{ module }}.deleteFeatures();
 70  document.getElementById('{{ id }}').value = '';
 71  {{ module }}.map.setCenter(new OpenLayers.LonLat({{ default_lon }}, {{ default_lat }}), {{ default_zoom }});
 72}
 73// Add Select control
 74{{ module }}.addSelectControl = function(){
 75  var select = new OpenLayers.Control.SelectFeature({{ module }}.layers.vector, {'toggle' : true, 'clickout' : true});
 76  {{ module }}.map.addControl(select);
 77  select.activate();
 78}
 79{{ module }}.enableDrawing = function(){ {{ module }}.map.getControlsByClass('OpenLayers.Control.DrawFeature')[0].activate();}
 80{{ module }}.enableEditing = function(){ {{ module }}.map.getControlsByClass('OpenLayers.Control.ModifyFeature')[0].activate();}
 81// Create an array of controls based on geometry type
 82{{ module }}.getControls = function(lyr){
 83  {{ module }}.panel = new OpenLayers.Control.Panel({'displayClass': 'olControlEditingToolbar'});
 84  var nav = new OpenLayers.Control.Navigation();
 85  var draw_ctl;
 86  if ({{ module }}.is_linestring){
 87    draw_ctl = new OpenLayers.Control.DrawFeature(lyr, OpenLayers.Handler.Path, {'displayClass': 'olControlDrawFeaturePath'});
 88  } else if ({{ module }}.is_polygon){
 89    draw_ctl = new OpenLayers.Control.DrawFeature(lyr, OpenLayers.Handler.Polygon, {'displayClass': 'olControlDrawFeaturePolygon'});
 90  } else if ({{ module }}.is_point){
 91    draw_ctl = new OpenLayers.Control.DrawFeature(lyr, OpenLayers.Handler.Point, {'displayClass': 'olControlDrawFeaturePoint'});
 92  }
 93  if ({{ module }}.modifiable){
 94    var mod = new OpenLayers.Control.ModifyFeature(lyr, {'displayClass': 'olControlModifyFeature'});
 95    {{ module }}.controls = [nav, draw_ctl, mod];
 96  } else {
 97    if(!lyr.features.length){
 98      {{ module }}.controls = [nav, draw_ctl];
 99    } else {
100      {{ module }}.controls = [nav];
101    }
102  }
103}
104{{ module }}.init = function(){
105    {% block map_options %}// The options hash, w/ zoom, resolution, and projection settings.
106    var options = {
107{% autoescape off %}{% for item in map_options.items %}      '{{ item.0 }}' : {{ item.1 }}{% if not forloop.last %},{% endif %}
108{% endfor %}{% endautoescape %}    };{% endblock %}
109    // The admin map for this geometry field.
110    {{ module }}.map = new OpenLayers.Map('{{ id }}_map', options);
111    // Base Layer
112    {{ module }}.layers.base = {% block base_layer %}new OpenLayers.Layer.WMS( "{{ wms_name }}", "{{ wms_url }}", {layers: '{{ wms_layer }}'} );{% endblock %}
113    {{ module }}.map.addLayer({{ module }}.layers.base);
114    {% block extra_layers %}{% endblock %}
115    {% if is_linestring %}OpenLayers.Feature.Vector.style["default"]["strokeWidth"] = 3; // Default too thin for linestrings. {% endif %}
116    {{ module }}.layers.vector = new OpenLayers.Layer.Vector(" {{ field_name }}");
117    {{ module }}.map.addLayer({{ module }}.layers.vector);
118    // Read WKT from the text field.
119    var wkt = document.getElementById('{{ id }}').value;
120    if (wkt){
121      // After reading into geometry, immediately write back to
122      // WKT <textarea> as EWKT (so that SRID is included).
123      var admin_geom = {{ module }}.read_wkt(wkt);
124      {{ module }}.write_wkt(admin_geom);
125      if ({{ module }}.is_collection){
126	// If geometry collection, add each component individually so they may be
127	// edited individually.
128	for (var i = 0; i < {{ module }}.num_geom; i++){
129	  {{ module }}.layers.vector.addFeatures([new OpenLayers.Feature.Vector(admin_geom.geometry.components[i].clone())]);
130	}
131      } else {
132	{{ module }}.layers.vector.addFeatures([admin_geom]);
133      }
134      // Zooming to the bounds.
135      {{ module }}.map.zoomToExtent(admin_geom.geometry.getBounds());
136      if ({{ module }}.is_point){
137          {{ module }}.map.zoomTo({{ point_zoom }});
138      }
139    } else {
140      {{ module }}.map.setCenter(new OpenLayers.LonLat({{ default_lon }}, {{ default_lat }}), {{ default_zoom }});
141    }
142    // This allows editing of the geographic fields -- the modified WKT is
143    // written back to the content field (as EWKT, so that the ORM will know
144    // to transform back to original SRID).
145    {{ module }}.layers.vector.events.on({"featuremodified" : {{ module }}.modify_wkt});
146    {{ module }}.layers.vector.events.on({"featureadded" : {{ module }}.add_wkt});
147    {% block controls %}
148    // Map controls:
149    // Add geometry specific panel of toolbar controls
150    {{ module }}.getControls({{ module }}.layers.vector);
151    {{ module }}.panel.addControls({{ module }}.controls);
152    {{ module }}.map.addControl({{ module }}.panel);
153    {{ module }}.addSelectControl();
154    // Then add optional visual controls
155    {% if mouse_position %}{{ module }}.map.addControl(new OpenLayers.Control.MousePosition());{% endif %}
156    {% if scale_text %}{{ module }}.map.addControl(new OpenLayers.Control.Scale());{% endif %}
157    {% if layerswitcher %}{{ module }}.map.addControl(new OpenLayers.Control.LayerSwitcher());{% endif %}
158    // Then add optional behavior controls
159    {% if not scrollable %}{{ module }}.map.getControlsByClass('OpenLayers.Control.Navigation')[0].disableZoomWheel();{% endif %}
160    {% endblock %}
161    if (wkt){
162      if ({{ module }}.modifiable){
163        {{ module }}.enableEditing();
164      }
165    } else {
166      {{ module }}.enableDrawing();
167    }
168}