[OpenLayers-Commits] r3174 - in sandbox/ominiverdi/openlayers/lib: . OpenLayers/Control

commits at openlayers.org commits at openlayers.org
Thu May 24 09:35:49 EDT 2007


Author: ominiverdi
Date: 2007-05-24 09:35:48 -0400 (Thu, 24 May 2007)
New Revision: 3174

Added:
   sandbox/ominiverdi/openlayers/lib/OpenLayers/Control/WMSArgParser.js
   sandbox/ominiverdi/openlayers/lib/OpenLayers/Control/WMSPermalink.js
Modified:
   sandbox/ominiverdi/openlayers/lib/OpenLayers.js
   sandbox/ominiverdi/openlayers/lib/OpenLayers/Control/WMSManager.js
Log:
WMSManager (ticket #687):
added permalink function.
created indipendent ArgParser and Permalink Controls

Added: sandbox/ominiverdi/openlayers/lib/OpenLayers/Control/WMSArgParser.js
===================================================================
--- sandbox/ominiverdi/openlayers/lib/OpenLayers/Control/WMSArgParser.js	                        (rev 0)
+++ sandbox/ominiverdi/openlayers/lib/OpenLayers/Control/WMSArgParser.js	2007-05-24 13:35:48 UTC (rev 3174)
@@ -0,0 +1,197 @@
+/* Copyright (c) 2006 MetaCarta, Inc., published under a modified BSD license.
+ * See http://svn.openlayers.org/trunk/openlayers/repository-license.txt 
+ * for the full text of the license. */
+
+
+/**
+ * @class
+ * 
+ * @requires OpenLayers/Control.js
+ */
+OpenLayers.Control.ArgParser = OpenLayers.Class.create();
+OpenLayers.Control.ArgParser.prototype = 
+  OpenLayers.Class.inherit( OpenLayers.Control, {
+
+    /** @type OpenLayers.LonLat */
+    center: null,
+    
+    /** @type int */
+    zoom: null,
+
+    /** @type Array */
+    layers: null,
+
+    /**
+     * @constructor
+     * 
+     * @param {DOMElement} element
+     * @param {String} base
+     */
+    initialize: function(element, base) {
+        OpenLayers.Control.prototype.initialize.apply(this, arguments);
+    },
+
+    /** Set the map property for the control. 
+     * 
+     * @param {OpenLayers.Map} map
+     */
+    setMap: function(map) {
+		
+        OpenLayers.Control.prototype.setMap.apply(this, arguments);
+
+        //make sure we dont already have an arg parser attached
+        for(var i=0; i< this.map.controls.length; i++) {
+            var control = this.map.controls[i];
+            if ( (control != this) &&
+                 (control.CLASS_NAME == "OpenLayers.Control.ArgParser") ) {
+                break;
+            }
+        }
+        if (i == this.map.controls.length) {
+
+            var args = OpenLayers.Util.getArgs();
+			
+            if (args.lat && args.lon) {
+                this.center = new OpenLayers.LonLat(parseFloat(args.lon),
+                                                   parseFloat(args.lat));
+				
+                if (args.zoom) {
+                    this.zoom = parseInt(args.zoom);
+                }
+    
+                // when we add a new baselayer to see when we can set the center
+                this.map.events.register('changebaselayer', this, 
+                                         this.setCenter);
+                this.setCenter();
+            }
+    
+            if (args.layers) {
+				
+                this.layers = args.layers;
+    
+                // when we add a new layer, set its visibility 
+                this.map.events.register('addlayer', this, 
+                                         this.configureLayers);
+                this.configureLayers();
+            }
+        }
+    },
+   
+    /** As soon as a baseLayer has been loaded, we center and zoom
+     *   ...and remove the handler.
+     */
+    setCenter: function() {
+        this.map.maxExtent = new OpenLayers.Bounds(-180, -90, 180, 90);
+        if (this.map.baseLayer) {
+            //dont need to listen for this one anymore
+            this.map.events.unregister('changebaselayer', this, 
+                                       this.setCenter);
+                                       
+            this.map.setCenter(this.center, this.zoom);
+        }
+    },
+
+    /** As soon as all the layers are loaded, cycle through them and 
+     *   hide or show them. 
+     */
+    configureLayers: function() {
+		
+		var aLayers = this.layers.split('||');
+        if (aLayers.length) { 
+            this.map.events.unregister('addlayer', this, this.configureLayers);
+			
+			//WEIRD TRICK TO AVOID A JS ERROR !!!!!!!
+			this.map.popups = []; 
+			
+            for(var i=0; i < aLayers.length; i++) {
+               // alert('1');
+                var aLayer = aLayers[i].split('|');
+                if(aLayer.length>1){
+					var c = aLayer[0];
+					//alert(aLayer[1]);
+					//WMSinfo
+					var layerName = aLayer[1];
+					var url = aLayer[2];
+					var params = aLayer[3];
+					
+					//WMS request vars
+					var format = '';//FORMAT
+					var exceptions = '';//EXCEPTIONS
+					var service = 'WMS';//SERVICE
+					var version = '';//VERSION
+					var request = "getMap";//REQUEST
+					var styles = '';//STYLES
+					
+					//aWMSLayers params
+					var aParams = params.split('!!');
+					for(j=0;j<aParams.length;j++){
+						var param = aParams[j].split('!');
+						switch(param[0]){
+							case 'FORMAT':
+							format = param[1];
+							break
+							case 'EXCEPTIONS':	
+							exceptions = param[1];
+							break
+							case 'VERSION':	
+							version = param[1];
+							break
+							case 'STYLES':	
+							styles = param[1];
+							break
+						}
+						
+					}
+					var Name= layerName;
+					var Title = layerName;
+					var Abstract = '';
+					var BoundingBox = '';
+					var LegendURL = '';
+					
+					
+					
+					//EXEPTION MUST BE INHERITED BY PERMALINK not forced like this 	
+					//var exception = 'application/vnd.ogc.se_inimage';
+					//alert(c);
+	                if (c == "B") {
+						//alert('2');
+						var layer = new OpenLayers.Layer.WMS( layerName,
+						 url, {layers: layerName, EXCEPTIONS: exceptions} );
+						
+	
+						if(!layer.aWMSLayers) layer.aWMSLayers = [];
+						layer.aWMSLayers.push(Name,Title,Abstract,BoundingBox,LegendURL);
+						layer.WMSinfo = [layerName,url,params];
+						this.map.addLayer(layer);
+						//alert('22');
+	                    this.map.setBaseLayer(layer);
+						//alert('23');
+						
+	                } else if ( (c == "T") || (c == "F") ) {
+						
+						var layer = new OpenLayers.Layer.WMS( layerName, 
+	                    url, {layers: layerName,format: format,TRANSPARENT: "TRUE", EXCEPTIONS: exceptions} );
+						
+						if(!layer.aWMSLayers) layer.aWMSLayers = [];
+						layer.aWMSLayers.push(Name,Title,Abstract,BoundingBox,LegendURL);
+						layer.WMSinfo = [layerName,url,params];
+						layer.isBaseLayer = false; 
+						layer.setVisibility(c == "T");
+						this.map.addLayer(layer);
+	                    
+						
+	                }
+					
+				}	
+	        }
+				
+			//var bounds = new OpenLayers.Bounds(-180,-87,90,180); 
+					
+			//this.map.zoomToExtent(bounds);
+			
+        }
+    },     
+    
+    /** @final @type String */
+    CLASS_NAME: "OpenLayers.Control.ArgParser"
+});

Modified: sandbox/ominiverdi/openlayers/lib/OpenLayers/Control/WMSManager.js
===================================================================
--- sandbox/ominiverdi/openlayers/lib/OpenLayers/Control/WMSManager.js	2007-05-24 07:16:22 UTC (rev 3173)
+++ sandbox/ominiverdi/openlayers/lib/OpenLayers/Control/WMSManager.js	2007-05-24 13:35:48 UTC (rev 3174)
@@ -90,6 +90,7 @@
         OpenLayers.Control.prototype.initialize.apply(this, arguments);
 		this.aWMSServer= aWMSServer;
 		this.targetObj = targetObj;
+		
     },
 
     /** 
@@ -102,6 +103,8 @@
         this.map.events.register("changelayer", this, this.redraw);
         this.map.events.register("removelayer", this, this.redraw);
         this.map.events.register("changebaselayer", this, this.redraw);
+		
+		
     },
 
     /**
@@ -169,8 +172,12 @@
 						var legendUrl = null;
 						var listedLayer = layer.aWMSLayers[y];
 						if(selectedLayer==listedLayer[0]) {
-							if(layerName)layerName = layerName + ', ' + listedLayer[1];//list of layer titles
-							else layerName =  listedLayer[1];//list of layer titles
+							//list of layer titles
+							if(layerName){
+								layerName = layerName + ', ' + listedLayer[1];
+							} else {
+								layerName =  listedLayer[1];
+							}
 							legendUrl = listedLayer[4];
 							//alert(legendUrl);
 						}
@@ -187,8 +194,8 @@
 					}
 				
 				}
+				if(!layerName) layerName = layer.name;
 				
-				
                 if (!baseLayer) {
                     containsOverlays = true;
                 }
@@ -787,7 +794,69 @@
 		//var aLayers = xml.getElementsByTagName('Layer');
 		var Capability = xml.getElementsByTagName('Capability')[0];
 		var layerCont = this.findChildByName(Capability,'Layer');
+		/*var aLayers = [];
+		for(i=0;i<layerCont.length;i++){
+			var layerObj = this.findChildrenByName(layerCont,'Layer')[0];
+			
+		}*/
+		
+		
 		var aLayers = this.findChildrenByName(layerCont,'Layer');
