QuickWMS-Extension/WMSlayer.js

GISWiki - Das freie Portal für Geoinformatik (GIS)
Wechseln zu: Navigation, Suche
/*
/*
* Project quickWMS: Generic JavaScript WMS Client 
* File : WMSlayer.js
* Author : Pedro Pereira Gonçalves
* email : pedro@inovagis.org
* Version : 0.3
* Description: Translates the WMS 1.1 OpenGIS specification to a javascript class
*                     Includes methods visibility methods and URL construct
*                     For more complex behavior his class needs a parent control where is 
*                     going to be displayed (e.g. mapWMS or quickWMS)
*                     Please read coderules.txt before making any change
* Tested on : Netscape 7.0, IE 5.5, IE 6.0
* Last Change : 2003-10-27
* Dependencies : WMSbrowsers.js
* Future Developments : styles, 
* License : OpenSource (check license.txt)
* History :
  2003-10-27 : When in directLoading mode the image source is first cleared using the 
                          empty_img and only then gos to the wms url (once again thanks to Bart for this suggestion)
  2003-10-24 : Added the option to select direct loading without using the transport image 
                          by default is false in all browsers except in IE 6 (because this browsers will always recall the image even if it has a object in memory)
  2003-10-10 : In url function forces the use of the BBox input parameter if exists
  2003-09-09 : Change the add layer method so that accepts relative urls  (*)
  2003-06-25 : Documentation added
    2003-04-28 : writeDOM method added to layerWMS
                          added the onerror event
    2003-04-23 : Documentation added
    2003-03-20 : File Created
* Objects : layerWMS 
* Functions : none
*/

