[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