+		//alert(aLayers.length);
+		/*try{
+		for(i=0;i<aLayers.length;i++){
+			var aLayerObj = this.findChildrenByName(aLayers,'Layer')[i];
+			for(j=0;j<aLayerObj.length;j++){
+				var layerObj = aLayerObj[i];
+				aLayersTemp.push(layerObj);
+			}
+		}
+		aLayers.concat(aLayersTemp);
+		} catch(e){alert(e);}
+		*/
+		
+		//try to look for nested layers
+		//ex: http://www.andaluciajunta.es/IDEAndalucia/IDEAwms/wms/MTA100v?
+		var aLayersTemp = [];
+		//alert(aLayers.length);
+		for(i=0;i<aLayers.length;i++){
+			//alert('i: '+i);
+			aLayersTemp.push(aLayers[i]);
+			var n = aLayers[i];
+			var nameNode = this.findChildByName(n,'Name');
+			if(nameNode)var Name =(nameNode.textContent)? nameNode.textContent:nameNode.text;
+			else var Name = null;
+			
+			var titleNode = this.findChildByName(n,'Title');
+			if(titleNode)var Title =(titleNode.textContent)? titleNode.textContent:titleNode.text;
+			else var Title = null;
+			try{
+			
+			var x  = n.firstChild;
+			
+			
+		    do {
+		    	if(x.nodeType==1 && x.nodeName=='Layer'){
+					
+					var nameNodeN = this.findChildByName(n,'Name');
+					var titleNodeN = this.findChildByName(n,'Title');
+					//alert(nameNodeN);
+					if(!nameNodeN && titleNodeN) aLayersTemp.push(x);
+				} 
+				 
+				x=x.nextSibling;
+				
+		    }while (x!=n.lastChild)
+			} catch(e){alert(e)}
+			
+		}
+		
+		
+		//aLayers.concat(aLayersTemp);
+		aLayers = aLayersTemp;
+		//alert(aLayers.length);
+		
+		
 		var myselect = $('wmsLayerList');
 		if( myselect)myselect.parentNode.removeChild(myselect);
 		var select = document.createElement('select');