function layerWMS(parent, serverUrl, layer, caption, version)
{
  if (parent){
    this.layerID = parent.name + parent.layers.length;
    this.parent = parent;
    this.srs = parent.srs;
    this.directLoading=parent.directLoading;
    }
  else{
    this.layerID = "";
    this.parent = parent;
    this.srs =   "EPSG:4326";
    this.directLoading=false; // if directLoading is true then it will not use a temporary image while receiving the requests
    // in IE60 this is true by default  
    if (browser.isIE60) this.directLoading=true;
    }  
  this.wmsUrl = serverUrl;
  this.wmsLayers = layer;  
  this.caption = layer;
  if (caption) this.caption = caption;
  // default format is GIF TO-DO
  this.format = "GIF";
  this.styles = "";
  this.visible = true;
  this.transparent = true;  

  // Specific Parameters for GIServer (inovagis web map server)
  this.maxValue=null;
  this.minValue=null;
  this.style=null;  
  this.additionalParam = "";
  
  // TO-DO: legend linkage to object
  this.legend=null;
    
  /* 
  Opacity Paremeters 
  this is still an undocumented function
  TO-DO: netscape support and more testing      
  */
  this.opacity_priv=1;  
  this.opacity = function(value){;
      if (value){
        this.opacity_priv=value;      
        this.DOMref.style.filter="alpha(opacity="+this.opacity_priv+")";        
      }
      return this.opacity_priv;
      };
  
  // version=1.1 is the default value
  if (version) {this.version=version}
  else {this.version="1.1"}

  // set the tags version and request according to the version number (0.9 to 1.1 are considered)
  if (this.version.substring(0,3)=="1.0" || this.version.substring(0,3)=="0.9"){this.request="WMTVER="+this.version +"&REQUEST=map"}
  else{this.request="VERSION="+this.version +"&REQUEST=getmap"}

  this.DOMref=null;
  
  // BBox is an optional parameter when a parent exists
  // if nothinsg then is going to use the parent value
  this.url = function (BBox)
   {
    if (!this.visible) {
      var pUrl =empty_IMG;      
      }
    else{
      // (*) changed 2003-09-09 : was   var pUrl ="http://"+ this.wmsUrl;      
      var pUrl = this.wmsUrl;
      if (pUrl.indexOf("?")<0) pUrl += "?"+this.request
      else {pUrl += "&"+this.request }
      pUrl += "&SRS=" +this.srs;
      pUrl += "&WIDTH=" +this.width;
        pUrl += "&HEIGHT="+this.height;
      pUrl += "&LAYERS=" + this.wmsLayers;    
      
      if (parent && !BBox){
        pUrl += "&BBOX=" + this.parent.BBox[0] + "," + this.parent.BBox[1] + "," + this.parent.BBox[2] + "," + this.parent.BBox[3]
        }
      else {
        pUrl += "&BBOX=" + BBox[0] + "," + BBox[1] + "," + BBox[2] + "," + BBox[3];
        }                
      if (this.version.substring(0,3)=="1.0" || this.version.substring(0,3)=="0.9") pUrl += "&EXCEPTIONS=INIMAGE"
      else pUrl += "&EXCEPTIONS=application/vnd.ogc.se_inimage"
      
      if (this.transparent) pUrl += "&TRANSPARENT=TRUE";
      
      pUrl += "&FORMAT=" + this.format;
            
      if (this.styles!="") pUrl += "&STYLES=" + this.styles;
      if (this.additionalParam!="") pUrl += "&" + this.additionalParam;
      
      // specific tags for GIServer compliant 
      if (this.maxValue) pUrl+= "&"+this.wmsLayers+".maxvalue="+this.maxValue;
      if (this.minValue) pUrl+= "&"+this.wmsLayers+".minvalue="+this.minValue;
      if (this.style) pUrl+= "&"+this.wmsLayers+".style="+this.style;
    }
    return pUrl  
  }
  // to-do still needs implement the style tag 
  this.writeDOM = function (name, left, top, width, height, style){    
    if (!this.width) this.width=width;    
    if (!this.height) this.height=height;    
    this.DOMref = writeIMG (name, empty_IMG, left, top, width, height, "filter:alpha(opacity="+this.opacity*100+");-moz-opacity:"+this.opacity+";");    
        
    if (this.directLoading){    
        this.DOMref.parent=this;
        this.DOMref.loading=true;
        this.DOMref.onload=function (){      
          this.loading=false;    
          //alert(this.parent.DOMref.src);
          //alert(this.src);
          //this.parent.DOMref.src=this.src;            
        }
        this.DOMref.onerror=function (){
                  // launch the error event to the parent - the layerWMS -
                  //if this event does exist .. it will try the parent 
                  if (this.parent.onError) this.parent.onError(this.parent);
                  else 
                      if (this.parent.parent) if (this.parent.parent.onError) this.parent.parent.onError(this.parent);                      
                  this.loading=false;
                  this.src=empty_IMG;
                  };
      }  
    return this.DOMref;
    /*
    this.transportIMG.parent=this;
    this.transportIMG.parent.DOMref=this.DOMref;
       */
    }
  // BBox is an optional parameter .. if nothing them is going to use the parent value
  this.refresh = function(BBox){
    if (this.directLoading){
      this.DOMref.src=empty_IMG; 
      this.DOMref.loading=true;
      this.DOMref.src =this.url(BBox);
      }
    else {
      this.transportIMG.loading=true;
      this.transportIMG.src = this.url(BBox);  
      }
    }


  // this must be recoded .. the logic is when hiding a layer the request changes to empty.gif
  this.show = function ()
      {showLayer(this.layerID);}
  this.hide = function ()      
      {hideLayer(this.layerID);}
  this.isVisible = function ()            
      {return isVisible(this.layerID)}  


  /// private properties for download control ... do not TOUCH!! :)
  if (!this.directLoading){
    this.transportIMG = new Image();
    this.transportIMG.parent=this;
    this.transportIMG.onload=function (){      
        this.loading=false;    
        //alert(this.parent.DOMref.src);
        //alert(this.src);
        this.parent.DOMref.src=this.src;            
        }
    this.transportIMG.onerror=function (){
                  // launch the error event to the parent - the layerWMS -
                  //if this event does exist .. it will try the parent 
                  if (this.parent.onError) this.parent.onError(this.parent);
                  else 
                      if (this.parent.parent)
                      {
                        if (this.parent.parent.onError) this.parent.parent.onError(this.parent);
                      }
                  this.loading=false;
                  this.src=empty_IMG;
                  }
  }

}