Files
openlayers/lib/OpenLayers/Layer/MapServer.js
crschmidt 3948913bfc Merge all changes from the naturaldocs sandbox. This brings all the work that
has been done in the NaturalDocs branch back to trunk. Thanks to everyone who
helped out in making this happen. (I could list people, but the list would
be long, and I'm already mentally on vacation.)


git-svn-id: http://svn.openlayers.org/trunk/openlayers@3545 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
2007-06-29 15:59:20 +00:00

207 lines
7.4 KiB
JavaScript

/* 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. */
// @requires OpenLayers/Layer/Grid.js
/**
* @requires OpenLayers/Layer/Grid.js
*
* Class: OpenLayers.Layer.MapServer
* Instances of OpenLayers.Layer.MapServer are used to display
* data from a MapServer CGI instance.
*
* Inherits from:
* - <OpenLayers.Layer.Grid>
*/
OpenLayers.Layer.MapServer = OpenLayers.Class.create();
OpenLayers.Layer.MapServer.prototype =
OpenLayers.Class.inherit( OpenLayers.Layer.Grid, {
/**
* Constant: DEFAULT_PARAMS
* {Object} Hashtable of default parameter key/value pairs
*/
DEFAULT_PARAMS: {
mode: "map",
map_imagetype: "png"
},
/**
* Constructor: OpenLayers.Layer.MapServer
* Create a new MapServer layer object
*
* Example:
* (code)
* layer = new OpenLayers.Layer.MapServer( "OpenLayers WMS",
* "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'},
* {gutter: 15});
* (end)
*
* Parameters:
* name - {String} A name for the layer
* url - {String} Base url for the MapServer CGI
* (e.g. http://www2.dmsolutions.ca/cgi-bin/mapserv)
* params - {Object} An object with key/value pairs representing the
* GetMap query string parameters and parameter values.
* options - {Ojbect} Hashtable of extra options to tag onto the layer
*
* Return:
* A new OpenLayers.Layer.MapServer instance
*/
initialize: function(name, url, params, options) {
var newArguments = new Array();
newArguments.push(name, url, params, options);
OpenLayers.Layer.Grid.prototype.initialize.apply(this, newArguments);
if (arguments.length > 0) {
OpenLayers.Util.applyDefaults(
this.params,
this.DEFAULT_PARAMS
);
}
// unless explicitly set in options, if the layer is transparent,
// it will be an overlay
if (options == null || options.isBaseLayer == null) {
this.isBaseLayer = ((this.params.transparent != "true") &&
(this.params.transparent != true));
}
},
/**
* Method: clone
* Create a clone of this layer
*
* Return:
* {<OpenLayers.Layer.MapServer>} An exact clone of this layer
*/
clone: function (obj) {
if (obj == null) {
obj = new OpenLayers.Layer.MapServer(this.name,
this.url,
this.params,
this.options);
}
//get all additions from superclasses
obj = OpenLayers.Layer.Grid.prototype.clone.apply(this, [obj]);
// copy/set any non-init, non-simple values here
return obj;
},
/**
* addTile creates a tile, initializes it, and
* adds it to the layer div.
*
* @param {<OpenLayers.Bounds>} bounds
*
* @returns The added OpenLayers.Tile.Image
* @type OpenLayers.Tile.Image
*/
addTile:function(bounds,position) {
var url = this.getURL(bounds);
return new OpenLayers.Tile.Image(this, position, bounds, url, this.tileSize);
},
/**
* Method: getURL
* Return a query string for this layer
*
* Parameters:
* bounds - {<OpenLayers.Bounds>} A bounds representing the bbox for the
* request
*
* Return:
* {String} A string with the layer's url and parameters and also the
* passed-in bounds and appropriate tile size specified as parameters
*/
getURL: function (bounds) {
bounds = this.adjustBounds(bounds);
// Make a list, so that getFullRequestString uses literal ","
var extent = [bounds.left, bounds. bottom, bounds.right, bounds.top];
// make lists, so that literal ','s are used
var url = this.getFullRequestString(
{mapext: extent,
imgext: extent,
map_size: [this.imageSize.w, this.imageSize.h],
imgx: this.imageSize.w / 2,
imgy: this.imageSize.h / 2,
imgxy: [this.imageSize.w, this.imageSize.h]
});
return url;
},
/**
* Method: getFullRequestString
* combine the layer's url with its params and these newParams.
*
* Parameter: {Object} newParams
* new parameters that should be added to the request string.
*
* Parameter: {String} altUrl
* optional, replace the URL in the full request string with the
* provided URL.
*
* Return: {String}
* A string with the layer's url and parameters embedded in it.
*/
getFullRequestString:function(newParams, altUrl) {
// use layer's url unless altUrl passed in
var url = (altUrl == null) ? this.url : altUrl;
// if url is not a string, it should be an array of strings,
// in which case we will randomly select one of them in order
// to evenly distribute requests to different urls.
if (typeof url == "object") {
url = url[Math.floor(Math.random()*url.length)];
}
// requestString always starts with url
var requestString = url;
// create a new params hashtable with all the layer params and the
// new params together. then convert to string
var allParams = OpenLayers.Util.extend(new Object(), this.params);
allParams = OpenLayers.Util.extend(allParams, newParams);
// ignore parameters that are already in the url search string
var urlParams = OpenLayers.Util.upperCaseObject(
OpenLayers.Util.getArgs(url));
for(var key in allParams) {
if(key.toUpperCase() in urlParams) {
delete allParams[key];
}
}
var paramsString = OpenLayers.Util.getParameterString(allParams);
/* MapServer needs '+' seperating things like bounds/height/width.
Since typically this is URL encoded, we use a slight hack: we
depend on the list-like functionality of getParameterString to
leave ',' only in the case of list items (since otherwise it is
encoded) then do a regular expression replace on the , characters
to '+' */
paramsString = paramsString.replace(/,/g, "+");
if (paramsString != "") {
var lastServerChar = url.charAt(url.length - 1);
if ((lastServerChar == "&") || (lastServerChar == "?")) {
requestString += paramsString;
} else {
if (url.indexOf('?') == -1) {
//serverPath has no ? -- add one
requestString += '?' + paramsString;
} else {
//serverPath contains ?, so must already have paramsString at the end
requestString += '&' + paramsString;
}
}
}
return requestString;
},
/**
* Constant: CLASS_NAME
* {String} OpenLayers.Layer.MapServer
*/
CLASS_NAME: "OpenLayers.Layer.MapServer"
});