@@ -804,25 +873,38 @@
 		for(i=0;i<aLayers.length;i++){
 			try{
 			var nameNode = this.findChildByName(aLayers[i],'Name');
+			if(nameNode)var Name =(nameNode.textContent)? nameNode.textContent:nameNode.text;
+			else var Name = null;
+			
+			
 			var titleNode = this.findChildByName(aLayers[i],'Title');
-			var Name =(nameNode.textContent)? nameNode.textContent:nameNode.text;
-			var Title =(titleNode.textContent)? titleNode.textContent:titleNode.text;
+			if(titleNode)var Title =(titleNode.textContent)? titleNode.textContent:titleNode.text;
+			else var Title = null;
+			
+			
 			var abstractNode =  this.findChildByName(aLayers[i],'Abstract');
 			if(abstractNode) var Abstract =(abstractNode.textContent)? abstractNode.textContent:abstractNode.text;
 			else var Abstract = null;
 			
+			
+			
 			select[j++] = new Option(Title,Name,false,false);
 			select.options[i].Title = Title;
-			select.options[i].Name = Name;
+						
+			
+			//this should be changed with an <optgroup label="Title">
+			if(!Name && Title) {
+				select.options[i].disabled = true;
+			} else {
+				select.options[i].Name = Name;
 			select.options[i].Abstract = Abstract;
 			select.options[i].onclick = function(){
 									var outObj = $('wmsLayerListOutput');
 									var mess = '<b>Layer Name:</b><br>'+this.Name +'<br><br><b>Layer Title:</b><br>'+this.Title +'<br><br><b>Abstract:</b><br>'+this.Abstract;
 									outObj.innerHTML = mess;
-								};				
+								};	
+			}
 			
-			
-			
 			//Legend sta dentro Style
 				var LegendURL = null;
 				
@@ -853,9 +935,10 @@
 			
 			
 			//alert('61: '+Name+','+Title+','+Abstract+','+BoundingBox+','+LegendURL);
+			
+			
 			this.aWMSLayers.push([Name,Title,Abstract,BoundingBox,LegendURL]);
-			}
-			catch(e){alert(e);}
+			}catch(e){alert(e);}
 			
 		}
 		formObj.appendChild(select);
