added Layer.WMS.Post for WMS request params exceeding the maximum url length for GET requests. Thanks ingo for this excellent work! It is an honor to commit such a high quality patch. p=ingo, r=elemoine,me (closes #2224)
git-svn-id: http://svn.openlayers.org/trunk/openlayers@9734 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
175
examples/WMSPost.html
Normal file
175
examples/WMSPost.html
Normal file
@@ -0,0 +1,175 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>OpenLayers Basic WMS Example via HTTP-POST protocol</title>
|
||||
<link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
|
||||
<link rel="stylesheet" href="style.css" type="text/css" />
|
||||
<script src="../lib/OpenLayers.js"></script>
|
||||
<script type="text/javascript">
|
||||
var map;
|
||||
|
||||
function init(){
|
||||
var sld = '<StyledLayerDescriptor version="1.0.0">';
|
||||
sld+= '<NamedLayer>';
|
||||
sld+= '<Name>topp:tasmania_roads</Name>';
|
||||
sld+= '<UserStyle>';
|
||||
sld+= '<IsDefault>1</IsDefault>';
|
||||
sld+= '<FeatureTypeStyle>';
|
||||
sld+= '<Rule>';
|
||||
sld+= '<LineSymbolizer>';
|
||||
sld+= '<Stroke>';
|
||||
sld+= '<CssParameter name="stroke">';
|
||||
sld+= '<Literal>#787878</Literal>';
|
||||
sld+= '</CssParameter>';
|
||||
sld+= '<CssParameter name="stroke-width">';
|
||||
sld+= '<Literal>2</Literal>';
|
||||
sld+= '</CssParameter>';
|
||||
sld+= '</Stroke>';
|
||||
sld+= '</LineSymbolizer>';
|
||||
sld+= '</Rule>';
|
||||
sld+= '</FeatureTypeStyle>';
|
||||
sld+= '</UserStyle>';
|
||||
sld+= '</NamedLayer>';
|
||||
|
||||
sld+= '<NamedLayer>';
|
||||
sld+= '<Name>topp:tasmania_water_bodies</Name>';
|
||||
sld+= '<UserStyle>';
|
||||
sld+= '<IsDefault>1</IsDefault>';
|
||||
sld+= '<FeatureTypeStyle>';
|
||||
sld+= '<Rule>';
|
||||
sld+= '<LineSymbolizer>';
|
||||
sld+= '<Stroke>';
|
||||
sld+= '<CssParameter name="stroke">';
|
||||
sld+= '<Literal>#4F94CD</Literal>';
|
||||
sld+= '</CssParameter>';
|
||||
sld+= '<CssParameter name="stroke-width">';
|
||||
sld+= '<Literal>3</Literal>';
|
||||
sld+= '</CssParameter>';
|
||||
sld+= '</Stroke>';
|
||||
sld+= '</LineSymbolizer>';
|
||||
sld+= '<PolygonSymbolizer>';
|
||||
sld+= '<Fill>';
|
||||
sld+= '<CssParameter name="fill">';
|
||||
sld+= '<Literal>#63B8FF</Literal>';
|
||||
sld+= '</CssParameter>';
|
||||
sld+= '</Fill>';
|
||||
sld+= '</PolygonSymbolizer>';
|
||||
sld+= '</Rule>';
|
||||
sld+= '</FeatureTypeStyle>';
|
||||
sld+= '</UserStyle>';
|
||||
sld+= '</NamedLayer>';
|
||||
|
||||
sld+= '<NamedLayer>';
|
||||
sld+= '<Name>topp:tasmania_cities</Name>';
|
||||
sld+= '<UserStyle>';
|
||||
sld+= '<IsDefault>1</IsDefault>';
|
||||
sld+= '<FeatureTypeStyle>';
|
||||
sld+= '<Rule>';
|
||||
sld+= '<PointSymbolizer>';
|
||||
sld+= '<Graphic>';
|
||||
sld+= '<Mark>';
|
||||
sld+= '<WellKnownName>cross</WellKnownName>';
|
||||
sld+= '<Fill>';
|
||||
sld+= '<CssParameter name="fill">';
|
||||
sld+= '<Literal>#00FF00</Literal>';
|
||||
sld+= '</CssParameter>';
|
||||
sld+= '</Fill>';
|
||||
sld+= '</Mark>';
|
||||
sld+= '<Size>15</Size>';
|
||||
sld+= '</Graphic>';
|
||||
sld+= '</PointSymbolizer>';
|
||||
sld+= '<TextSymbolizer>';
|
||||
sld+= '<Label><PropertyName>CITY_NAME</PropertyName></Label>';
|
||||
sld+= '<Font>';
|
||||
sld+= '<SvgParameter name="font-size">15</SvgParameter>';
|
||||
sld+= '</Font>';
|
||||
sld+= '</TextSymbolizer>';
|
||||
sld+= '</Rule>';
|
||||
sld+= '</FeatureTypeStyle>';
|
||||
sld+= '</UserStyle>';
|
||||
sld+= '</NamedLayer>';
|
||||
|
||||
sld+= '<NamedLayer>';
|
||||
sld+= '<Name>topp:tasmania_state_boundaries</Name>';
|
||||
sld+= '<UserStyle>';
|
||||
sld+= '<IsDefault>1</IsDefault>';
|
||||
sld+= '<FeatureTypeStyle>';
|
||||
sld+= '<Rule>';
|
||||
sld+= '<PolygonSymbolizer>';
|
||||
sld+= '<Fill>';
|
||||
sld+= '<CssParameter name="fill">';
|
||||
sld+= '<Literal>#8B8989</Literal>';
|
||||
sld+= '</CssParameter>';
|
||||
sld+= '<CssParameter name="fill-opacity">';
|
||||
sld+= '<Literal>0.2</Literal>';
|
||||
sld+= '</CssParameter>';
|
||||
sld+= '</Fill>';
|
||||
sld+= '<Stroke>';
|
||||
sld+= '<CssParameter name="stroke">';
|
||||
sld+= '<Literal>#FF4040</Literal>';
|
||||
sld+= '</CssParameter>';
|
||||
sld+= '<CssParameter name="stroke-width">';
|
||||
sld+= '<Literal>2</Literal>';
|
||||
sld+= '</CssParameter>';
|
||||
sld+= '</Stroke>';
|
||||
sld+= '</PolygonSymbolizer>';
|
||||
sld+= '</Rule>';
|
||||
sld+= '</FeatureTypeStyle>';
|
||||
sld+= '</UserStyle>';
|
||||
sld+= '</NamedLayer>';
|
||||
|
||||
sld+= '</StyledLayerDescriptor>';
|
||||
|
||||
map = new OpenLayers.Map('map');
|
||||
map.addControl(new OpenLayers.Control.LayerSwitcher());
|
||||
|
||||
var layer = new OpenLayers.Layer.WMS(
|
||||
"OpenLayers WMS",
|
||||
"http://labs.metacarta.com/wms/vmap0",
|
||||
{
|
||||
layers: 'basic'
|
||||
}
|
||||
);
|
||||
|
||||
var rcbw = new OpenLayers.Layer.WMS.Post("Roads, Cities, Boundaries, Water",
|
||||
"http://demo.opengeo.org/geoserver/wms",
|
||||
{
|
||||
'layers': 'topp:tasmania_roads,topp:tasmania_water_bodies,topp:tasmania_state_boundaries,topp:tasmania_cities',
|
||||
transparent: true,
|
||||
format: 'image/jpeg',
|
||||
sld_body: sld
|
||||
},
|
||||
{
|
||||
isBaseLayer: false,
|
||||
unsupportedBrowsers: []
|
||||
}
|
||||
);
|
||||
map.addLayers([layer, rcbw]);
|
||||
map.setCenter(new OpenLayers.LonLat(146.65748632815,-42.230763671875), 7);
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body onload="init()">
|
||||
<h1 id="title">Basic WMS Example via HTTP-POST protocol with a large SLD
|
||||
included</h1>
|
||||
|
||||
<div id="tags"></div>
|
||||
|
||||
<div id="shortdesc">Creating a WMS layer with a large SLD in the sld_body</div>
|
||||
|
||||
<div id="map" style="width: 512; height: 256; border: 1px solid red;"></div>
|
||||
|
||||
<div id="docs">
|
||||
This example uses a large SLD created on the client side to style a WMS
|
||||
layer. This example uses a WMS.Post layer which transfers data via the
|
||||
HTTP-POST protocol. <br>
|
||||
NOTE: Opera is not able to display transparent tiles with this layer,
|
||||
and in some Firefox browsers can appear ugly viewport-shaking effects
|
||||
while dragging arround. Use the 'unsupportedBrowsers' property to
|
||||
control which browsers should use plain image tiles (like Layer.WMS)
|
||||
instead. The default setting (["mozilla", "firefox", "opera"])
|
||||
excludes problematic browsers without removing the ability to use long
|
||||
request parameters, because all these browsers support long urls via
|
||||
GET.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -91,6 +91,7 @@
|
||||
"OpenLayers/Popup.js",
|
||||
"OpenLayers/Tile.js",
|
||||
"OpenLayers/Tile/Image.js",
|
||||
"OpenLayers/Tile/Image/IFrame.js",
|
||||
"OpenLayers/Tile/WFS.js",
|
||||
"OpenLayers/Layer/Image.js",
|
||||
"OpenLayers/Layer/SphericalMercator.js",
|
||||
@@ -113,6 +114,7 @@
|
||||
"OpenLayers/Layer/ArcGIS93Rest.js",
|
||||
"OpenLayers/Layer/WMS.js",
|
||||
"OpenLayers/Layer/WMS/Untiled.js",
|
||||
"OpenLayers/Layer/WMS/Post.js",
|
||||
"OpenLayers/Layer/ArcIMS.js",
|
||||
"OpenLayers/Layer/GeoRSS.js",
|
||||
"OpenLayers/Layer/Boxes.js",
|
||||
|
||||
98
lib/OpenLayers/Layer/WMS/Post.js
Normal file
98
lib/OpenLayers/Layer/WMS/Post.js
Normal file
@@ -0,0 +1,98 @@
|
||||
/* Copyright (c) 2006-2008 MetaCarta, Inc., published under the Clear BSD
|
||||
* license. See http://svn.openlayers.org/trunk/openlayers/license.txt for the
|
||||
* full text of the license. */
|
||||
|
||||
|
||||
/**
|
||||
* @requires OpenLayers/Layer/WMS.js
|
||||
* @requires OpenLayers/Tile/Image/IFrame.js
|
||||
*/
|
||||
|
||||
/**
|
||||
* Class: OpenLayers.Layer.WMS.Post
|
||||
* Instances of OpenLayers.Layer.WMS.Post are used to retrieve data from OGC
|
||||
* Web Mapping Services via HTTP-POST (application/x-www-form-urlencoded).
|
||||
* Create a new WMS layer with the <OpenLayers.Layer.WMS.Post> constructor.
|
||||
*
|
||||
* Inherits from:
|
||||
* - <OpenLayers.Layer.WMS>
|
||||
*/
|
||||
OpenLayers.Layer.WMS.Post = OpenLayers.Class(OpenLayers.Layer.WMS, {
|
||||
|
||||
/**
|
||||
* Property: tileClass
|
||||
* {Object} Class, used to create tiles.
|
||||
*/
|
||||
tileClass: null,
|
||||
|
||||
/**
|
||||
* APIProperty: unsupportedBrowsers
|
||||
* {Array} Array with browsers, which should use the HTTP-GET protocol
|
||||
* instead of HTTP-POST for fetching tiles from a WMS .
|
||||
* Defaults to ["mozilla", "firefox", "opera"], because Opera is not able
|
||||
* to show transparent images in IFrames and Firefox/Mozilla has some ugly
|
||||
* effects of viewport-shaking when panning the map. Both browsers, Opera
|
||||
* and Firefox/Mozilla, have no problem with long urls, which is the reason
|
||||
* for using POST instead of GET. The strings to pass to this array are
|
||||
* the ones returned by <OpenLayers.Util.getBrowserName()>.
|
||||
*/
|
||||
unsupportedBrowsers: ["mozilla", "firefox", "opera"],
|
||||
|
||||
/**
|
||||
* Property: SUPPORTED_TRANSITIONS
|
||||
* {Array}
|
||||
* no supported transitions for this type of layer, because it is not
|
||||
* possible to modify the initialized tiles (iframes)
|
||||
*/
|
||||
SUPPORTED_TRANSITIONS: [],
|
||||
|
||||
/**
|
||||
* Constructor: OpenLayers.Layer.WMS.Post
|
||||
* Creates a new WMS layer object.
|
||||
*
|
||||
* Example:
|
||||
* (code)
|
||||
* var wms = new OpenLayers.Layer.WMS.Post(
|
||||
* "NASA Global Mosaic",
|
||||
* "http://wms.jpl.nasa.gov/wms.cgi",
|
||||
* {layers: "modis, global_mosaic"});
|
||||
* (end)
|
||||
*
|
||||
* Parameters:
|
||||
* name - {String} A name for the layer
|
||||
* url - {String} Base url for the WMS
|
||||
* (e.g. http://wms.jpl.nasa.gov/wms.cgi)
|
||||
* params - {Object} An object with key/value pairs representing the
|
||||
* GetMap query string parameters and parameter values.
|
||||
* options - {Object} Hashtable of extra options to tag onto the layer.
|
||||
*/
|
||||
initialize: function(name, url, params, options) {
|
||||
var newArguments = [];
|
||||
newArguments.push(name, url, params, options);
|
||||
OpenLayers.Layer.WMS.prototype.initialize.apply(this, newArguments);
|
||||
|
||||
this.tileClass = OpenLayers.Util.indexOf(
|
||||
this.unsupportedBrowsers, OpenLayers.Util.getBrowserName()) != -1
|
||||
? OpenLayers.Tile.Image
|
||||
: OpenLayers.Tile.Image.IFrame;
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: addTile
|
||||
* addTile creates a tile, initializes it and adds it as iframe to the
|
||||
* layer div.
|
||||
*
|
||||
* Parameters:
|
||||
* bounds - {<OpenLayers.Bounds>}
|
||||
* position - {<OpenLayers.Pixel>}
|
||||
*
|
||||
* Returns:
|
||||
* {<OpenLayers.Tile.Image.IFrame>} The added OpenLayers.Tile.Image.IFrame
|
||||
*/
|
||||
addTile: function(bounds,position) {
|
||||
return new this.tileClass(
|
||||
this, position, bounds, null, this.tileSize);
|
||||
},
|
||||
|
||||
CLASS_NAME: 'OpenLayers.Layer.WMS.Post'
|
||||
});
|
||||
260
lib/OpenLayers/Tile/Image/IFrame.js
Normal file
260
lib/OpenLayers/Tile/Image/IFrame.js
Normal file
@@ -0,0 +1,260 @@
|
||||
/* Copyright (c) 2006-2008 MetaCarta, Inc., published under the Clear BSD
|
||||
* license. See http://svn.openlayers.org/trunk/openlayers/license.txt for the
|
||||
* full text of the license. */
|
||||
|
||||
|
||||
/**
|
||||
* @requires OpenLayers/Tile/Image.js
|
||||
*/
|
||||
|
||||
/**
|
||||
* Class: OpenLayers.Tile.Image.IFrame
|
||||
* Instances of OpenLayers.Tile.Image.IFrame are used to manage the image tiles
|
||||
* used by Layer.WMS.Post loaded via HTTP-POST-protocol. Create a new image
|
||||
* tile with the <OpenLayers.Tile.Image.IFrame> constructor.
|
||||
*
|
||||
* Inherits from:
|
||||
* - <OpenLayers.Tile.Image>
|
||||
*/
|
||||
OpenLayers.Tile.Image.IFrame = OpenLayers.Class(OpenLayers.Tile.Image, {
|
||||
|
||||
/**
|
||||
* Property: layerAlphaHack
|
||||
* {Boolean} Always false for an instance.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Constructor: OpenLayers.Tile.Image.IFrame
|
||||
* Constructor for a new <OpenLayers.Tile.Image.IFrame> instance.
|
||||
*
|
||||
* Parameters:
|
||||
* layer - {<OpenLayers.Layer>} layer that the tile will go in.
|
||||
* position - {<OpenLayers.Pixel>}
|
||||
* bounds - {<OpenLayers.Bounds>}
|
||||
* size - {<OpenLayers.Size>}
|
||||
*/
|
||||
initialize: function(layer, position, bounds, url, size) {
|
||||
OpenLayers.Tile.Image.prototype.initialize.apply(this, arguments);
|
||||
this.layerAlphaHack = false;
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: destroy
|
||||
* nullify references to prevent circular references and memory leaks
|
||||
*/
|
||||
destroy: function() {
|
||||
if(this.imgDiv != null) {
|
||||
// unregister the "load" handler
|
||||
OpenLayers.Event.stopObservingElement(this.imgDiv.firstChild);
|
||||
}
|
||||
OpenLayers.Tile.Image.prototype.destroy.apply(this, arguments);
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: clear
|
||||
* Removes the iframe from DOM (avoids back-button problems).
|
||||
*/
|
||||
clear: function() {
|
||||
if(this.imgDiv) {
|
||||
var iFrame = this.imgDiv.firstChild;
|
||||
OpenLayers.Event.stopObservingElement(iFrame);
|
||||
this.imgDiv.removeChild(iFrame);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: clone
|
||||
*
|
||||
* Parameters:
|
||||
* obj - {<OpenLayers.Tile.Image.IFrame>} The tile to be cloned
|
||||
*
|
||||
* Returns:
|
||||
* {<OpenLayers.Tile.Image.IFrame>} An exact clone of this
|
||||
* <OpenLayers.Tile.Image.IFrame>
|
||||
*/
|
||||
clone: function (obj) {
|
||||
if (obj == null) {
|
||||
obj = new OpenLayers.Tile.Image.IFrame(
|
||||
this.layer, this.position, this.bounds, this.url, this.size);
|
||||
}
|
||||
|
||||
//pick up properties from superclass
|
||||
obj = OpenLayers.Tile.Image.prototype.clone.apply(this, [obj]);
|
||||
|
||||
return obj;
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: renderTile
|
||||
*/
|
||||
renderTile: function() {
|
||||
if(OpenLayers.Tile.Image.prototype.renderTile.apply(this, arguments)) {
|
||||
// create a html form and add it temporary to the layer div
|
||||
var form = this.createRequestForm();
|
||||
this.imgDiv.appendChild(form);
|
||||
|
||||
// submit the form (means fetching the image)
|
||||
form.submit();
|
||||
this.imgDiv.removeChild(form);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: initImgDiv
|
||||
* Creates the imgDiv property on the tile.
|
||||
*/
|
||||
initImgDiv: function() {
|
||||
this.imgDiv = this.createImgDiv()
|
||||
|
||||
OpenLayers.Util.modifyDOMElement(this.imgDiv, this.id, null,
|
||||
this.layer.getImageSize(), "relative");
|
||||
this.imgDiv.className = 'olTileImage';
|
||||
|
||||
this.frame.appendChild(this.imgDiv);
|
||||
this.layer.div.appendChild(this.frame);
|
||||
|
||||
if(this.layer.opacity != null) {
|
||||
|
||||
OpenLayers.Util.modifyDOMElement(this.imgDiv, null, null, null,
|
||||
null, null, null,
|
||||
this.layer.opacity);
|
||||
}
|
||||
|
||||
// we need this reference to check back the viewRequestID
|
||||
this.imgDiv.map = this.layer.map;
|
||||
|
||||
//bind a listener to the onload of the iframe so that we
|
||||
// can register when a tile has finished loading.
|
||||
var onload = function() {
|
||||
this.show();
|
||||
//normally isLoading should always be true here but there are some
|
||||
// right funky conditions where loading and then reloading a tile
|
||||
// with the same url *really*fast*. this check prevents sending
|
||||
// a 'loadend' if the msg has already been sent
|
||||
//
|
||||
if (this.isLoading) {
|
||||
this.isLoading = false;
|
||||
this.events.triggerEvent("loadend");
|
||||
}
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: createImgDiv
|
||||
* Creates a div with iframe.and eventPane
|
||||
*
|
||||
* Returns:
|
||||
* {DOMElement}
|
||||
*/
|
||||
createImgDiv: function() {
|
||||
var eventPane = document.createElement("div");
|
||||
|
||||
if(OpenLayers.Util.getBrowserName() == "msie") {
|
||||
// IE cannot handle events on elements without backgroundcolor. So we
|
||||
// use this little hack to make elements transparent
|
||||
eventPane.style.backgroundColor = '#FFFFFF';
|
||||
eventPane.style.filter = 'chroma(color=#FFFFFF)';
|
||||
}
|
||||
|
||||
OpenLayers.Util.modifyDOMElement(eventPane, null,
|
||||
new OpenLayers.Pixel(0,0), this.layer.getImageSize(), "absolute");
|
||||
|
||||
var imgDiv = document.createElement("div");
|
||||
imgDiv.appendChild(eventPane);
|
||||
return imgDiv;
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: createIFrame
|
||||
* Create the IFrame which shows the image.
|
||||
*
|
||||
* Returns:
|
||||
* {DOMElement} Iframe
|
||||
*/
|
||||
createIFrame: function() {
|
||||
var id = this.id+'_iFrame';
|
||||
var iframe;
|
||||
if(OpenLayers.Util.getBrowserName() == "msie") {
|
||||
// InternetExplorer does not set the name attribute of an iFrame
|
||||
// properly via DOM manipulation, so we need to do it on our own with
|
||||
// this hack.
|
||||
iframe = document.createElement('<iframe name="'+id+'">');
|
||||
|
||||
// IFrames in InternetExplorer are not transparent, if you set the
|
||||
// backgroundColor transparent. This is a workarround to get
|
||||
// transparent iframes.
|
||||
iframe.style.backgroundColor = '#FFFFFF';
|
||||
iframe.style.filter = 'chroma(color=#FFFFFF)';
|
||||
}
|
||||
else {
|
||||
iframe = document.createElement('iframe');
|
||||
iframe.style.backgroundColor = 'transparent';
|
||||
|
||||
// iframe.name needs to be an unique id, otherwise it
|
||||
// could happen that other iframes are overwritten.
|
||||
iframe.name = id;
|
||||
}
|
||||
iframe.id = id;
|
||||
|
||||
// some special properties to avoid scaling the images and scrollbars
|
||||
// in the iframe
|
||||
iframe.scrolling = 'no';
|
||||
iframe.marginWidth = '0px';
|
||||
iframe.marginHeight = '0px';
|
||||
iframe.frameBorder = '0';
|
||||
|
||||
OpenLayers.Util.modifyDOMElement(iframe, id,
|
||||
new OpenLayers.Pixel(0,0), this.layer.getImageSize(), "absolute");
|
||||
|
||||
return iframe;
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: createRequestForm
|
||||
* Create the html <form> element with width, height, bbox and all
|
||||
* parameters specified in the layer params.
|
||||
*
|
||||
* Returns:
|
||||
* {DOMElement} The form element which sends the HTTP-POST request to the
|
||||
* WMS.
|
||||
*/
|
||||
createRequestForm: function() {
|
||||
// creation of the form element
|
||||
var form = document.createElement('form');
|
||||
form.method = 'POST';
|
||||
// call getFullRequestString in a scope without params
|
||||
var cacheId = this.layer.params["_OLSALT"];
|
||||
cacheId = (cacheId ? cacheId + "_" : "") + this.bounds.toBBOX();
|
||||
form.action = OpenLayers.Util.urlAppend(this.layer.url, cacheId);
|
||||
|
||||
// insert the iframe, which has been removed to avoid back-button
|
||||
// problems
|
||||
this.imgDiv.insertBefore(this.createIFrame(), this.imgDiv.firstChild);
|
||||
|
||||
form.target = this.id+'_iFrame';
|
||||
|
||||
// adding all parameters in layer params as hidden fields to the html
|
||||
// form element
|
||||
var imageSize = this.layer.getImageSize();
|
||||
var params = OpenLayers.Util.extend(
|
||||
{
|
||||
"BBOX": this.encodeBBOX ? this.bounds.toBBOX() :
|
||||
this.bounds.toArray(),
|
||||
"WIDTH": imageSize.w,
|
||||
"HEIGHT": imageSize.h
|
||||
}, this.layer.params);
|
||||
|
||||
for(var par in params) {
|
||||
var field = document.createElement('input');
|
||||
field.type = 'hidden';
|
||||
field.name = par;
|
||||
field.value = params[par];
|
||||
form.appendChild(field);
|
||||
}
|
||||
|
||||
return form;
|
||||
},
|
||||
|
||||
CLASS_NAME: "OpenLayers.Tile.Image.IFrame"
|
||||
}
|
||||
);
|
||||
86
tests/Layer/WMS/Post.html
Normal file
86
tests/Layer/WMS/Post.html
Normal file
@@ -0,0 +1,86 @@
|
||||
<html>
|
||||
<head>
|
||||
<script src="../../../lib/OpenLayers.js"></script>
|
||||
<script type="text/javascript">
|
||||
var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
|
||||
var isOpera = (navigator.userAgent.indexOf("Opera") != -1);
|
||||
var layer;
|
||||
|
||||
var name = 'Test Layer';
|
||||
var url = "http://octo.metacarta.com/cgi-bin/mapserv";
|
||||
var params = { map: '/mapdata/vmap_wms.map',
|
||||
layers: 'basic',
|
||||
format: 'image/jpeg'};
|
||||
|
||||
function test_Layer_WMS_Post_constructor (t) {
|
||||
t.plan( 2 );
|
||||
|
||||
var url = "http://octo.metacarta.com/cgi-bin/mapserv";
|
||||
layer = new OpenLayers.Layer.WMS.Post(name, url, params);
|
||||
|
||||
t.ok(
|
||||
layer.tileClass == OpenLayers.Tile.Image.IFrame,
|
||||
"instantiate OpenLayers.Tile.Image.IFrame tiles.");
|
||||
|
||||
layer.destroy();
|
||||
|
||||
var options = { unsupportedBrowsers: [OpenLayers.Util.getBrowserName()]};
|
||||
layer = new OpenLayers.Layer.WMS.Post(name, url, params, options);
|
||||
t.ok(
|
||||
layer.tileClass == OpenLayers.Tile.Image,
|
||||
"unsupported browser instantiate Image tiles.");
|
||||
layer.destroy();
|
||||
}
|
||||
|
||||
function test_Layer_WMS_Post_addtile (t) {
|
||||
t.plan( 3 );
|
||||
|
||||
layer = new OpenLayers.Layer.WMS.Post(name, url, params);
|
||||
var map = new OpenLayers.Map('map');
|
||||
map.addLayer(layer);
|
||||
var bounds = new OpenLayers.Bounds(1,2,3,4);
|
||||
var pixel = new OpenLayers.Pixel(5,6);
|
||||
var tile = layer.addTile(bounds, pixel);
|
||||
|
||||
if(isMozilla || isOpera) {
|
||||
t.ok(
|
||||
tile instanceof OpenLayers.Tile.Image,
|
||||
"tile is an instance of OpenLayers.Tile.Image");
|
||||
}
|
||||
else {
|
||||
t.ok(
|
||||
tile instanceof OpenLayers.Tile.Image.IFrame,
|
||||
"tile is an instance of OpenLayers.Tile.Image.IFrame");
|
||||
}
|
||||
map.destroy();
|
||||
|
||||
var browserName = OpenLayers.Util.getBrowserName();
|
||||
var options = { unsupportedBrowsers: [browserName]};
|
||||
|
||||
// test the unsupported browser
|
||||
layer = new OpenLayers.Layer.WMS.Post(name, url, params, options);
|
||||
map = new OpenLayers.Map('map');
|
||||
map.addLayer(layer);
|
||||
tile = layer.addTile(bounds, pixel);
|
||||
t.ok(
|
||||
tile instanceof OpenLayers.Tile.Image,
|
||||
"unsupported browser: tile is an instance of Tile.Image");
|
||||
layer.destroy();
|
||||
|
||||
// test a supported browser
|
||||
OpenLayers.Util.getBrowserName = function () { return 'not_' + browserName };
|
||||
layer = new OpenLayers.Layer.WMS.Post(name, url, params, options);
|
||||
map.addLayer(layer);
|
||||
var tile2 = layer.addTile(bounds, pixel);
|
||||
t.ok(
|
||||
tile2 instanceof OpenLayers.Tile.Image.IFrame,
|
||||
"supported browser: tile is an instance of Tile.Image.IFrame");
|
||||
map.destroy();
|
||||
}
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="map" style="width:500px;height:550px"></div>
|
||||
</body>
|
||||
</html>
|
||||
221
tests/Tile/Image/IFrame.html
Normal file
221
tests/Tile/Image/IFrame.html
Normal file
@@ -0,0 +1,221 @@
|
||||
<html>
|
||||
<head>
|
||||
<script src="../../../lib/OpenLayers.js"></script>
|
||||
<script type="text/javascript">
|
||||
var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
|
||||
var isOpera = (navigator.userAgent.indexOf("Opera") != -1);
|
||||
var isIE = (navigator.userAgent.indexOf("MSIE") != -1);
|
||||
|
||||
var map, layer;
|
||||
var position = new OpenLayers.Pixel(20,30);
|
||||
var bounds = new OpenLayers.Bounds(1,2,3,4);
|
||||
var url = "http://www.openlayers.org/dev/tests/tileimage";
|
||||
var size = new OpenLayers.Size(5,6);
|
||||
var name = "OpenaLayers WMS";
|
||||
var wmsUrl = "http://labs.metacarta.com/wms/vmap0?";
|
||||
|
||||
function test_Tile_Image_IFrame_constructor (t) {
|
||||
t.plan( 2 );
|
||||
var tile = new OpenLayers.Tile.Image.IFrame(layer, position, bounds, url, size);
|
||||
|
||||
t.ok( tile instanceof OpenLayers.Tile.Image.IFrame, "new OpenLayers.Tile.Image.IFrame returns Tile object" );
|
||||
t.eq( tile.layerAlphaHack, false, "layerAlphaHack is set to false.");
|
||||
}
|
||||
|
||||
function test_Tile_Image_IFrame_destroy (t) {
|
||||
t.plan( 2 );
|
||||
map = new OpenLayers.Map('map');
|
||||
layer = new OpenLayers.Layer.WMS.Post(name, wmsUrl, {layers: 'basic'});
|
||||
map.addLayer(layer);
|
||||
|
||||
var tile = new OpenLayers.Tile.Image.IFrame(layer, position, bounds, null, size);
|
||||
tile.renderTile();
|
||||
tile.positionImage();
|
||||
|
||||
tile.destroy();
|
||||
t.eq( tile.imgDiv, null, "IFrame successfully removed from DOM");
|
||||
t.eq( tile.frame, null, "Event div successfully removed from DOM");
|
||||
|
||||
map.destroy();
|
||||
}
|
||||
|
||||
function test_Tile_Image_IFrame_clone (t) {
|
||||
t.plan( 9 );
|
||||
|
||||
layer = new OpenLayers.Layer.WMS.Post(name, wmsUrl, {layers: 'basic'});
|
||||
tile = new OpenLayers.Tile.Image.IFrame(layer, position, bounds, url, size);
|
||||
tile.iFrame = {};
|
||||
var clone = tile.clone();
|
||||
|
||||
t.ok( clone instanceof OpenLayers.Tile.Image.IFrame, "clone is a Tile.Image.IFrame object" );
|
||||
t.ok( clone.layer == layer, "clone.layer is set correctly");
|
||||
t.ok( clone.position.equals(position), "clone.position is set correctly");
|
||||
t.ok( clone.bounds.equals(bounds), "clone.bounds is set correctly");
|
||||
t.eq( clone.url, url, "clone.url is set correctly");
|
||||
t.ok( clone.size.equals(size), "clone.size is set correctly");
|
||||
t.ok( clone.frame, "clone has a frame");
|
||||
t.ok( clone.frame != tile.frame, "clone's frame is a new one");
|
||||
t.ok( clone.imgDiv == null, "clone's imgDiv was not copied");
|
||||
}
|
||||
|
||||
function test_Tile_Image_IFrame_clear (t) {
|
||||
t.plan( 1 );
|
||||
|
||||
map = new OpenLayers.Map('map');
|
||||
layer = new OpenLayers.Layer.WMS.Post(name, wmsUrl, {layers: 'basic'});
|
||||
map.addLayer(layer);
|
||||
tile = new OpenLayers.Tile.Image.IFrame(layer, position, bounds, url, size);
|
||||
tile.draw();
|
||||
tile.clear();
|
||||
|
||||
t.ok(
|
||||
tile.imgDiv.firstChild.nodeName != "IFRAME",
|
||||
"IFrame successfully removed from DOM");
|
||||
map.destroy();
|
||||
}
|
||||
|
||||
function test_Tile_Image_IFrame_initImgDiv (t) {
|
||||
t.plan( 4 );
|
||||
|
||||
map = new OpenLayers.Map('map');
|
||||
layer = new OpenLayers.Layer.WMS.Post(name, wmsUrl, {layers: 'basic'});
|
||||
map.addLayer(layer);
|
||||
tile = new OpenLayers.Tile.Image.IFrame(layer, position, bounds, url, size);
|
||||
tile.initImgDiv();
|
||||
|
||||
if(isMozilla) {
|
||||
t.ok( tile.imgDiv instanceof HTMLElement, "tile.iFrame successfully created.");
|
||||
}
|
||||
else {
|
||||
t.ok( tile.imgDiv != null, "tile.iFrame successfully created.");
|
||||
}
|
||||
t.eq( tile.imgDiv.id, tile.id, "imgDiv id correctly set.");
|
||||
t.eq( tile.imgDiv.className, "olTileImage", "iFrame's className correctly set.");
|
||||
t.ok( tile.imgDiv.map == map, "map correctly added to iFrame.");
|
||||
|
||||
map.destroy();
|
||||
}
|
||||
|
||||
function test_Tile_Image_IFrame_createImgDiv (t) {
|
||||
t.plan( 3 );
|
||||
|
||||
map = new OpenLayers.Map('map');
|
||||
layer = new OpenLayers.Layer.WMS.Post(name, wmsUrl, {layers: 'basic'});
|
||||
map.addLayer(layer);
|
||||
var tile = new OpenLayers.Tile.Image.IFrame(layer, position, bounds, url, size);
|
||||
var imgDiv = tile.createImgDiv();
|
||||
var iFrame = imgDiv.firstChild;
|
||||
var eventPane = imgDiv.childNodes[1];
|
||||
|
||||
if(isIE) {
|
||||
t.ok(iFrame != null, "IFrame successfully created.");
|
||||
t.eq(eventPane.style.backgroundColor, '#ffffff', "backgroundColor of overlay pane is set in InternetExplorer.");
|
||||
t.eq(eventPane.style.filter, 'chroma(color=#FFFFFF)', "filter of overlay pane is set in InternetExplorer.");
|
||||
}
|
||||
else {
|
||||
t.ok(iFrame instanceof HTMLElement, "IFrame successfully created.");
|
||||
t.ok(true, 'Skip eventPane backgroundColor test outside IE');
|
||||
t.ok(true, 'Skip eventPane filter test outside IE');
|
||||
}
|
||||
map.destroy();
|
||||
}
|
||||
|
||||
function test_Tile_Image_IFrame_createIFrame (t) {
|
||||
t.plan( 8 );
|
||||
|
||||
map = new OpenLayers.Map('map');
|
||||
layer = new OpenLayers.Layer.WMS.Post(name, wmsUrl, {layers: 'basic'});
|
||||
map.addLayer(layer);
|
||||
var tile = new OpenLayers.Tile.Image.IFrame(layer, position, bounds, url, size);
|
||||
var iFrame = tile.createIFrame();
|
||||
|
||||
var id = tile.id+'_iFrame';
|
||||
t.eq(iFrame.id, id, "iframe id correctly set.");
|
||||
t.eq(iFrame.name, id, "iframe name correctly set.");
|
||||
|
||||
if(isIE) {
|
||||
t.eq(iFrame.style.backgroundColor, '#ffffff', "backgroundColor correctly set.");
|
||||
t.eq(iFrame.style.filter, 'chroma(color=#FFFFFF)', "filter correctly set.");
|
||||
}
|
||||
else {
|
||||
t.eq(iFrame.style.backgroundColor, 'transparent', "backgroundColor correctly set.");
|
||||
t.ok(true, "Skip filter test outside InternetExplorer.");
|
||||
}
|
||||
t.eq( iFrame.scrolling, 'no', "no scrolling");
|
||||
t.eq( iFrame.marginWidth, '0', "no margin width");
|
||||
t.eq( iFrame.marginHeight, '0', "no margin height");
|
||||
t.eq( iFrame.frameBorder, '0', "no iframe border");
|
||||
}
|
||||
|
||||
function test_Tile_Image_IFrame_createRequestForm (t) {
|
||||
t.plan( 6 );
|
||||
|
||||
var tParams = {
|
||||
SERVICE: "WMS", VERSION: "1.1.1",
|
||||
REQUEST: "GetMap", STYLES: "",
|
||||
EXCEPTIONS: "application/vnd.ogc.se_inimage", FORMAT: "image/jpeg",
|
||||
SRS: "EPSG:4326", BBOX: [1,2,3,4],
|
||||
WIDTH: String(size.w), HEIGHT: String(size.h)
|
||||
};
|
||||
var newLayer = new OpenLayers.Layer.WMS.Post("Name",
|
||||
"http://labs.metacarta.com/TESTURL",
|
||||
tParams,
|
||||
{tileSize: size});
|
||||
map = new OpenLayers.Map('map');
|
||||
map.addLayer(newLayer);
|
||||
tile = new OpenLayers.Tile.Image.IFrame(newLayer, position, bounds, url, size);
|
||||
tile.initImgDiv();
|
||||
|
||||
var form = tile.createRequestForm();
|
||||
if(isMozilla) {
|
||||
t.ok( form instanceof HTMLElement, "created html form successfully.");
|
||||
}
|
||||
else {
|
||||
t.ok( form != null, "created html form successfully.");
|
||||
}
|
||||
|
||||
|
||||
var cacheId = newLayer.params["_OLSALT"];
|
||||
cacheId = (cacheId ? cacheId + "_" : "") + tile.bounds.toBBOX();
|
||||
var url = OpenLayers.Util.urlAppend(newLayer.url, cacheId);
|
||||
|
||||
t.eq( form.method, 'post', "form method correctly set.");
|
||||
t.eq( form.target, tile.id+'_iFrame', "form target correctly set.");
|
||||
t.eq( form.action, url, "form action correctly set.");
|
||||
|
||||
var contain = true;
|
||||
var children = form.childNodes;
|
||||
for(var par in newLayer.params) {
|
||||
var test = false;
|
||||
|
||||
for(var i=0; i<children.length; i++) {
|
||||
if(children.item(i).name == par && children.item(i).value == newLayer.params[par]) {
|
||||
test = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(test == false) {
|
||||
contain = false;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
t.eq( contain, true, "html form elements equal layer's parameters.");
|
||||
|
||||
tile.draw();
|
||||
tile.clear();
|
||||
tile.createRequestForm();
|
||||
t.ok(
|
||||
tile.imgDiv.firstChild.nodeName == "IFRAME",
|
||||
"Iframe has been reinserted properly"
|
||||
);
|
||||
|
||||
map.destroy();
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="map" style="height:550px;width:500px"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -133,6 +133,7 @@
|
||||
<li>Layer/Vector/RootContainer.html</li>
|
||||
<li>Layer/WFS.html</li>
|
||||
<li>Layer/WMS.html</li>
|
||||
<li>Layer/WMS/Post.html</li>
|
||||
<li>Layer/WrapDateLine.html</li>
|
||||
<li>Layer/XYZ.html</li>
|
||||
<li>Layer/Yahoo.html</li>
|
||||
@@ -168,6 +169,7 @@
|
||||
<li>StyleMap.html</li>
|
||||
<li>Tile.html</li>
|
||||
<li>Tile/Image.html</li>
|
||||
<li>Tile/Image/IFrame.html</li>
|
||||
<li>Tile/WFS.html</li>
|
||||
<li>Tween.html</li>
|
||||
<li>Util.html</li>
|
||||
|
||||
Reference in New Issue
Block a user