@@ -1015,7 +1098,7 @@
      */
     findChildByName: function(n,name) {
 		var x = n.firstChild;
-		while (x.nodeName!=1)
+		while (x!=n.lastChild)//while (x.nodeName!=1)
 	    {
 	    	if(x.nodeName==name) return x;
 			else x=x.nextSibling;
@@ -1132,7 +1215,16 @@
                     url, {layers: layerName,format: "image/png",TRANSPARENT: "TRUE", EXCEPTIONS: exception} );
 			layer.isBaseLayer = false; 
 			layer.aWMSLayers = aWMSLayers;
-			//layer.TRANSPARENT = true; 
+			var params = '';
+			for (var i in layer.params) {
+		        if(i){
+					//alert(params[i]);
+					params += '!!'+ i + '!'+layer.params[i];
+				}
+		    }
+			
+			layer.WMSinfo = [layerName,url,params];//needed by Permalink/ArgParser
+
 			this.WMSManager.map.addLayer(layer);
 		} else {
 			var layer = new OpenLayers.Layer.WMS( layerName, 
@@ -1140,7 +1232,19 @@
 			layer.isBaseLayer = true; //BaseLayer : Overlay
 			
 			layer.aWMSLayers = aWMSLayers;
+			var params = '';
+			for (var i in layer.params) {
+		        if(i){
+					//alert(params[i]);
+					params += '!!'+ i + '!'+layer.params[i];
+				}
+		    }
+			
+			layer.WMSinfo = [layerName,url,params];//needed by Permalink/ArgParser
 			this.WMSManager.map.addLayer(layer);
+			
+			
+			
 			this.WMSManager.map.setBaseLayer(layer, true);
     	    this.WMSManager.map.events.triggerEvent("changebaselayer");
 		}

Added: sandbox/ominiverdi/openlayers/lib/OpenLayers/Control/WMSPermalink.js
===================================================================
--- sandbox/ominiverdi/openlayers/lib/OpenLayers/Control/WMSPermalink.js	                        (rev 0)
+++ sandbox/ominiverdi/openlayers/lib/OpenLayers/Control/WMSPermalink.js	2007-05-24 13:35:48 UTC (rev 3174)
@@ -0,0 +1,129 @@
+/* Copyright (c) 2006 MetaCarta, Inc., published under a modified BSD license.
+ * See http://svn.openlayers.org/trunk/openlayers/repository-license.txt 
+ * for the full text of the license. */
+
+
+/**
+ * @class
+ * 
+ * @requires OpenLayers/Control.js
+ */
+OpenLayers.Control.WMSPermalink = OpenLayers.Class.create();
+OpenLayers.Control.WMSPermalink.prototype = 
+  OpenLayers.Class.inherit( OpenLayers.Control, {
+
+    /** @type DOMElement */
+    element: null,
+    
+    /** @type String */
+    base: '',
+
+    /**
+     * @constructor
+     * 
+     * @param {DOMElement} element
+     * @param {String} base
+     */
+    initialize: function(element, base) {
+        OpenLayers.Control.prototype.initialize.apply(this, arguments);
+        this.element = OpenLayers.Util.getElement(element);        
+        if (base) {
+            this.base = base;
+        }
+    },
+
+    /**
+     * 
+     */
+    destroy: function()  {
+        if (this.element.parentNode == this.div) {
+            this.div.removeChild(this.element);
+        }
+        this.element = null;
+
+        this.map.events.unregister('moveend', this, this.updateLink);
+
+        OpenLayers.Control.prototype.destroy.apply(this, arguments); 
+    },
+
+    /** Set the map property for the control. 
+     * 
+     * @param {OpenLayers.Map} map
+     */
+    setMap: function(map) {
+        OpenLayers.Control.prototype.setMap.apply(this, arguments);
+
+        //make sure we have an arg parser attached
+        for(var i=0; i< this.map.controls.length; i++) {
+            var control = this.map.controls[i];
+            if (control.CLASS_NAME == "OpenLayers.Control.ArgParser") {
+                break;
+            }
+        }
+        if (i == this.map.controls.length) {
+            this.map.addControl(new OpenLayers.Control.ArgParser());       
+        }
+
+    },
+
+    /**
+     * @type DOMElement
+     */    
+    draw: function() {
+        OpenLayers.Control.prototype.draw.apply(this, arguments);
+          
+        if (!this.element) {
+            this.div.className = this.displayClass;
+            this.element = document.createElement("a");
+            this.element.style.fontSize="smaller";
+            this.element.innerHTML = "Permalink";
+            this.element.href="";
+            this.div.appendChild(this.element);
+        }
+        this.map.events.register('moveend', this, this.updateLink);
+        return this.div;
+    },
+   
+    /**
+     * 
+     */
+    updateLink: function() {
+        var center = this.map.getCenter();
+        var zoom = "zoom=" + this.map.getZoom(); 
+        var lat = "lat=" + Math.round(center.lat*100000)/100000;
+        var lon = "lon=" + Math.round(center.lon*100000)/100000;
+
+        var layers = "layers=";
+        /*for(var i=0; i< this.map.layers.length; i++) {
+            var layer = this.map.layers[i];
+
+            if (layer.isBaseLayer) {
+                layers += (layer == this.map.baseLayer) ? "B" : "0";
+            } else {
+                layers += (layer.getVisibility()) ? "T" : "F";           
+            }
+        }*/
+		for(var i=0; i< this.map.layers.length; i++) {
+            var layer = this.map.layers[i];
+
+            if (layer.isBaseLayer) {
+                layers += (layer == this.map.baseLayer) ? "||B|" : "||0|";
+				layers += layer.WMSinfo[0]+'|'+encodeURIComponent(layer.WMSinfo[1])+'|'+encodeURIComponent(layer.WMSinfo[2]);
+            } else {
+                layers += (layer.getVisibility()) ? "||T|" : "||F|";  
+				layers += layer.WMSinfo[0]+'|'+encodeURIComponent(layer.WMSinfo[1])+'|'+encodeURIComponent(layer.WMSinfo[2]);         
+            }
+        }
+        var href = this.base + "?" + lat + "&" + lon + "&" + zoom + 
+                                   "&" + layers; 
+        this.element.href = href;
+		this.element.WMSinfo = this.map.layers[0].WMSinfo;
+		/*this.element.onclick = function( ){
+			alert (this.WMSinfo);
+		};*/
+		
+    }, 
+
+    /** @final @type String */
+    CLASS_NAME: "OpenLayers.Control.WMSPermalink"
+});

Modified: sandbox/ominiverdi/openlayers/lib/OpenLayers.js
===================================================================
--- sandbox/ominiverdi/openlayers/lib/OpenLayers.js	2007-05-24 07:16:22 UTC (rev 3173)
+++ sandbox/ominiverdi/openlayers/lib/OpenLayers.js	2007-05-24 13:35:48 UTC (rev 3174)
@@ -121,6 +121,8 @@
         "OpenLayers/Control/Panel.js",
         "OpenLayers/Control/SelectFeature.js",
         "OpenLayers/Control/WMSManager.js",
+        "OpenLayers/Control/WMSPermalink.js",
+        "OpenLayers/Control/WMSArgParser.js",
         "OpenLayers/Geometry.js",
         "OpenLayers/Geometry/Rectangle.js",
         "OpenLayers/Geometry/Collection.js",



More information about the Commits mailing list