Merge branch 'master' of github.com:openlayers/openlayers into convenience
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
|
||||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||||
<title>Basic Bing Tiles with a Subset of Resolutions Example</title>
|
<title>Basic Bing Tiles with a Subset of Resolutions Example</title>
|
||||||
<link rel="stylesheet" href="../theme/default/style.css" type="text/css">
|
<link rel="stylesheet" href="../theme/default/style.css" type="text/css">
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<title>OpenLayers Canvas Hit Detection Example</title>
|
<title>OpenLayers Canvas Hit Detection Example</title>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0;">
|
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0">
|
||||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||||
<link rel="stylesheet" href="../theme/default/style.css" type="text/css">
|
<link rel="stylesheet" href="../theme/default/style.css" type="text/css">
|
||||||
<link rel="stylesheet" href="style.css" type="text/css">
|
<link rel="stylesheet" href="style.css" type="text/css">
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<title>OpenLayers Undo/Redo Drawing Methods</title>
|
<title>OpenLayers Undo/Redo Drawing Methods</title>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0;">
|
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0">
|
||||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||||
<link rel="stylesheet" href="../theme/default/style.css" type="text/css">
|
<link rel="stylesheet" href="../theme/default/style.css" type="text/css">
|
||||||
<link rel="stylesheet" href="style.css" type="text/css">
|
<link rel="stylesheet" href="style.css" type="text/css">
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<title>OpenLayers Editing Methods</title>
|
<title>OpenLayers Editing Methods</title>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0;">
|
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0">
|
||||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||||
<link rel="stylesheet" href="../theme/default/style.css" type="text/css">
|
<link rel="stylesheet" href="../theme/default/style.css" type="text/css">
|
||||||
<link rel="stylesheet" href="style.css" type="text/css">
|
<link rel="stylesheet" href="style.css" type="text/css">
|
||||||
|
|||||||
@@ -0,0 +1,160 @@
|
|||||||
|
html, body, #map {
|
||||||
|
margin: 0;
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
#map {
|
||||||
|
cursor: move;
|
||||||
|
}
|
||||||
|
#title, #tags, #shortdesc {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
div.olControlAttribution {
|
||||||
|
position: absolute;
|
||||||
|
font-size: 10px;
|
||||||
|
text-align: right;
|
||||||
|
color: #BFEFFF;
|
||||||
|
bottom: 0;
|
||||||
|
right: 0;
|
||||||
|
background: rgba(0,0,100,0.2);
|
||||||
|
font-family: Arial, Helvetica, sans-serif;
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 2px 4px;
|
||||||
|
border-radius: 5px 0 0 0;
|
||||||
|
}
|
||||||
|
.olControlAttribution a {
|
||||||
|
font-weight: bold;
|
||||||
|
color: #BFEFFF;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
div.olControlZoomPanel {
|
||||||
|
height: 108px;
|
||||||
|
width: 36px;
|
||||||
|
position: absolute;
|
||||||
|
top: 20px;
|
||||||
|
left: inherit;
|
||||||
|
right: 20px;
|
||||||
|
}
|
||||||
|
div.olControlZoomPanel div {
|
||||||
|
cursor: pointer;
|
||||||
|
width: 36px;
|
||||||
|
height: 36px;
|
||||||
|
left: 0;
|
||||||
|
background-color: #ccc;
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
div.olControlZoomPanel .olControlZoomInItemInactive,
|
||||||
|
div.olControlZoomPanel .olControlZoomOutItemInactive {
|
||||||
|
top: 0;
|
||||||
|
background: rgba(0,0,100,0.4);
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
div.olControlZoomPanel .olControlZoomInItemInactive {
|
||||||
|
border-radius: 5px 5px 0 0;
|
||||||
|
}
|
||||||
|
div.olControlZoomPanel .olControlZoomOutItemInactive {
|
||||||
|
border-radius: 0 0 5px 5px;
|
||||||
|
top: 37px;
|
||||||
|
}
|
||||||
|
div.olControlZoomPanel .olControlZoomOutItemInactive:after,
|
||||||
|
div.olControlZoomPanel .olControlZoomInItemInactive:after {
|
||||||
|
font-weight: bold;
|
||||||
|
content: '+';
|
||||||
|
font-size: 36px;
|
||||||
|
padding: 7px;
|
||||||
|
z-index: 2000;
|
||||||
|
color: #BFEFFF;
|
||||||
|
line-height: 1em;
|
||||||
|
}
|
||||||
|
div.olControlZoomPanel .olControlZoomOutItemInactive:after {
|
||||||
|
content: '–';
|
||||||
|
line-height: 0.9em;
|
||||||
|
padding: 0 8px;
|
||||||
|
}
|
||||||
|
div.olControlZoomPanel .olControlZoomToMaxExtentItemInactive {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
div.olControlZoomPanel div.olControlGeolocateItemInactive,
|
||||||
|
div.olControlZoomPanel div.olControlGeolocateItemActive {
|
||||||
|
position: absolute;
|
||||||
|
right: 20px;
|
||||||
|
top: 98px;
|
||||||
|
border-radius: 5px 5px 5px 5px;
|
||||||
|
background: #ccc url(img/locate.png) center no-repeat;
|
||||||
|
background-color: rgba(0,0,100,0.4);
|
||||||
|
}
|
||||||
|
div.olControlZoomPanel div.olControlGeolocateItemActive {
|
||||||
|
background-color: rgba(0,0,100,0.2);
|
||||||
|
}
|
||||||
|
div.olControlGeolocateItemInactive:after {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 36px;
|
||||||
|
padding: 7px;
|
||||||
|
z-index: 2000;
|
||||||
|
color: #BFEFFF;
|
||||||
|
line-height: 1em;
|
||||||
|
background: none;
|
||||||
|
}
|
||||||
|
.layerPanel {
|
||||||
|
position: absolute;
|
||||||
|
top: 20px;
|
||||||
|
right: 82px;
|
||||||
|
}
|
||||||
|
div.layerPanel div {
|
||||||
|
display: inline;
|
||||||
|
margin-left: 5px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
div.layerPanel div:after {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 18px;
|
||||||
|
font-family: arial;
|
||||||
|
padding: 8px;
|
||||||
|
color: #BFEFFF;
|
||||||
|
line-height: 36px;
|
||||||
|
border-radius: 5px 5px 5px 5px;
|
||||||
|
background-color: #ccc;
|
||||||
|
background: rgba(0,0,100,0.4);
|
||||||
|
}
|
||||||
|
div.layerPanel div.labelButtonItemInactive:after,
|
||||||
|
div.layerPanel div.labelButtonItemActive:after {
|
||||||
|
content: 'Labels';
|
||||||
|
}
|
||||||
|
:lang(de) div.layerPanel div.labelButtonItemInactive:after,
|
||||||
|
:lang(de) div.layerPanel div.labelButtonItemActive:after {
|
||||||
|
content: 'Text';
|
||||||
|
}
|
||||||
|
div.layerPanel div.labelButtonItemActive:after {
|
||||||
|
text-decoration: underline;
|
||||||
|
background: rgba(0,0,100,0.2);
|
||||||
|
}
|
||||||
|
div.layerPanel div.aerialButtonItemInactive:after,
|
||||||
|
div.layerPanel div.aerialButtonItemActive:after {
|
||||||
|
content: 'Aerial';
|
||||||
|
border-radius: 5px 0 0 5px;
|
||||||
|
}
|
||||||
|
:lang(de) div.layerPanel div.aerialButtonItemInactive:after,
|
||||||
|
:lang(de) div.layerPanel div.aerialButtonItemActive:after {
|
||||||
|
content: 'Luftbild';
|
||||||
|
}
|
||||||
|
div.layerPanel div.aerialButtonItemActive:after {
|
||||||
|
text-decoration: underline;
|
||||||
|
background: rgba(0,0,100,0.2);
|
||||||
|
}
|
||||||
|
div.layerPanel div.mapButtonItemInactive:after,
|
||||||
|
div.layerPanel div.mapButtonItemActive:after {
|
||||||
|
content: 'Map';
|
||||||
|
border-radius: 0 5px 5px 0;
|
||||||
|
}
|
||||||
|
:lang(de) div.layerPanel div.mapButtonItemInactive:after,
|
||||||
|
:lang(de) div.layerPanel div.mapButtonItemActive:after {
|
||||||
|
content: 'Karte';
|
||||||
|
}
|
||||||
|
div.layerPanel div.mapButtonItemActive:after {
|
||||||
|
text-decoration: underline;
|
||||||
|
background: rgba(0,0,100,0.2);
|
||||||
|
}
|
||||||
|
div.layerPanel div.mapButtonItemInactive,
|
||||||
|
div.layerPanel div.mapButtonItemActive {
|
||||||
|
margin-left: 1px;
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<title>City of Vienna WMTS with REST Encoding and Geolocate</title>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
|
||||||
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||||
|
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
||||||
|
<link rel="stylesheet" href="mobile-wmts-vienna.css" type="text/css">
|
||||||
|
<script src="../lib/OpenLayers.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1 id="title">City of Vienna WMTS for Desktop and Mobile Devices</h1>
|
||||||
|
<div id="tags">
|
||||||
|
mobile, vienna, ogdwien, rest, restful, wmts, geolocate, permalink
|
||||||
|
</div>
|
||||||
|
<p id="shortdesc">
|
||||||
|
A full-screen map for both desktop and mobile devices. Uses
|
||||||
|
language dependent CSS content and the WMTSCapabilities format to
|
||||||
|
retrieve layers from the ogdwien open data initiative of the City
|
||||||
|
of Vienna. Also has a lightweight custom anchor permalink
|
||||||
|
functionality and uses the Geolocate control.
|
||||||
|
</p>
|
||||||
|
<div id="map"></div>
|
||||||
|
<script src="mobile-wmts-vienna.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,230 @@
|
|||||||
|
var map;
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
OpenLayers.ProxyHost = "proxy.cgi?url=";
|
||||||
|
|
||||||
|
// Set document language for css content
|
||||||
|
document.documentElement.lang = (navigator.userLanguage || navigator.language).split("-")[0];
|
||||||
|
|
||||||
|
// A panel for switching between Aerial and Map, and for turning labels
|
||||||
|
// on and off.
|
||||||
|
var layerPanel = new OpenLayers.Control.Panel({
|
||||||
|
displayClass: "layerPanel",
|
||||||
|
autoActivate: true
|
||||||
|
});
|
||||||
|
var aerialButton = new OpenLayers.Control({
|
||||||
|
type: OpenLayers.Control.TYPE_TOOL,
|
||||||
|
displayClass: "aerialButton",
|
||||||
|
eventListeners: {
|
||||||
|
activate: function() {
|
||||||
|
if (aerial) {map.setBaseLayer(aerial);}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var mapButton = new OpenLayers.Control({
|
||||||
|
type: OpenLayers.Control.TYPE_TOOL,
|
||||||
|
displayClass: "mapButton",
|
||||||
|
eventListeners: {
|
||||||
|
activate: function() {
|
||||||
|
if (fmzk) {map.setBaseLayer(fmzk);}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var labelButton = new OpenLayers.Control({
|
||||||
|
type: OpenLayers.Control.TYPE_TOGGLE,
|
||||||
|
displayClass: "labelButton",
|
||||||
|
eventListeners: {
|
||||||
|
activate: function() {
|
||||||
|
if (labels) {labels.setVisibility(true);}
|
||||||
|
},
|
||||||
|
deactivate: function() {
|
||||||
|
if (labels) {labels.setVisibility(false);}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
layerPanel.addControls([aerialButton, mapButton, labelButton]);
|
||||||
|
|
||||||
|
var zoomPanel = new OpenLayers.Control.ZoomPanel();
|
||||||
|
|
||||||
|
// Geolocate control for the Locate button - the locationupdated handler
|
||||||
|
// draws a cross at the location and a circle showing the accuracy radius.
|
||||||
|
zoomPanel.addControls([
|
||||||
|
new OpenLayers.Control.Geolocate({
|
||||||
|
type: OpenLayers.Control.TYPE_TOGGLE,
|
||||||
|
geolocationOptions: {
|
||||||
|
enableHighAccuracy: false,
|
||||||
|
maximumAge: 0,
|
||||||
|
timeout: 7000
|
||||||
|
},
|
||||||
|
eventListeners: {
|
||||||
|
activate: function() {
|
||||||
|
map.addLayer(vector);
|
||||||
|
},
|
||||||
|
deactivate: function() {
|
||||||
|
map.removeLayer(vector);
|
||||||
|
vector.removeAllFeatures();
|
||||||
|
},
|
||||||
|
locationupdated: function(e) {
|
||||||
|
vector.removeAllFeatures();
|
||||||
|
vector.addFeatures([
|
||||||
|
new OpenLayers.Feature.Vector(e.point, null, {
|
||||||
|
graphicName: 'cross',
|
||||||
|
strokeColor: '#f00',
|
||||||
|
strokeWidth: 2,
|
||||||
|
fillOpacity: 0,
|
||||||
|
pointRadius: 10
|
||||||
|
}),
|
||||||
|
new OpenLayers.Feature.Vector(
|
||||||
|
OpenLayers.Geometry.Polygon.createRegularPolygon(
|
||||||
|
new OpenLayers.Geometry.Point(e.point.x, e.point.y),
|
||||||
|
e.position.coords.accuracy / 2, 50, 0
|
||||||
|
), null, {
|
||||||
|
fillOpacity: 0.1,
|
||||||
|
fillColor: '#000',
|
||||||
|
strokeColor: '#f00',
|
||||||
|
strokeOpacity: 0.6
|
||||||
|
}
|
||||||
|
)
|
||||||
|
]);
|
||||||
|
map.zoomToExtent(vector.getDataExtent());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Map with navigation controls optimized for touch devices
|
||||||
|
map = new OpenLayers.Map({
|
||||||
|
div: "map",
|
||||||
|
theme: null,
|
||||||
|
projection: "EPSG:3857",
|
||||||
|
units: "m",
|
||||||
|
maxExtent: new OpenLayers.Bounds(
|
||||||
|
-20037508.34, -20037508.34, 20037508.34, 20037508.34
|
||||||
|
),
|
||||||
|
maxResolution: 156543.0339,
|
||||||
|
numZoomLevels: 20,
|
||||||
|
controls: [
|
||||||
|
new OpenLayers.Control.TouchNavigation({
|
||||||
|
mouseWheelOptions: {
|
||||||
|
cumulative: false,
|
||||||
|
interval: 20
|
||||||
|
},
|
||||||
|
dragPanOptions: {
|
||||||
|
enableKinetic: {
|
||||||
|
deceleration: 0.02
|
||||||
|
}
|
||||||
|
},
|
||||||
|
zoomBoxEnabled: false
|
||||||
|
}),
|
||||||
|
new OpenLayers.Control.Attribution(),
|
||||||
|
zoomPanel,
|
||||||
|
layerPanel
|
||||||
|
],
|
||||||
|
eventListeners: {
|
||||||
|
moveend: function() {
|
||||||
|
// update anchor for permalinks
|
||||||
|
var ctr = map.getCenter();
|
||||||
|
window.location.hash = "x="+ctr.lon+"&y="+ctr.lat+"&z="+map.getZoom();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
layerPanel.activateControl(mapButton);
|
||||||
|
layerPanel.activateControl(labelButton);
|
||||||
|
|
||||||
|
// Vector layer for the location cross and circle
|
||||||
|
var vector = new OpenLayers.Layer.Vector("Vector Layer");
|
||||||
|
|
||||||
|
// The WMTS layers we're going to add
|
||||||
|
var fmzk, aerial, labels;
|
||||||
|
|
||||||
|
// The WMTSCapabilities format and the default options for the layers
|
||||||
|
var format = new OpenLayers.Format.WMTSCapabilities(), defaults = {
|
||||||
|
requestEncoding: "REST",
|
||||||
|
matrixSet: "google3857",
|
||||||
|
transitionEffect: "resize",
|
||||||
|
tileLoadingDelay: 0,
|
||||||
|
attribution: 'Datenquelle: Stadt Wien - <a href="http://data.wien.gv.at">data.wien.gv.at</a>'
|
||||||
|
};
|
||||||
|
|
||||||
|
// Request capabilities and create layers
|
||||||
|
OpenLayers.Request.GET({
|
||||||
|
url: "http://maps.wien.gv.at/wmts/1.0.0/WMTSCapabilities.xml",
|
||||||
|
success: function(request) {
|
||||||
|
var doc = request.responseText,
|
||||||
|
caps = format.read(doc);
|
||||||
|
fmzk = format.createLayer(caps, OpenLayers.Util.applyDefaults(
|
||||||
|
{layer:"fmzk", requestEncoding:"REST"}, defaults
|
||||||
|
));
|
||||||
|
aerial = format.createLayer(caps, OpenLayers.Util.applyDefaults(
|
||||||
|
{layer:"lb", requestEncoding:"REST"}, defaults
|
||||||
|
));
|
||||||
|
labels = format.createLayer(caps, OpenLayers.Util.applyDefaults(
|
||||||
|
{layer:"beschriftung", requestEncoding:"REST", isBaseLayer: false},
|
||||||
|
defaults
|
||||||
|
));
|
||||||
|
map.addLayers([fmzk, aerial, labels]);
|
||||||
|
|
||||||
|
// zoom to initial extent or restore position from permalink
|
||||||
|
var extent = fmzk.tileFullExtent,
|
||||||
|
ctr = extent.getCenterLonLat(),
|
||||||
|
zoom = map.getZoomForExtent(extent, true),
|
||||||
|
params = OpenLayers.Util.getParameters("?"+window.location.hash.substr(1));
|
||||||
|
OpenLayers.Util.applyDefaults(params, {x:ctr.lon, y:ctr.lat, z:zoom});
|
||||||
|
map.setCenter(new OpenLayers.LonLat(params.x, params.y), params.z);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})();
|
||||||
|
|
||||||
|
// Reliably hide the address bar on Android and iOS devices. From
|
||||||
|
// http://blog.nateps.com/how-to-hide-the-address-bar-in-a-full-screen
|
||||||
|
(function() {
|
||||||
|
var page = document.getElementById("map"),
|
||||||
|
ua = navigator.userAgent,
|
||||||
|
iphone = ~ua.indexOf('iPhone') || ~ua.indexOf('iPod'),
|
||||||
|
ipad = ~ua.indexOf('iPad'),
|
||||||
|
ios = iphone || ipad,
|
||||||
|
// Detect if this is running as a fullscreen app from the homescreen
|
||||||
|
fullscreen = window.navigator.standalone,
|
||||||
|
android = ~ua.indexOf('Android'),
|
||||||
|
lastWidth = 0;
|
||||||
|
|
||||||
|
if (android) {
|
||||||
|
// Android's browser adds the scroll position to the innerHeight, just to
|
||||||
|
// make this really fucking difficult. Thus, once we are scrolled, the
|
||||||
|
// page height value needs to be corrected in case the page is loaded
|
||||||
|
// when already scrolled down. The pageYOffset is of no use, since it always
|
||||||
|
// returns 0 while the address bar is displayed.
|
||||||
|
window.onscroll = function() {
|
||||||
|
page.style.height = window.innerHeight + 'px';
|
||||||
|
};
|
||||||
|
}
|
||||||
|
var setupScroll = window.onload = function() {
|
||||||
|
// Start out by adding the height of the location bar to the width, so that
|
||||||
|
// we can scroll past it
|
||||||
|
if (ios) {
|
||||||
|
// iOS reliably returns the innerWindow size for documentElement.clientHeight
|
||||||
|
// but window.innerHeight is sometimes the wrong value after rotating
|
||||||
|
// the orientation
|
||||||
|
var height = document.documentElement.clientHeight;
|
||||||
|
// Only add extra padding to the height on iphone / ipod, since the ipad
|
||||||
|
// browser doesn't scroll off the location bar.
|
||||||
|
if (iphone && !fullscreen) height += 60;
|
||||||
|
page.style.height = height + 'px';
|
||||||
|
} else if (android) {
|
||||||
|
// The stock Android browser has a location bar height of 56 pixels, but
|
||||||
|
// this very likely could be broken in other Android browsers.
|
||||||
|
page.style.height = (window.innerHeight + 56) + 'px';
|
||||||
|
}
|
||||||
|
// Scroll after a timeout, since iOS will scroll to the top of the page
|
||||||
|
// after it fires the onload event
|
||||||
|
setTimeout(scrollTo, 0, 0, 1);
|
||||||
|
};
|
||||||
|
(window.onresize = function() {
|
||||||
|
var pageWidth = page.offsetWidth;
|
||||||
|
// Android doesn't support orientation change, so check for when the width
|
||||||
|
// changes to figure out when the orientation changes
|
||||||
|
if (lastWidth == pageWidth) return;
|
||||||
|
lastWidth = pageWidth;
|
||||||
|
setupScroll();
|
||||||
|
})();
|
||||||
|
})();
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
|
||||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||||
<title>OpenLayers Point Grid Example</title>
|
<title>OpenLayers Point Grid Example</title>
|
||||||
<link rel="stylesheet" href="../theme/default/style.css" type="text/css">
|
<link rel="stylesheet" href="../theme/default/style.css" type="text/css">
|
||||||
|
|||||||
+2
-1
@@ -21,7 +21,8 @@ allowedHosts = ['www.openlayers.org', 'openlayers.org',
|
|||||||
'sigma.openplans.org', 'demo.opengeo.org',
|
'sigma.openplans.org', 'demo.opengeo.org',
|
||||||
'www.openstreetmap.org', 'sample.azavea.com',
|
'www.openstreetmap.org', 'sample.azavea.com',
|
||||||
'v2.suite.opengeo.org', 'v-swe.uni-muenster.de:8080',
|
'v2.suite.opengeo.org', 'v-swe.uni-muenster.de:8080',
|
||||||
'vmap0.tiles.osgeo.org', 'www.openrouteservice.org']
|
'vmap0.tiles.osgeo.org', 'www.openrouteservice.org',
|
||||||
|
'maps.wien.gv.at']
|
||||||
|
|
||||||
method = os.environ["REQUEST_METHOD"]
|
method = os.environ["REQUEST_METHOD"]
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
|
||||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||||
<title>OpenLayers Snap Grid Example</title>
|
<title>OpenLayers Snap Grid Example</title>
|
||||||
<link rel="stylesheet" href="../theme/default/style.css" type="text/css">
|
<link rel="stylesheet" href="../theme/default/style.css" type="text/css">
|
||||||
|
|||||||
@@ -121,7 +121,6 @@
|
|||||||
"OpenLayers/Marker/Box.js",
|
"OpenLayers/Marker/Box.js",
|
||||||
"OpenLayers/Popup.js",
|
"OpenLayers/Popup.js",
|
||||||
"OpenLayers/Tile.js",
|
"OpenLayers/Tile.js",
|
||||||
"OpenLayers/Tile/BackBufferable.js",
|
|
||||||
"OpenLayers/Tile/Image.js",
|
"OpenLayers/Tile/Image.js",
|
||||||
"OpenLayers/Tile/Image/IFrame.js",
|
"OpenLayers/Tile/Image/IFrame.js",
|
||||||
"OpenLayers/Tile/WFS.js",
|
"OpenLayers/Tile/WFS.js",
|
||||||
|
|||||||
@@ -171,12 +171,24 @@ OpenLayers.Format.OWSCommon.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
|||||||
this.readChildNodes(node, dcp.http);
|
this.readChildNodes(node, dcp.http);
|
||||||
},
|
},
|
||||||
"Get": function(node, http) {
|
"Get": function(node, http) {
|
||||||
http.get = this.getAttributeNS(node,
|
if (!http.get) {
|
||||||
this.namespaces.xlink, "href");
|
http.get = [];
|
||||||
|
}
|
||||||
|
var obj = {
|
||||||
|
url: this.getAttributeNS(node, this.namespaces.xlink, "href")
|
||||||
|
};
|
||||||
|
this.readChildNodes(node, obj);
|
||||||
|
http.get.push(obj);
|
||||||
},
|
},
|
||||||
"Post": function(node, http) {
|
"Post": function(node, http) {
|
||||||
http.post = this.getAttributeNS(node,
|
if (!http.post) {
|
||||||
this.namespaces.xlink, "href");
|
http.post = [];
|
||||||
|
}
|
||||||
|
var obj = {
|
||||||
|
url: this.getAttributeNS(node, this.namespaces.xlink, "href")
|
||||||
|
};
|
||||||
|
this.readChildNodes(node, obj);
|
||||||
|
http.post.push(obj);
|
||||||
},
|
},
|
||||||
"Parameter": function(node, operation) {
|
"Parameter": function(node, operation) {
|
||||||
if (!operation.parameters) {
|
if (!operation.parameters) {
|
||||||
@@ -186,6 +198,14 @@ OpenLayers.Format.OWSCommon.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
|||||||
operation.parameters[name] = {};
|
operation.parameters[name] = {};
|
||||||
this.readChildNodes(node, operation.parameters[name]);
|
this.readChildNodes(node, operation.parameters[name]);
|
||||||
},
|
},
|
||||||
|
"Constraint": function(node, obj) {
|
||||||
|
if (!obj.constraints) {
|
||||||
|
obj.constraints = {};
|
||||||
|
}
|
||||||
|
var name = node.getAttribute("name");
|
||||||
|
obj.constraints[name] = {};
|
||||||
|
this.readChildNodes(node, obj.constraints[name]);
|
||||||
|
},
|
||||||
"Value": function(node, allowedValues) {
|
"Value": function(node, allowedValues) {
|
||||||
allowedValues[this.getChildValue(node)] = true;
|
allowedValues[this.getChildValue(node)] = true;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -114,10 +114,13 @@ OpenLayers.Format.WMTSCapabilities = OpenLayers.Class(OpenLayers.Format.XML.Vers
|
|||||||
|
|
||||||
layer = new OpenLayers.Layer.WMTS(
|
layer = new OpenLayers.Layer.WMTS(
|
||||||
OpenLayers.Util.applyDefaults(config, {
|
OpenLayers.Util.applyDefaults(config, {
|
||||||
url: capabilities.operationsMetadata.GetTile.dcp.http.get,
|
url: config.requestEncoding === "REST" && layerDef.resourceUrl ?
|
||||||
|
layerDef.resourceUrl.tile.template :
|
||||||
|
capabilities.operationsMetadata.GetTile.dcp.http.get[0].url,
|
||||||
name: layerDef.title,
|
name: layerDef.title,
|
||||||
style: style.identifier,
|
style: style.identifier,
|
||||||
matrixIds: matrixSet.matrixIds
|
matrixIds: matrixSet.matrixIds,
|
||||||
|
tileFullExtent: matrixSet.bounds
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -314,13 +314,6 @@ OpenLayers.Layer = OpenLayers.Class({
|
|||||||
*/
|
*/
|
||||||
transitionEffect: null,
|
transitionEffect: null,
|
||||||
|
|
||||||
/**
|
|
||||||
* Property: SUPPORTED_TRANSITIONS
|
|
||||||
* {Array} An immutable (that means don't change it!) list of supported
|
|
||||||
* transitionEffect values.
|
|
||||||
*/
|
|
||||||
SUPPORTED_TRANSITIONS: ['resize'],
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Property: metadata
|
* Property: metadata
|
||||||
* {Object} This object can be used to store additional information on a
|
* {Object} This object can be used to store additional information on a
|
||||||
|
|||||||
@@ -111,6 +111,34 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
|
|||||||
*/
|
*/
|
||||||
timerId: null,
|
timerId: null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Property: backBuffer
|
||||||
|
* {DOMElement} The back buffer.
|
||||||
|
*/
|
||||||
|
backBuffer: null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Property: gridResolution
|
||||||
|
* {Number} The resolution of the current grid. Used for backbuffering.
|
||||||
|
* This property is updated each the grid is initialized.
|
||||||
|
*/
|
||||||
|
gridResolution: null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Property: backBufferResolution
|
||||||
|
* {Number} The resolution of the current back buffer. This property is
|
||||||
|
* updated each time a back buffer is created.
|
||||||
|
*/
|
||||||
|
backBufferResolution: null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Property: backBufferLonLat
|
||||||
|
* {Object} The top-left corner of the current back buffer. Includes lon
|
||||||
|
* and lat properties. This object is updated each time a back buffer
|
||||||
|
* is created.
|
||||||
|
*/
|
||||||
|
backBufferLonLat: null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor: OpenLayers.Layer.Grid
|
* Constructor: OpenLayers.Layer.Grid
|
||||||
* Create a new grid layer
|
* Create a new grid layer
|
||||||
@@ -159,6 +187,9 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
|
|||||||
*/
|
*/
|
||||||
destroy: function() {
|
destroy: function() {
|
||||||
this.clearGrid();
|
this.clearGrid();
|
||||||
|
// clearGrid should remove any back buffer from the layer,
|
||||||
|
// so no need to call removeBackBuffer here
|
||||||
|
|
||||||
this.grid = null;
|
this.grid = null;
|
||||||
this.tileSize = null;
|
this.tileSize = null;
|
||||||
OpenLayers.Layer.HTTPRequest.prototype.destroy.apply(this, arguments);
|
OpenLayers.Layer.HTTPRequest.prototype.destroy.apply(this, arguments);
|
||||||
@@ -180,6 +211,7 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.grid = [];
|
this.grid = [];
|
||||||
|
this.gridResolution = null;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -212,6 +244,7 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
|
|||||||
|
|
||||||
// we do not want to copy reference to grid, so we make a new array
|
// we do not want to copy reference to grid, so we make a new array
|
||||||
obj.grid = [];
|
obj.grid = [];
|
||||||
|
obj.gridResolution = null;
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
},
|
},
|
||||||
@@ -241,13 +274,36 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
|
|||||||
// total bounds of the tiles
|
// total bounds of the tiles
|
||||||
var tilesBounds = this.getTilesBounds();
|
var tilesBounds = this.getTilesBounds();
|
||||||
|
|
||||||
|
// the new map resolution
|
||||||
|
var resolution = this.map.getResolution();
|
||||||
|
|
||||||
|
// the server-supported resolution for the new map resolution
|
||||||
|
var serverResolution = this.getServerResolution(resolution);
|
||||||
|
|
||||||
if (this.singleTile) {
|
if (this.singleTile) {
|
||||||
|
|
||||||
// We want to redraw whenever even the slightest part of the
|
// We want to redraw whenever even the slightest part of the
|
||||||
// current bounds is not contained by our tile.
|
// current bounds is not contained by our tile.
|
||||||
// (thus, we do not specify partial -- its default is false)
|
// (thus, we do not specify partial -- its default is false)
|
||||||
|
|
||||||
if ( forceReTile ||
|
if ( forceReTile ||
|
||||||
(!dragging && !tilesBounds.containsBounds(bounds))) {
|
(!dragging && !tilesBounds.containsBounds(bounds))) {
|
||||||
|
|
||||||
|
// In single tile mode with no transition effect, we insert
|
||||||
|
// a non-scaled backbuffer when the layer is moved. But if
|
||||||
|
// a zoom occurs right after a move, i.e. before the new
|
||||||
|
// image is received, we need to remove the backbuffer, or
|
||||||
|
// an ill-positioned image will be visible during the zoom
|
||||||
|
// transition.
|
||||||
|
|
||||||
|
if(zoomChanged && this.transitionEffect !== 'resize') {
|
||||||
|
this.removeBackBuffer();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!zoomChanged || this.transitionEffect === 'resize') {
|
||||||
|
this.applyBackBuffer(serverResolution);
|
||||||
|
}
|
||||||
|
|
||||||
this.initSingleTile(bounds);
|
this.initSingleTile(bounds);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -260,10 +316,6 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
|
|||||||
forceReTile = forceReTile ||
|
forceReTile = forceReTile ||
|
||||||
!tilesBounds.containsBounds(bounds, true);
|
!tilesBounds.containsBounds(bounds, true);
|
||||||
|
|
||||||
var resolution = this.map.getResolution();
|
|
||||||
var serverResolution =
|
|
||||||
this.getServerResolution(resolution);
|
|
||||||
|
|
||||||
if(resolution !== serverResolution) {
|
if(resolution !== serverResolution) {
|
||||||
bounds = this.map.calculateBounds(null, serverResolution);
|
bounds = this.map.calculateBounds(null, serverResolution);
|
||||||
if(forceReTile) {
|
if(forceReTile) {
|
||||||
@@ -281,6 +333,9 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(forceReTile) {
|
if(forceReTile) {
|
||||||
|
if(zoomChanged && this.transitionEffect === 'resize') {
|
||||||
|
this.applyBackBuffer(serverResolution);
|
||||||
|
}
|
||||||
this.initGriddedTiles(bounds);
|
this.initGriddedTiles(bounds);
|
||||||
} else {
|
} else {
|
||||||
this.scheduleMoveGriddedTiles();
|
this.scheduleMoveGriddedTiles();
|
||||||
@@ -306,7 +361,7 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
|
|||||||
if(this.serverResolutions &&
|
if(this.serverResolutions &&
|
||||||
OpenLayers.Util.indexOf(this.serverResolutions, resolution) === -1) {
|
OpenLayers.Util.indexOf(this.serverResolutions, resolution) === -1) {
|
||||||
var i, serverResolution;
|
var i, serverResolution;
|
||||||
for(var i=this.serverResolutions.length-1; i>= 0; i--) {
|
for(i=this.serverResolutions.length-1; i>= 0; i--) {
|
||||||
serverResolution = this.serverResolutions[i];
|
serverResolution = this.serverResolutions[i];
|
||||||
if(serverResolution > resolution) {
|
if(serverResolution > resolution) {
|
||||||
resolution = serverResolution;
|
resolution = serverResolution;
|
||||||
@@ -352,14 +407,13 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
|
|||||||
var size = this.map.getSize();
|
var size = this.map.getSize();
|
||||||
var lcX = parseInt(this.map.layerContainerDiv.style.left, 10);
|
var lcX = parseInt(this.map.layerContainerDiv.style.left, 10);
|
||||||
var lcY = parseInt(this.map.layerContainerDiv.style.top, 10);
|
var lcY = parseInt(this.map.layerContainerDiv.style.top, 10);
|
||||||
var x = (lcX - (size.w / 2.)) * (scale - 1);
|
var x = (lcX - (size.w / 2.0)) * (scale - 1);
|
||||||
var y = (lcY - (size.h / 2.)) * (scale - 1);
|
var y = (lcY - (size.h / 2.0)) * (scale - 1);
|
||||||
|
|
||||||
this.div.style.left = x + '%';
|
this.div.style.left = x + '%';
|
||||||
this.div.style.top = y + '%';
|
this.div.style.top = y + '%';
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method: getResolutionScale
|
* Method: getResolutionScale
|
||||||
* Return the value by which the layer is currently scaled.
|
* Return the value by which the layer is currently scaled.
|
||||||
@@ -371,6 +425,96 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
|
|||||||
return parseInt(this.div.style.width, 10) / 100;
|
return parseInt(this.div.style.width, 10) / 100;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method: applyBackBuffer
|
||||||
|
* Create, insert, scale and position a back buffer for the layer.
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
* resolution - {Number} The resolution to transition to.
|
||||||
|
*/
|
||||||
|
applyBackBuffer: function(resolution) {
|
||||||
|
var backBuffer = this.backBuffer;
|
||||||
|
if(!backBuffer) {
|
||||||
|
backBuffer = this.createBackBuffer();
|
||||||
|
if(!backBuffer) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.div.insertBefore(backBuffer, this.div.firstChild);
|
||||||
|
this.backBuffer = backBuffer;
|
||||||
|
|
||||||
|
// set some information in the instance for subsequent
|
||||||
|
// calls to applyBackBuffer where the same back buffer
|
||||||
|
// is reused
|
||||||
|
var topLeftTileBounds = this.grid[0][0].bounds;
|
||||||
|
this.backBufferLonLat = {
|
||||||
|
lon: topLeftTileBounds.left,
|
||||||
|
lat: topLeftTileBounds.top
|
||||||
|
};
|
||||||
|
this.backBufferResolution = this.gridResolution;
|
||||||
|
}
|
||||||
|
|
||||||
|
var style = backBuffer.style;
|
||||||
|
|
||||||
|
// scale the back buffer
|
||||||
|
var ratio = this.backBufferResolution / resolution;
|
||||||
|
style.width = 100 * ratio + '%';
|
||||||
|
style.height = 100 * ratio + '%';
|
||||||
|
|
||||||
|
// and position it (based on the grid's top-left corner)
|
||||||
|
var position = this.getViewPortPxFromLonLat(
|
||||||
|
this.backBufferLonLat, resolution);
|
||||||
|
var leftOffset = parseInt(this.map.layerContainerDiv.style.left, 10);
|
||||||
|
var topOffset = parseInt(this.map.layerContainerDiv.style.top, 10);
|
||||||
|
backBuffer.style.left = (position.x - leftOffset) + '%';
|
||||||
|
backBuffer.style.top = (position.y - topOffset) + '%';
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method: createBackBuffer
|
||||||
|
* Create a back buffer.
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* {DOMElement} The DOM element for the back buffer, undefined if the
|
||||||
|
* grid isn't initialized yet.
|
||||||
|
*/
|
||||||
|
createBackBuffer: function() {
|
||||||
|
var backBuffer;
|
||||||
|
if(this.grid.length > 0) {
|
||||||
|
backBuffer = document.createElement('div');
|
||||||
|
backBuffer.id = this.div.id + '_bb';
|
||||||
|
backBuffer.className = 'olBackBuffer';
|
||||||
|
backBuffer.style.position = 'absolute';
|
||||||
|
backBuffer.style.width = '100%';
|
||||||
|
backBuffer.style.height = '100%';
|
||||||
|
for(var i=0, lenI=this.grid.length; i<lenI; i++) {
|
||||||
|
for(var j=0, lenJ=this.grid[i].length; j<lenJ; j++) {
|
||||||
|
var tile = this.grid[i][j].createBackBuffer();
|
||||||
|
if(!tile) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// to be able to correctly position the back buffer we
|
||||||
|
// place the tiles grid at (0, 0) in the back buffer
|
||||||
|
tile.style.top = (i * this.tileSize.h) + '%';
|
||||||
|
tile.style.left = (j * this.tileSize.w) + '%';
|
||||||
|
backBuffer.appendChild(tile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return backBuffer;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method: removeBackBuffer
|
||||||
|
* Remove back buffer from DOM.
|
||||||
|
*/
|
||||||
|
removeBackBuffer: function() {
|
||||||
|
if(this.backBuffer && this.backBuffer.parentNode) {
|
||||||
|
this.div.removeChild(this.backBuffer);
|
||||||
|
this.backBuffer = null;
|
||||||
|
this.backBufferResolution = null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method: moveByPx
|
* Method: moveByPx
|
||||||
* Move the layer based on pixel vector.
|
* Move the layer based on pixel vector.
|
||||||
@@ -500,6 +644,9 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
|
|||||||
|
|
||||||
//remove all but our single tile
|
//remove all but our single tile
|
||||||
this.removeExcessTiles(1,1);
|
this.removeExcessTiles(1,1);
|
||||||
|
|
||||||
|
// store the resolution of the grid
|
||||||
|
this.gridResolution = this.getServerResolution();
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -660,6 +807,9 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
|
|||||||
//shave off exceess rows and colums
|
//shave off exceess rows and colums
|
||||||
this.removeExcessTiles(rowidx, colidx);
|
this.removeExcessTiles(rowidx, colidx);
|
||||||
|
|
||||||
|
// store the resolution of the grid
|
||||||
|
this.gridResolution = this.getServerResolution();
|
||||||
|
|
||||||
//now actually draw the tiles
|
//now actually draw the tiles
|
||||||
this.spiralTileLoad();
|
this.spiralTileLoad();
|
||||||
},
|
},
|
||||||
@@ -790,6 +940,7 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
|
|||||||
//if that was the last tile, then trigger a 'loadend' on the layer
|
//if that was the last tile, then trigger a 'loadend' on the layer
|
||||||
if (this.numLoadingTiles == 0) {
|
if (this.numLoadingTiles == 0) {
|
||||||
this.events.triggerEvent("loadend");
|
this.events.triggerEvent("loadend");
|
||||||
|
this.removeBackBuffer();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
tile.events.register("loadend", this, tile.onLoadEnd);
|
tile.events.register("loadend", this, tile.onLoadEnd);
|
||||||
|
|||||||
@@ -38,7 +38,10 @@ OpenLayers.Layer.WMTS = OpenLayers.Class(OpenLayers.Layer.Grid, {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* APIProperty: url
|
* APIProperty: url
|
||||||
* {String} The base URL for the WMTS service. Must be provided.
|
* {String|Array(String)} The base URL or request URL template for the WMTS
|
||||||
|
* service. Must be provided. Array is only supported for base URLs, not
|
||||||
|
* for request URL templates. URL templates are only supported for
|
||||||
|
* REST <requestEncoding>.
|
||||||
*/
|
*/
|
||||||
url: null,
|
url: null,
|
||||||
|
|
||||||
@@ -416,39 +419,59 @@ OpenLayers.Layer.WMTS = OpenLayers.Class(OpenLayers.Layer.Grid, {
|
|||||||
var center = bounds.getCenterLonLat();
|
var center = bounds.getCenterLonLat();
|
||||||
var info = this.getTileInfo(center);
|
var info = this.getTileInfo(center);
|
||||||
var matrixId = this.matrix.identifier;
|
var matrixId = this.matrix.identifier;
|
||||||
|
var dimensions = this.dimensions, params;
|
||||||
|
|
||||||
if (this.requestEncoding.toUpperCase() === "REST") {
|
if (this.requestEncoding.toUpperCase() === "REST") {
|
||||||
|
params = this.params;
|
||||||
// include 'version', 'layer' and 'style' in tile resource url
|
if (typeof this.url === "string" && this.url.indexOf("{") !== -1) {
|
||||||
var path = this.version + "/" + this.layer + "/" + this.style + "/";
|
var template = this.url.replace(/\{/g, "${");
|
||||||
|
var context = {
|
||||||
// append optional dimension path elements
|
// spec does not make clear if capital S or not
|
||||||
if (this.dimensions) {
|
style: this.style, Style: this.style,
|
||||||
for (var i=0; i<this.dimensions.length; i++) {
|
TileMatrixSet: this.matrixSet,
|
||||||
if (this.params[this.dimensions[i]]) {
|
TileMatrix: this.matrix.identifier,
|
||||||
path = path + this.params[this.dimensions[i]] + "/";
|
TileRow: info.row,
|
||||||
|
TileCol: info.col
|
||||||
|
};
|
||||||
|
if (dimensions) {
|
||||||
|
var dimension, i;
|
||||||
|
for (i=dimensions.length-1; i>=0; --i) {
|
||||||
|
dimension = dimensions[i];
|
||||||
|
context[dimension] = params[dimension.toUpperCase()];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
url = OpenLayers.String.format(template, context);
|
||||||
|
|
||||||
// append other required path elements
|
|
||||||
path = path + this.matrixSet + "/" + this.matrix.identifier +
|
|
||||||
"/" + info.row + "/" + info.col + "." + this.formatSuffix;
|
|
||||||
|
|
||||||
if (OpenLayers.Util.isArray(this.url)) {
|
|
||||||
url = this.selectUrl(path, this.url);
|
|
||||||
} else {
|
} else {
|
||||||
url = this.url;
|
// include 'version', 'layer' and 'style' in tile resource url
|
||||||
}
|
var path = this.version + "/" + this.layer + "/" + this.style + "/";
|
||||||
if (!url.match(/\/$/)) {
|
|
||||||
url = url + "/";
|
|
||||||
}
|
|
||||||
url = url + path;
|
|
||||||
|
|
||||||
|
// append optional dimension path elements
|
||||||
|
if (dimensions) {
|
||||||
|
for (var i=0; i<dimensions.length; i++) {
|
||||||
|
if (params[dimensions[i]]) {
|
||||||
|
path = path + params[dimensions[i]] + "/";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// append other required path elements
|
||||||
|
path = path + this.matrixSet + "/" + this.matrix.identifier +
|
||||||
|
"/" + info.row + "/" + info.col + "." + this.formatSuffix;
|
||||||
|
|
||||||
|
if (OpenLayers.Util.isArray(this.url)) {
|
||||||
|
url = this.selectUrl(path, this.url);
|
||||||
|
} else {
|
||||||
|
url = this.url;
|
||||||
|
}
|
||||||
|
if (!url.match(/\/$/)) {
|
||||||
|
url = url + "/";
|
||||||
|
}
|
||||||
|
url = url + path;
|
||||||
|
}
|
||||||
} else if (this.requestEncoding.toUpperCase() === "KVP") {
|
} else if (this.requestEncoding.toUpperCase() === "KVP") {
|
||||||
|
|
||||||
// assemble all required parameters
|
// assemble all required parameters
|
||||||
var params = {
|
params = {
|
||||||
SERVICE: "WMTS",
|
SERVICE: "WMTS",
|
||||||
REQUEST: "GetTile",
|
REQUEST: "GetTile",
|
||||||
VERSION: this.version,
|
VERSION: this.version,
|
||||||
|
|||||||
@@ -513,7 +513,7 @@ OpenLayers.Popup = OpenLayers.Class({
|
|||||||
this.contentDiv.innerHTML +
|
this.contentDiv.innerHTML +
|
||||||
"</div>";
|
"</div>";
|
||||||
|
|
||||||
var containerElement = (this.map) ? this.map.layerContainerDiv
|
var containerElement = (this.map) ? this.map.div
|
||||||
: document.body;
|
: document.body;
|
||||||
var realSize = OpenLayers.Util.getRenderedDimensions(
|
var realSize = OpenLayers.Util.getRenderedDimensions(
|
||||||
preparedHTML, null, {
|
preparedHTML, null, {
|
||||||
|
|||||||
@@ -1,218 +0,0 @@
|
|||||||
/* Copyright (c) 2006-2011 by OpenLayers Contributors (see authors.txt for
|
|
||||||
* full list of contributors). 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.js
|
|
||||||
* @requires OpenLayers/Util.js
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class: OpenLayers.Tile.BackBufferable
|
|
||||||
* Base class for tiles that can have backbuffers during transitions. Do not
|
|
||||||
* create instances of this class.
|
|
||||||
*/
|
|
||||||
OpenLayers.Tile.BackBufferable = OpenLayers.Class(OpenLayers.Tile, {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Property: backBufferMode
|
|
||||||
* {Integer} Bitmap: 0 for no backbuffering at all, 1 for singleTile
|
|
||||||
* layers, 2 for transition effect set, 3 for both.
|
|
||||||
*/
|
|
||||||
backBufferMode: null,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Property: backBufferData
|
|
||||||
* {Object} Object including the necessary data for the back
|
|
||||||
* buffer.
|
|
||||||
*
|
|
||||||
* The object includes three properties:
|
|
||||||
* tile - {DOMElement} The DOM element for the back buffer.
|
|
||||||
* bounds - {<OpenLayers.Bounds>} The bounds of the tile to back.
|
|
||||||
* resolution - {Number} The resolution of the tile to back.
|
|
||||||
*/
|
|
||||||
backBufferData: null,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method: initialize
|
|
||||||
* Determines the backBuffer mode and registers events
|
|
||||||
*/
|
|
||||||
initialize: function() {
|
|
||||||
OpenLayers.Tile.prototype.initialize.apply(this, arguments);
|
|
||||||
|
|
||||||
var transitionSupported = OpenLayers.Util.indexOf(
|
|
||||||
this.layer.SUPPORTED_TRANSITIONS,
|
|
||||||
this.layer.transitionEffect) != -1;
|
|
||||||
this.backBufferMode = (this.layer.singleTile && 1) |
|
|
||||||
(transitionSupported && 2);
|
|
||||||
|
|
||||||
this.backBufferData = {};
|
|
||||||
if (!this.size) {
|
|
||||||
this.size = new OpenLayers.Size(256, 256);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method: draw
|
|
||||||
* Check that a tile should be drawn, and draw it.
|
|
||||||
*
|
|
||||||
* Returns:
|
|
||||||
* {Boolean} Was a tile drawn?
|
|
||||||
*/
|
|
||||||
draw: function() {
|
|
||||||
var draw = OpenLayers.Tile.prototype.shouldDraw.apply(this, arguments);
|
|
||||||
if (draw) {
|
|
||||||
this.updateBackBuffer();
|
|
||||||
}
|
|
||||||
this.clear();
|
|
||||||
if (!draw) {
|
|
||||||
this.resetBackBuffer();
|
|
||||||
};
|
|
||||||
return draw;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method: getTile
|
|
||||||
* Get the tile's markup. To be implemented by subclasses.
|
|
||||||
*
|
|
||||||
* Returns:
|
|
||||||
* {DOMElement} The tile's markup
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method: createBackBuffer
|
|
||||||
* Create a copy of this tile's markup for the back buffer. To be
|
|
||||||
* implemented by subclasses.
|
|
||||||
*
|
|
||||||
* Returns:
|
|
||||||
* {DOMElement} A copy of the tile's markup.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method: getTileResolution
|
|
||||||
* Get the tile's actual resolution.
|
|
||||||
*
|
|
||||||
* Returns:
|
|
||||||
* {Number}
|
|
||||||
*/
|
|
||||||
getTileResolution: function() {
|
|
||||||
var layer = this.layer,
|
|
||||||
map = layer.map,
|
|
||||||
mapResolution = map.getResolution();
|
|
||||||
return layer.getServerResolution ?
|
|
||||||
layer.getServerResolution(mapResolution) :
|
|
||||||
mapResolution;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method: setBackBufferData
|
|
||||||
* Stores the current bounds and resolution, for offset and ratio
|
|
||||||
* calculations
|
|
||||||
*/
|
|
||||||
setBackBufferData: function() {
|
|
||||||
this.backBufferData = OpenLayers.Util.extend(this.backBufferData, {
|
|
||||||
bounds: this.bounds,
|
|
||||||
resolution: this.getTileResolution()
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method: updateBackBuffer
|
|
||||||
* Update the <backBufferData>, and return a new or reposition the
|
|
||||||
* backBuffer. When a backbuffer is returned, the tile's markup is not
|
|
||||||
* available any more.
|
|
||||||
*
|
|
||||||
* Returns:
|
|
||||||
* {HTMLDivElement} the tile's markup in a cloned element, or undefined if
|
|
||||||
* no backbuffer is currently available or needed
|
|
||||||
*/
|
|
||||||
updateBackBuffer: function() {
|
|
||||||
var layer = this.layer, map = layer.map,
|
|
||||||
backBufferMode = this.backBufferMode,
|
|
||||||
data = this.backBufferData,
|
|
||||||
tile = this.getTile(),
|
|
||||||
backBuffer = data.tile,
|
|
||||||
prevResolution = data.resolution,
|
|
||||||
nextResolution = this.getTileResolution(),
|
|
||||||
ratio = prevResolution ? prevResolution / nextResolution : 1,
|
|
||||||
|
|
||||||
// Cases where we don't position and return a back buffer, but only
|
|
||||||
// update backBufferData and return undefined:
|
|
||||||
// (1) current ratio and backBufferMode dont't require a backbuffer
|
|
||||||
notNeeded = !(ratio == 1 ? backBufferMode & 1 : backBufferMode & 2),
|
|
||||||
// (2) the tile is not appended to the layer's div
|
|
||||||
noParent = tile && tile.parentNode !== layer.div,
|
|
||||||
// (3) we don't have a tile available that we could use as buffer
|
|
||||||
noTile = !(tile && tile.childNodes.length > 0),
|
|
||||||
// (4) no backbuffer is displayed for a tile that's still loading
|
|
||||||
noBackBuffer = !backBuffer && this.isLoading;
|
|
||||||
|
|
||||||
if (notNeeded || noParent || noTile || noBackBuffer) {
|
|
||||||
this.setBackBufferData();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a back buffer tile and add it to the DOM
|
|
||||||
if (!backBuffer) {
|
|
||||||
backBuffer = this.insertBackBuffer();
|
|
||||||
// some browsers fire the onload event before the image is
|
|
||||||
// displayed, so we keep the buffer until the whole layer finished
|
|
||||||
// loading to avoid visual glitches
|
|
||||||
layer.events.register("loadend", this, this.resetBackBuffer);
|
|
||||||
data.tile = backBuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Position the back buffer now that we have one
|
|
||||||
var lonLat = {lon: data.bounds.left, lat: data.bounds.top},
|
|
||||||
position = layer.getViewPortPxFromLonLat(lonLat, nextResolution),
|
|
||||||
containerStyle = map.layerContainerDiv.style,
|
|
||||||
leftOffset = parseInt(containerStyle.left, 10),
|
|
||||||
topOffset = parseInt(containerStyle.top, 10),
|
|
||||||
style = backBuffer.style;
|
|
||||||
|
|
||||||
style.left = (position.x - leftOffset) + "%";
|
|
||||||
style.top = (position.y - topOffset) + "%";
|
|
||||||
style.width = (this.size.w * ratio) + "%";
|
|
||||||
style.height = (this.size.h * ratio) + "%";
|
|
||||||
|
|
||||||
return backBuffer;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method: resetBackBuffer
|
|
||||||
* Handler for the layer's loadend event.
|
|
||||||
*/
|
|
||||||
resetBackBuffer: function() {
|
|
||||||
this.layer.events.unregister("loadend", this, this.resetBackBuffer);
|
|
||||||
this.removeBackBuffer();
|
|
||||||
this.setBackBufferData();
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method: removeBackBuffer
|
|
||||||
* Removes the backBuffer for this tile.
|
|
||||||
*/
|
|
||||||
removeBackBuffer: function() {
|
|
||||||
var backBufferData = this.backBufferData;
|
|
||||||
var backBuffer = backBufferData.tile;
|
|
||||||
delete backBufferData.tile;
|
|
||||||
var parent = backBuffer && backBuffer.parentNode;
|
|
||||||
if (backBuffer) {
|
|
||||||
parent.removeChild(backBuffer);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* APIMethod: destroy
|
|
||||||
* nullify references to prevent circular references and memory leaks
|
|
||||||
*/
|
|
||||||
destroy: function() {
|
|
||||||
this.removeBackBuffer();
|
|
||||||
this.layer.events.unregister("loadend", this, this.resetBackBuffer);
|
|
||||||
this.backBufferData = null;
|
|
||||||
OpenLayers.Tile.prototype.destroy.apply(this, arguments);
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @requires OpenLayers/Tile/BackBufferable.js
|
* @requires OpenLayers/Tile.js
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -15,9 +15,9 @@
|
|||||||
* <OpenLayers.Tile.Image> constructor.
|
* <OpenLayers.Tile.Image> constructor.
|
||||||
*
|
*
|
||||||
* Inherits from:
|
* Inherits from:
|
||||||
* - <OpenLayers.Tile.BackBufferable>
|
* - <OpenLayers.Tile>
|
||||||
*/
|
*/
|
||||||
OpenLayers.Tile.Image = OpenLayers.Class(OpenLayers.Tile.BackBufferable, {
|
OpenLayers.Tile.Image = OpenLayers.Class(OpenLayers.Tile, {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Property: url
|
* Property: url
|
||||||
@@ -96,7 +96,7 @@ OpenLayers.Tile.Image = OpenLayers.Class(OpenLayers.Tile.BackBufferable, {
|
|||||||
* options - {Object}
|
* options - {Object}
|
||||||
*/
|
*/
|
||||||
initialize: function(layer, position, bounds, url, size, options) {
|
initialize: function(layer, position, bounds, url, size, options) {
|
||||||
OpenLayers.Tile.BackBufferable.prototype.initialize.apply(this, arguments);
|
OpenLayers.Tile.prototype.initialize.apply(this, arguments);
|
||||||
|
|
||||||
this.url = url; //deprecated remove me
|
this.url = url; //deprecated remove me
|
||||||
|
|
||||||
@@ -123,7 +123,7 @@ OpenLayers.Tile.Image = OpenLayers.Class(OpenLayers.Tile.BackBufferable, {
|
|||||||
}
|
}
|
||||||
// don't handle async requests any more
|
// don't handle async requests any more
|
||||||
this.asyncRequestId = null;
|
this.asyncRequestId = null;
|
||||||
OpenLayers.Tile.BackBufferable.prototype.destroy.apply(this, arguments);
|
OpenLayers.Tile.prototype.destroy.apply(this, arguments);
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -134,7 +134,7 @@ OpenLayers.Tile.Image = OpenLayers.Class(OpenLayers.Tile.BackBufferable, {
|
|||||||
* {Boolean} Was a tile drawn?
|
* {Boolean} Was a tile drawn?
|
||||||
*/
|
*/
|
||||||
draw: function() {
|
draw: function() {
|
||||||
var drawn = OpenLayers.Tile.BackBufferable.prototype.draw.apply(this, arguments);
|
var drawn = OpenLayers.Tile.prototype.draw.apply(this, arguments);
|
||||||
if (drawn) {
|
if (drawn) {
|
||||||
if (this.layer != this.layer.map.baseLayer && this.layer.reproject) {
|
if (this.layer != this.layer.map.baseLayer && this.layer.reproject) {
|
||||||
this.bounds = this.getBoundsFromBaseLayer(this.position);
|
this.bounds = this.getBoundsFromBaseLayer(this.position);
|
||||||
@@ -320,19 +320,23 @@ OpenLayers.Tile.Image = OpenLayers.Class(OpenLayers.Tile.BackBufferable, {
|
|||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method: insertBackBuffer
|
* Method: createBackBuffer
|
||||||
* Create a copy of this tile's markup and insert it to the layer
|
* Create a backbuffer for this tile. A backbuffer isn't exactly a clone
|
||||||
* div.
|
* of the tile's markup, because we want to avoid the reloading of the
|
||||||
|
* image. So we clone the frame, and steal the image from the tile.
|
||||||
*
|
*
|
||||||
* Returns:
|
* Returns:
|
||||||
* {DOMElement} The back buffer.
|
* {DOMElement} The markup, or undefined if the tile has no image
|
||||||
|
* or if it's currently loading.
|
||||||
*/
|
*/
|
||||||
insertBackBuffer: function() {
|
createBackBuffer: function() {
|
||||||
var frame = this.frame.cloneNode(false);
|
if(!this.imgDiv || this.isLoading) {
|
||||||
this.layer.div.insertBefore(frame, this.frame);
|
return;
|
||||||
frame.appendChild(this.imgDiv);
|
}
|
||||||
|
var backBuffer = this.frame.cloneNode(false);
|
||||||
|
backBuffer.appendChild(this.imgDiv);
|
||||||
this.imgDiv = null;
|
this.imgDiv = null;
|
||||||
return frame;
|
return backBuffer;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -15,9 +15,6 @@
|
|||||||
*
|
*
|
||||||
* This mixin will be applied to <OpenLayers.Tile.Image> instances
|
* This mixin will be applied to <OpenLayers.Tile.Image> instances
|
||||||
* configured with <OpenLayers.Tile.Image.maxGetUrlLength> set.
|
* configured with <OpenLayers.Tile.Image.maxGetUrlLength> set.
|
||||||
*
|
|
||||||
* Inherits from:
|
|
||||||
* - <OpenLayers.Tile.Image>
|
|
||||||
*/
|
*/
|
||||||
OpenLayers.Tile.Image.IFrame = {
|
OpenLayers.Tile.Image.IFrame = {
|
||||||
|
|
||||||
@@ -29,38 +26,50 @@ OpenLayers.Tile.Image.IFrame = {
|
|||||||
useIFrame: null,
|
useIFrame: null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method: updateBackBuffer
|
* Method: draw
|
||||||
* Update the <backBufferData>, and return a new or reposition the
|
* Set useIFrame in the instance, and operate the image/iframe switch.
|
||||||
* backBuffer. When a backbuffer is returned, the tile's markup is not
|
* Then call Tile.Image.draw.
|
||||||
* available any more.
|
*
|
||||||
*
|
* Returns:
|
||||||
* Returns:
|
* {Boolean}
|
||||||
* {HTMLDivElement} the tile's markup in a cloned element, or undefined if
|
|
||||||
* no backbuffer is currently available or needed
|
|
||||||
*/
|
*/
|
||||||
updateBackBuffer: function() {
|
draw: function() {
|
||||||
this.url = this.layer.getURL(this.bounds);
|
var draw = OpenLayers.Tile.Image.prototype.shouldDraw.call(this);
|
||||||
var usedIFrame = this.useIFrame;
|
if(draw) {
|
||||||
this.useIFrame = this.maxGetUrlLength !== null && !this.layer.async &&
|
|
||||||
this.url.length > this.maxGetUrlLength;
|
// this.url isn't set to the currect value yet, so we call getURL
|
||||||
var fromIFrame = usedIFrame && !this.useIFrame;
|
// on the layer and store the result in a local variable
|
||||||
var toIFrame = !usedIFrame && this.useIFrame;
|
var url = this.layer.getURL(this.bounds);
|
||||||
if (fromIFrame || toIFrame) {
|
|
||||||
// switch between get (image) and post (iframe)
|
var usedIFrame = this.useIFrame;
|
||||||
this.clear();
|
this.useIFrame = this.maxGetUrlLength !== null &&
|
||||||
if (this.imgDiv && this.imgDiv.parentNode === this.frame) {
|
!this.layer.async &&
|
||||||
this.frame.removeChild(this.imgDiv);
|
url.length > this.maxGetUrlLength;
|
||||||
}
|
|
||||||
this.imgDiv = null;
|
var fromIFrame = usedIFrame && !this.useIFrame;
|
||||||
if (fromIFrame) {
|
var toIFrame = !usedIFrame && this.useIFrame;
|
||||||
// remove eventPane
|
|
||||||
this.frame.removeChild(this.frame.firstChild);
|
if(fromIFrame || toIFrame) {
|
||||||
this.resetBackBuffer();
|
|
||||||
|
// Switching between GET (image) and POST (iframe).
|
||||||
|
|
||||||
|
// We remove the imgDiv (really either an image or an iframe)
|
||||||
|
// from the frame and set it to null to make sure initImage
|
||||||
|
// will call createImage.
|
||||||
|
|
||||||
|
if(this.imgDiv && this.imgDiv.parentNode === this.frame) {
|
||||||
|
this.frame.removeChild(this.imgDiv);
|
||||||
|
}
|
||||||
|
this.imgDiv = null;
|
||||||
|
|
||||||
|
// And if we had an iframe we also remove the event pane.
|
||||||
|
|
||||||
|
if(fromIFrame) {
|
||||||
|
this.frame.removeChild(this.frame.firstChild);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!this.useIFrame) {
|
return OpenLayers.Tile.Image.prototype.draw.apply(this, arguments);
|
||||||
OpenLayers.Tile.Image.prototype.updateBackBuffer.apply(this, arguments);
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -183,6 +192,22 @@ OpenLayers.Tile.Image.IFrame = {
|
|||||||
} else {
|
} else {
|
||||||
OpenLayers.Tile.Image.prototype.setImgSrc.apply(this, arguments);
|
OpenLayers.Tile.Image.prototype.setImgSrc.apply(this, arguments);
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method: createBackBuffer
|
||||||
|
* Override createBackBuffer to do nothing when we use an iframe. Moving an
|
||||||
|
* iframe from one element to another makes it necessary to reload the iframe
|
||||||
|
* because its content is lost. So we just give up.
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* {DOMElement}
|
||||||
|
*/
|
||||||
|
createBackBuffer: function() {
|
||||||
|
var backBuffer;
|
||||||
|
if(!this.useIFrame) {
|
||||||
|
backBuffer = OpenLayers.Tile.Image.prototype.createBackBuffer.call(this);
|
||||||
|
}
|
||||||
|
return backBuffer;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
function test_read_exception(t) {
|
function test_read_exception(t) {
|
||||||
t.plan(6);
|
t.plan(6);
|
||||||
var text = '<?xml version="1.0" encoding="UTF-8"?>' +
|
var text = '<?xml version="1.0" encoding="UTF-8"?>' +
|
||||||
'<ows:ExceptionReport xml:lang="en" version="1.0.0"' +
|
'<ows:ExceptionReport xml:lang="en" version="1.1.0"' +
|
||||||
' xsi:schemaLocation="http://www.opengis.net/ows http://schemas.opengis.net/ows/1.1.0/owsExceptionReport.xsd"' +
|
' xsi:schemaLocation="http://www.opengis.net/ows http://schemas.opengis.net/ows/1.1.0/owsExceptionReport.xsd"' +
|
||||||
' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ows="http://www.opengis.net/ows/1.1">' +
|
' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ows="http://www.opengis.net/ows/1.1">' +
|
||||||
' <ows:Exception locator="foo" exceptionCode="InvalidParameterValue">' +
|
' <ows:Exception locator="foo" exceptionCode="InvalidParameterValue">' +
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
var format = new OpenLayers.Format.OWSCommon();
|
var format = new OpenLayers.Format.OWSCommon();
|
||||||
var result = format.read(text);
|
var result = format.read(text);
|
||||||
var report = result.exceptionReport;
|
var report = result.exceptionReport;
|
||||||
t.eq(report.version, "1.0.0", "Version parsed correctly");
|
t.eq(report.version, "1.1.0", "Version parsed correctly");
|
||||||
t.eq(report.language, "en", "Language parsed correctly");
|
t.eq(report.language, "en", "Language parsed correctly");
|
||||||
var exception = report.exceptions[0];
|
var exception = report.exceptions[0];
|
||||||
t.eq(exception.code, "InvalidParameterValue", "exceptionCode properly parsed");
|
t.eq(exception.code, "InvalidParameterValue", "exceptionCode properly parsed");
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
t.eq(obj.serviceProvider.serviceContact.contactInfo.phone.voice, "+49-251-83-30088", "Voice phone correctly parsed");
|
t.eq(obj.serviceProvider.serviceContact.contactInfo.phone.voice, "+49-251-83-30088", "Voice phone correctly parsed");
|
||||||
|
|
||||||
// operationsMetadata (from OWSCommon)
|
// operationsMetadata (from OWSCommon)
|
||||||
t.eq(obj.operationsMetadata.DescribeSensor.dcp.http.post, "http://v-swe.uni-muenster.de:8080/WeatherSOS/sos", "POST url for DescribeSensor correctly parsed");
|
t.eq(obj.operationsMetadata.DescribeSensor.dcp.http.post[0].url, "http://v-swe.uni-muenster.de:8080/WeatherSOS/sos", "POST url for DescribeSensor correctly parsed");
|
||||||
var counter = 0;
|
var counter = 0;
|
||||||
for (var key in obj.operationsMetadata.DescribeSensor.parameters.procedure.allowedValues) {
|
for (var key in obj.operationsMetadata.DescribeSensor.parameters.procedure.allowedValues) {
|
||||||
if (counter == 0) {
|
if (counter == 0) {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
||||||
function test_ows(t) {
|
function test_ows(t) {
|
||||||
t.plan(17);
|
t.plan(20);
|
||||||
var xml = document.getElementById("ogcsample").firstChild.nodeValue;
|
var xml = document.getElementById("ogcsample").firstChild.nodeValue;
|
||||||
var doc = new OpenLayers.Format.XML().read(xml);
|
var doc = new OpenLayers.Format.XML().read(xml);
|
||||||
var obj = new OpenLayers.Format.WMTSCapabilities().read(doc);
|
var obj = new OpenLayers.Format.WMTSCapabilities().read(doc);
|
||||||
@@ -30,9 +30,18 @@
|
|||||||
|
|
||||||
// ows:OperationsMetadata
|
// ows:OperationsMetadata
|
||||||
var operationsMetadata = obj.operationsMetadata;
|
var operationsMetadata = obj.operationsMetadata;
|
||||||
t.eq(operationsMetadata.GetCapabilities.dcp.http.get, "http://www.miramon.uab.es/cgi-bin/MiraMon5_0.cgi?", "ows:OperationsMetadata GetCapabilities url is correct");
|
t.eq(operationsMetadata.GetCapabilities.dcp.http.get[0].url, "http://www.miramon.uab.es/cgi-bin/MiraMon5_0.cgi?", "ows:OperationsMetadata GetCapabilities url is correct");
|
||||||
t.eq(operationsMetadata.GetFeatureInfo.dcp.http.get, "http://www.miramon.uab.es/cgi-bin/MiraMon5_0.cgi?", "ows:OperationsMetadata GetFeatureInfo url is correct");
|
t.eq(operationsMetadata.GetCapabilities.dcp.http.get[0].constraints.GetEncoding.allowedValues,
|
||||||
t.eq(operationsMetadata.GetTile.dcp.http.get, "http://www.miramon.uab.es/cgi-bin/MiraMon5_0.cgi?", "ows:OperationsMetadata GetTile url is correct");
|
{'KVP': true},
|
||||||
|
"ows:OperationsMetadata GetCapabilities Constraints Get is correct");
|
||||||
|
t.eq(operationsMetadata.GetFeatureInfo.dcp.http.get[0].url, "http://www.miramon.uab.es/cgi-bin/MiraMon5_0.cgi?", "ows:OperationsMetadata GetFeatureInfo url is correct");
|
||||||
|
t.eq(operationsMetadata.GetFeatureInfo.dcp.http.get[0].constraints,
|
||||||
|
undefined,
|
||||||
|
"ows:OperationsMetadata GetFeatureInfo Constraints Get is correct");
|
||||||
|
t.eq(operationsMetadata.GetTile.dcp.http.get[0].url, "http://www.miramon.uab.es/cgi-bin/MiraMon5_0.cgi?", "ows:OperationsMetadata GetTile url is correct");
|
||||||
|
t.eq(operationsMetadata.GetTile.dcp.http.get[0].constraints,
|
||||||
|
undefined,
|
||||||
|
"ows:OperationsMetadata GetTile Constraints Get is correct");
|
||||||
}
|
}
|
||||||
|
|
||||||
function test_layers(t) {
|
function test_layers(t) {
|
||||||
@@ -47,7 +56,7 @@
|
|||||||
t.eq(numOfLayers, 1, "correct count of layers");
|
t.eq(numOfLayers, 1, "correct count of layers");
|
||||||
|
|
||||||
var layer = contents.layers[0];
|
var layer = contents.layers[0];
|
||||||
t.eq(layer.abstract, "Coastline/shorelines (BA010)", "layer abstract is correct");
|
t.eq(layer['abstract'], "Coastline/shorelines (BA010)", "layer abstract is correct");
|
||||||
t.eq(layer.identifier, "coastlines", "layer identifier is correct");
|
t.eq(layer.identifier, "coastlines", "layer identifier is correct");
|
||||||
t.eq(layer.title, "Coastlines", "layer title is correct");
|
t.eq(layer.title, "Coastlines", "layer title is correct");
|
||||||
|
|
||||||
@@ -90,7 +99,7 @@
|
|||||||
var dimensions = layer.dimensions;
|
var dimensions = layer.dimensions;
|
||||||
t.eq(dimensions.length, 1, "correct count of dimensions");
|
t.eq(dimensions.length, 1, "correct count of dimensions");
|
||||||
t.eq(dimensions[0].title, "Time", "first dimension title is correct");
|
t.eq(dimensions[0].title, "Time", "first dimension title is correct");
|
||||||
t.eq(dimensions[0].abstract, "Monthly datasets", "first dimension abstract is correct");
|
t.eq(dimensions[0]['abstract'], "Monthly datasets", "first dimension abstract is correct");
|
||||||
t.eq(dimensions[0].identifier, "TIME", "first dimension identifier is correct");
|
t.eq(dimensions[0].identifier, "TIME", "first dimension identifier is correct");
|
||||||
t.eq(dimensions[0]['default'], "default", "first dimension default is correct");
|
t.eq(dimensions[0]['default'], "default", "first dimension default is correct");
|
||||||
t.eq(dimensions[0].values.length, 3, "first dimension has correct count of values");
|
t.eq(dimensions[0].values.length, 3, "first dimension has correct count of values");
|
||||||
|
|||||||
+366
-4
@@ -49,7 +49,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function test_Layer_Grid_clearTiles (t) {
|
function test_Layer_Grid_clearTiles (t) {
|
||||||
t.plan(3);
|
t.plan(4);
|
||||||
|
|
||||||
var map = new OpenLayers.Map('map');
|
var map = new OpenLayers.Map('map');
|
||||||
layer = new OpenLayers.Layer.WMS(name, url, params);
|
layer = new OpenLayers.Layer.WMS(name, url, params);
|
||||||
@@ -85,6 +85,7 @@
|
|||||||
t.ok( layer.grid != null, "layer.grid does not get nullified" );
|
t.ok( layer.grid != null, "layer.grid does not get nullified" );
|
||||||
t.eq(tilesDeleted, numTiles, "all tiles destroy()ed properly");
|
t.eq(tilesDeleted, numTiles, "all tiles destroy()ed properly");
|
||||||
t.ok(allTilesUnhooked, "all tiles unhooked before being destroyed");
|
t.ok(allTilesUnhooked, "all tiles unhooked before being destroyed");
|
||||||
|
t.eq(layer.gridResolution, null, "gridResolution set to null");
|
||||||
|
|
||||||
OpenLayers.Tile.Image.prototype.destroy =
|
OpenLayers.Tile.Image.prototype.destroy =
|
||||||
OpenLayers.Tile.Image.prototype._destroy;
|
OpenLayers.Tile.Image.prototype._destroy;
|
||||||
@@ -167,6 +168,7 @@
|
|||||||
var map = new OpenLayers.Map('map');
|
var map = new OpenLayers.Map('map');
|
||||||
layer = new OpenLayers.Layer.WMS(name, url, params);
|
layer = new OpenLayers.Layer.WMS(name, url, params);
|
||||||
layer.destroy = function() {}; //we're going to do funky things with the grid
|
layer.destroy = function() {}; //we're going to do funky things with the grid
|
||||||
|
layer.applyBackBuffer = function() {}; // backbuffering isn't under test here
|
||||||
map.addLayer(layer);
|
map.addLayer(layer);
|
||||||
|
|
||||||
//make sure null bounds doesnt cause script error.
|
//make sure null bounds doesnt cause script error.
|
||||||
@@ -390,6 +392,8 @@
|
|||||||
getLayerPxFromLonLat: function(ul) {
|
getLayerPxFromLonLat: function(ul) {
|
||||||
t.ok(ul.equals(desiredUL), "correct ul passed to translation");
|
t.ok(ul.equals(desiredUL), "correct ul passed to translation");
|
||||||
return translatedPX;
|
return translatedPX;
|
||||||
|
},
|
||||||
|
getResolution: function() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -482,6 +486,7 @@
|
|||||||
|
|
||||||
|
|
||||||
g_events = [];
|
g_events = [];
|
||||||
|
layer.grid = [[{}]]; // to prevent error in updateBackBuffer
|
||||||
tile.onLoadEnd.apply(layer);
|
tile.onLoadEnd.apply(layer);
|
||||||
t.eq(g_events[0], "tileloaded", "tileloaded triggered when numLoadingTiles is 0");
|
t.eq(g_events[0], "tileloaded", "tileloaded triggered when numLoadingTiles is 0");
|
||||||
t.eq(g_events[1], "loadend", "loadend event triggered when numLoadingTiles is 0");
|
t.eq(g_events[1], "loadend", "loadend event triggered when numLoadingTiles is 0");
|
||||||
@@ -586,7 +591,7 @@
|
|||||||
|
|
||||||
function test_Layer_Grid_destroy (t) {
|
function test_Layer_Grid_destroy (t) {
|
||||||
|
|
||||||
t.plan( 8 );
|
t.plan( 9 );
|
||||||
|
|
||||||
var map = new OpenLayers.Map('map');
|
var map = new OpenLayers.Map('map');
|
||||||
layer = new OpenLayers.Layer.Grid(name, url, params);
|
layer = new OpenLayers.Layer.Grid(name, url, params);
|
||||||
@@ -603,16 +608,20 @@
|
|||||||
map.setCenter(new OpenLayers.LonLat(0,0), 10);
|
map.setCenter(new OpenLayers.LonLat(0,0), 10);
|
||||||
map.setCenter(new OpenLayers.LonLat(1,1));
|
map.setCenter(new OpenLayers.LonLat(1,1));
|
||||||
|
|
||||||
|
|
||||||
//grab a reference to one of the tiles
|
//grab a reference to one of the tiles
|
||||||
var tile = layer.grid[1][1];
|
var tile = layer.grid[1][1];
|
||||||
t.eq( tile.imgDiv.className, "olTileImage", "Tile has an image" );
|
t.eq( tile.imgDiv.className, "olTileImage", "Tile has an image" );
|
||||||
|
|
||||||
|
var removeBackBufferCalled = false;
|
||||||
|
layer.removeBackBuffer = function() {
|
||||||
|
removeBackBufferCalled = true;
|
||||||
|
};
|
||||||
|
|
||||||
layer.destroy();
|
layer.destroy();
|
||||||
t.eq( tile.imgDiv, null, "Tile destroyed" );
|
t.eq( tile.imgDiv, null, "Tile destroyed" );
|
||||||
t.eq( layer.timerId, null, "Tile loading timeout cleared");
|
t.eq( layer.timerId, null, "Tile loading timeout cleared");
|
||||||
|
|
||||||
t.ok( layer.grid == null, "tiles appropriately destroyed")
|
t.ok( layer.grid == null, "tiles appropriately destroyed")
|
||||||
|
t.ok( removeBackBufferCalled, "destroy calls removeBackBuffer");
|
||||||
|
|
||||||
// destroy after remove from map
|
// destroy after remove from map
|
||||||
layer = new OpenLayers.Layer.WMS(name, url, params);
|
layer = new OpenLayers.Layer.WMS(name, url, params);
|
||||||
@@ -759,6 +768,92 @@
|
|||||||
map.destroy();
|
map.destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function test_moveTo_backbuffer_singletile(t) {
|
||||||
|
t.plan(4);
|
||||||
|
|
||||||
|
var map = new OpenLayers.Map('map', {
|
||||||
|
resolutions: [1, 0.5, 0.025]
|
||||||
|
});
|
||||||
|
var resolution;
|
||||||
|
var layer = new OpenLayers.Layer.WMS('', '', {}, {
|
||||||
|
singleTile: true,
|
||||||
|
isBaseLayer: true,
|
||||||
|
transitionEffect: 'resize',
|
||||||
|
applyBackBuffer: function(res) {
|
||||||
|
resolution = res;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
map.addLayer(layer);
|
||||||
|
|
||||||
|
// initial resolution is 0.025
|
||||||
|
resolution = undefined;
|
||||||
|
map.setCenter(new OpenLayers.LonLat(0, 0), 2);
|
||||||
|
t.eq(resolution, 0.025,
|
||||||
|
'applyBackBuffer not called on first moveTo');
|
||||||
|
|
||||||
|
// move to (-90, 45)
|
||||||
|
resolution = undefined;
|
||||||
|
map.setCenter(new OpenLayers.LonLat(-90, 45));
|
||||||
|
t.eq(resolution, 0.025,
|
||||||
|
'applyBackBuffer called when map is moved');
|
||||||
|
|
||||||
|
// change to resolution 1
|
||||||
|
resolution = undefined;
|
||||||
|
map.zoomTo(0);
|
||||||
|
t.eq(resolution, 1,
|
||||||
|
'applyBackBuffer called when map is zoomed out');
|
||||||
|
|
||||||
|
// change to resolution 0.5
|
||||||
|
resolution = undefined;
|
||||||
|
map.zoomTo(1);
|
||||||
|
t.eq(resolution, 0.5,
|
||||||
|
'applyBackBuffer called when map is zoomed out');
|
||||||
|
|
||||||
|
map.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
function test_moveTo_backbuffer(t) {
|
||||||
|
t.plan(4);
|
||||||
|
|
||||||
|
var map = new OpenLayers.Map('map', {
|
||||||
|
resolutions: [1, 0.5, 0.025]
|
||||||
|
});
|
||||||
|
var resolution;
|
||||||
|
var layer = new OpenLayers.Layer.WMS('', '', {}, {
|
||||||
|
isBaseLayer: true,
|
||||||
|
transitionEffect: 'resize',
|
||||||
|
applyBackBuffer: function(res) {
|
||||||
|
resolution = res;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
map.addLayer(layer);
|
||||||
|
|
||||||
|
// initial resolution is 0.025
|
||||||
|
resolution = undefined;
|
||||||
|
map.setCenter(new OpenLayers.LonLat(0, 0), 2);
|
||||||
|
t.eq(resolution, 0.025,
|
||||||
|
'applyBackBuffer not called on first moveTo');
|
||||||
|
|
||||||
|
// move to (-90, 45)
|
||||||
|
resolution = undefined;
|
||||||
|
map.setCenter(new OpenLayers.LonLat(-90, 45));
|
||||||
|
t.eq(resolution, undefined,
|
||||||
|
'applyBackBuffer not called when map is moved');
|
||||||
|
|
||||||
|
// change to resolution 1
|
||||||
|
resolution = undefined;
|
||||||
|
map.zoomTo(0);
|
||||||
|
t.eq(resolution, 1,
|
||||||
|
'applyBackBuffer called when map is zoomed out');
|
||||||
|
|
||||||
|
// change to resolution 0.5
|
||||||
|
map.zoomTo(1);
|
||||||
|
t.eq(resolution, 0.5,
|
||||||
|
'applyBackBuffer called when map is zoomed out');
|
||||||
|
|
||||||
|
map.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
function test_transformDiv(t) {
|
function test_transformDiv(t) {
|
||||||
|
|
||||||
t.plan(8);
|
t.plan(8);
|
||||||
@@ -814,6 +909,273 @@
|
|||||||
map.destroy();
|
map.destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function test_applyBackBuffer(t) {
|
||||||
|
t.plan(13);
|
||||||
|
|
||||||
|
var map = new OpenLayers.Map('map2');
|
||||||
|
var layer = new OpenLayers.Layer.WMS('', '', {}, {
|
||||||
|
isBaseLayer: true
|
||||||
|
});
|
||||||
|
map.addLayer(layer);
|
||||||
|
map.zoomToMaxExtent();
|
||||||
|
|
||||||
|
var backBuffer;
|
||||||
|
|
||||||
|
// test #1
|
||||||
|
layer.createBackBuffer = function() {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
layer.applyBackBuffer(2);
|
||||||
|
t.eq(layer.backBuffer, undefined,
|
||||||
|
'back buffer not created if createBackBuffer returns undefined');
|
||||||
|
|
||||||
|
// test #2
|
||||||
|
layer.createBackBuffer = function() {
|
||||||
|
backBuffer = document.createElement('div');
|
||||||
|
return backBuffer;
|
||||||
|
};
|
||||||
|
layer.gridResolution = 32;
|
||||||
|
layer.grid[0][0].bounds = new OpenLayers.Bounds(0, 1, 1, 0);
|
||||||
|
layer.applyBackBuffer(2);
|
||||||
|
t.ok(layer.backBuffer === backBuffer,
|
||||||
|
'back buffer set in layer');
|
||||||
|
t.ok(layer.div.firstChild === backBuffer,
|
||||||
|
'back buffer inserted as first child');
|
||||||
|
t.eq(layer.backBuffer.style.width, '1600%',
|
||||||
|
'back buffer has correct width');
|
||||||
|
t.eq(layer.backBuffer.style.height, '1600%',
|
||||||
|
'back buffer has correct height');
|
||||||
|
t.eq(layer.backBuffer.style.left, '250%',
|
||||||
|
'back buffer has correct left');
|
||||||
|
t.eq(layer.backBuffer.style.top, '275%',
|
||||||
|
'back buffer has correct top');
|
||||||
|
|
||||||
|
// test #3
|
||||||
|
layer.createBackBuffer = function() {
|
||||||
|
backBuffer = document.createElement('div');
|
||||||
|
return backBuffer;
|
||||||
|
};
|
||||||
|
layer.gridResolution = 32;
|
||||||
|
layer.grid[0][0].bounds = new OpenLayers.Bounds(0, 1, 1, 0);
|
||||||
|
map.layerContainerDiv.style.left = '20px';
|
||||||
|
map.layerContainerDiv.style.top = '-20px';
|
||||||
|
layer.applyBackBuffer(2);
|
||||||
|
t.ok(layer.backBuffer === backBuffer,
|
||||||
|
'back buffer set in layer');
|
||||||
|
t.ok(layer.div.firstChild === backBuffer,
|
||||||
|
'back buffer inserted as first child');
|
||||||
|
t.eq(layer.backBuffer.style.width, '1600%',
|
||||||
|
'back buffer has correct width');
|
||||||
|
t.eq(layer.backBuffer.style.height, '1600%',
|
||||||
|
'back buffer has correct height');
|
||||||
|
t.eq(layer.backBuffer.style.left, '230%',
|
||||||
|
'back buffer has correct left');
|
||||||
|
t.eq(layer.backBuffer.style.top, '295%',
|
||||||
|
'back buffer has correct top');
|
||||||
|
|
||||||
|
map.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
function test_createBackBuffer(t) {
|
||||||
|
t.plan(7);
|
||||||
|
|
||||||
|
var map = new OpenLayers.Map('map');
|
||||||
|
var layer = new OpenLayers.Layer.WMS('', '', {}, {
|
||||||
|
isBaseLayer: true
|
||||||
|
});
|
||||||
|
map.addLayer(layer);
|
||||||
|
map.zoomToMaxExtent();
|
||||||
|
|
||||||
|
var createBackBuffer = OpenLayers.Tile.Image.prototype.createBackBuffer;
|
||||||
|
|
||||||
|
var backBuffer;
|
||||||
|
|
||||||
|
OpenLayers.Tile.Image.prototype.createBackBuffer = function() {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
backBuffer = layer.createBackBuffer();
|
||||||
|
t.ok(backBuffer != undefined,
|
||||||
|
'createBackBuffer returns a back buffer');
|
||||||
|
t.eq(backBuffer.childNodes.length, 0,
|
||||||
|
'returned back buffer has no child nodes');
|
||||||
|
|
||||||
|
OpenLayers.Tile.Image.prototype.createBackBuffer = function() {
|
||||||
|
return document.createElement('div');
|
||||||
|
};
|
||||||
|
backBuffer = layer.createBackBuffer();
|
||||||
|
t.ok(backBuffer != undefined,
|
||||||
|
'createBackBuffer returns a back buffer');
|
||||||
|
t.eq(backBuffer.childNodes[0].style.left, '0%',
|
||||||
|
'first tile has correct left');
|
||||||
|
t.eq(backBuffer.childNodes[0].style.top, '0%',
|
||||||
|
'first tile has correct top');
|
||||||
|
t.eq(backBuffer.childNodes[1].style.left, '256%',
|
||||||
|
'second tile has correct left');
|
||||||
|
t.eq(backBuffer.childNodes[1].style.top, '0%',
|
||||||
|
'second tile has correct top');
|
||||||
|
|
||||||
|
map.destroy();
|
||||||
|
OpenLayers.Tile.Image.prototype.createBackBuffer = createBackBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
function test_removeBackBuffer(t) {
|
||||||
|
t.plan(3);
|
||||||
|
|
||||||
|
var map = new OpenLayers.Map('map');
|
||||||
|
var layer = new OpenLayers.Layer.WMS('', '', {}, {isBaseLayer: true});
|
||||||
|
map.addLayer(layer);
|
||||||
|
|
||||||
|
// add a fake back buffer
|
||||||
|
var backBuffer = document.createElement('div');
|
||||||
|
layer.backBuffer = backBuffer;
|
||||||
|
layer.div.appendChild(backBuffer);
|
||||||
|
layer.backBufferResolution = 32;
|
||||||
|
|
||||||
|
layer.removeBackBuffer();
|
||||||
|
t.eq(layer.backBuffer, null, 'backBuffer set to null in layer');
|
||||||
|
t.eq(layer.backBufferResolution, null,
|
||||||
|
'backBufferResolution set to null in layer');
|
||||||
|
t.ok(backBuffer.parentNode !== layer.div,
|
||||||
|
'back buffer removed from layer');
|
||||||
|
|
||||||
|
map.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
function test_singleTile_move_and_zoom(t) {
|
||||||
|
|
||||||
|
//
|
||||||
|
// In single tile mode with no transition effect, we insert a non-scaled
|
||||||
|
// backbuffer when the layer is moved. But if a zoom occurs right after
|
||||||
|
// a move, i.e. before the new image is received, we need to remove the
|
||||||
|
// backbuffer, or an ill-positioned image will be visible during the
|
||||||
|
// zoom transition.
|
||||||
|
//
|
||||||
|
|
||||||
|
t.plan(2);
|
||||||
|
|
||||||
|
var map = new OpenLayers.Map('map');
|
||||||
|
var layer = new OpenLayers.Layer.WMS('', '', {}, {
|
||||||
|
isBaseLayer: true,
|
||||||
|
singleTile: true,
|
||||||
|
ratio: 1
|
||||||
|
});
|
||||||
|
map.addLayer(layer);
|
||||||
|
map.setCenter(new OpenLayers.LonLat(0, 0), 0);
|
||||||
|
|
||||||
|
// move
|
||||||
|
map.setCenter(new OpenLayers.LonLat(10, 10));
|
||||||
|
t.ok(layer.backBuffer && layer.backBuffer.parentNode === layer.div,
|
||||||
|
'backbuffer inserted after map move');
|
||||||
|
|
||||||
|
// zoom
|
||||||
|
map.zoomTo(1);
|
||||||
|
t.eq(layer.backBuffer, null,
|
||||||
|
'back buffer removed when zooming');
|
||||||
|
|
||||||
|
map.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
function test_backbuffer_scaled_layer(t) {
|
||||||
|
t.plan(12);
|
||||||
|
|
||||||
|
//
|
||||||
|
// set up
|
||||||
|
//
|
||||||
|
|
||||||
|
var map = new OpenLayers.Map('map', {
|
||||||
|
resolutions: [32, 16, 8, 4, 2, 1]
|
||||||
|
});
|
||||||
|
var layer = new OpenLayers.Layer.WMS(
|
||||||
|
"WMS",
|
||||||
|
window.location.href + "#",
|
||||||
|
null,
|
||||||
|
{transitionEffect: "resize"}
|
||||||
|
);
|
||||||
|
|
||||||
|
layer.serverResolutions = [32, 16, 8];
|
||||||
|
|
||||||
|
map.addLayer(layer);
|
||||||
|
map.setCenter(new OpenLayers.LonLat(0, 0), 2);
|
||||||
|
|
||||||
|
layer.createBackBuffer = function() {
|
||||||
|
return document.createElement('div');
|
||||||
|
};
|
||||||
|
|
||||||
|
// we want to control when the back buffer is removed
|
||||||
|
var removeBackBuffer = OpenLayers.Function.bind(
|
||||||
|
layer.removeBackBuffer, layer);
|
||||||
|
layer.removeBackBuffer = function() {};
|
||||||
|
|
||||||
|
//
|
||||||
|
// test
|
||||||
|
//
|
||||||
|
|
||||||
|
// change resolution from 8 to 4
|
||||||
|
map.zoomTo(3);
|
||||||
|
t.eq(layer.backBuffer.style.width, '100%',
|
||||||
|
'[8->4] back buffer not scaled');
|
||||||
|
removeBackBuffer();
|
||||||
|
|
||||||
|
// change resolution from 8 to 2
|
||||||
|
map.zoomTo(2); removeBackBuffer(); map.zoomTo(4);
|
||||||
|
t.eq(layer.backBuffer.style.width, '100%',
|
||||||
|
'[8->2] back buffer not scaled');
|
||||||
|
removeBackBuffer();
|
||||||
|
|
||||||
|
// change resolution from 16 to 4
|
||||||
|
map.zoomTo(1); removeBackBuffer(); map.zoomTo(3);
|
||||||
|
t.eq(layer.backBuffer.style.width, '200%',
|
||||||
|
'[16->4] back buffer width is as expected');
|
||||||
|
t.eq(layer.backBuffer.style.width, '200%',
|
||||||
|
'[16->4] back buffer height is as expected');
|
||||||
|
removeBackBuffer();
|
||||||
|
|
||||||
|
// change resolution from 32 to 1
|
||||||
|
map.zoomTo(0); removeBackBuffer(); map.zoomTo(5);
|
||||||
|
t.eq(layer.backBuffer.style.width, '400%',
|
||||||
|
'[32->1] back buffer width is as expected');
|
||||||
|
t.eq(layer.backBuffer.style.width, '400%',
|
||||||
|
'[32->1] back buffer height is as expected');
|
||||||
|
removeBackBuffer();
|
||||||
|
|
||||||
|
// change resolution from 4 to 2
|
||||||
|
map.zoomTo(3); removeBackBuffer(); map.zoomTo(4);
|
||||||
|
t.eq(layer.backBuffer.style.width, '100%',
|
||||||
|
'[4->2] back buffer not scaled');
|
||||||
|
removeBackBuffer();
|
||||||
|
|
||||||
|
// change resolution from 4 to 1
|
||||||
|
map.zoomTo(3); removeBackBuffer(); map.zoomTo(5);
|
||||||
|
t.eq(layer.backBuffer.style.width, '100%',
|
||||||
|
'[4->1] back buffer not scaled');
|
||||||
|
removeBackBuffer();
|
||||||
|
|
||||||
|
// change resolution from 1 to 4
|
||||||
|
map.zoomTo(5); removeBackBuffer(); map.zoomTo(3);
|
||||||
|
t.eq(layer.backBuffer.style.width, '100%',
|
||||||
|
'[1->4] back buffer not scaled');
|
||||||
|
removeBackBuffer();
|
||||||
|
|
||||||
|
// change resolution from 4 to 8
|
||||||
|
map.zoomTo(3); removeBackBuffer(); map.zoomTo(2);
|
||||||
|
t.eq(layer.backBuffer.style.width, '100%',
|
||||||
|
'[4->8] back buffer not scaled');
|
||||||
|
removeBackBuffer();
|
||||||
|
|
||||||
|
// change resolution from 4 to 16
|
||||||
|
map.zoomTo(3); removeBackBuffer(); map.zoomTo(1);
|
||||||
|
t.eq(layer.backBuffer.style.width, '50%',
|
||||||
|
'[4->16] back buffer width is as expected');
|
||||||
|
t.eq(layer.backBuffer.style.width, '50%',
|
||||||
|
'[4->16] back buffer height is as expected');
|
||||||
|
removeBackBuffer();
|
||||||
|
|
||||||
|
//
|
||||||
|
// tear down
|
||||||
|
//
|
||||||
|
|
||||||
|
map.destroy();
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@@ -221,6 +221,39 @@
|
|||||||
map.destroy();
|
map.destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function test_getURL_resourceUrl(t) {
|
||||||
|
t.plan(2);
|
||||||
|
|
||||||
|
var xml = document.getElementById("capabilities").firstChild.nodeValue;
|
||||||
|
var doc = new OpenLayers.Format.XML().read(xml);
|
||||||
|
var obj = new OpenLayers.Format.WMTSCapabilities().read(doc);
|
||||||
|
|
||||||
|
var template = "http://www.example.com/{style}/{Time}/{style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png";
|
||||||
|
var layer = new OpenLayers.Layer.WMTS({
|
||||||
|
requestEncoding: "REST",
|
||||||
|
url: template,
|
||||||
|
layer: "GeoWebCache_USA_WMTS",
|
||||||
|
style: "foo",
|
||||||
|
matrixSet: "arcgis-online",
|
||||||
|
params: {Time: "2011"},
|
||||||
|
dimensions: ["Time"]
|
||||||
|
});
|
||||||
|
|
||||||
|
var map = new OpenLayers.Map("map", {
|
||||||
|
layers: [layer],
|
||||||
|
projection: "EPSG:4326",
|
||||||
|
maxResolution: 0.3515625,
|
||||||
|
maxExtent: new OpenLayers.Bounds(-180, -90, 180, 90)
|
||||||
|
});
|
||||||
|
map.setCenter(new OpenLayers.LonLat(-97.0, 38.0), 1);
|
||||||
|
t.eq(layer.getURL(new OpenLayers.Bounds(-135.0, 0.0, -90.0, 45.0)),
|
||||||
|
"http://www.example.com/foo/2011/foo/arcgis-online/1/1/1.png", "getURL returns correct url");
|
||||||
|
map.zoomIn();
|
||||||
|
t.eq(layer.getURL(new OpenLayers.Bounds(-180.0, 0.0, -90.0, 90.0)),
|
||||||
|
"http://www.example.com/foo/2011/foo/arcgis-online/2/2/2.png", "getURL returns correct url");
|
||||||
|
map.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
function test_destroy (t) {
|
function test_destroy (t) {
|
||||||
t.plan(3);
|
t.plan(3);
|
||||||
var map = new OpenLayers.Map('map');
|
var map = new OpenLayers.Map('map');
|
||||||
|
|||||||
@@ -1,260 +0,0 @@
|
|||||||
<html>
|
|
||||||
<head>
|
|
||||||
<script src="../OLLoader.js"></script>
|
|
||||||
<script type="text/javascript">
|
|
||||||
var tile;
|
|
||||||
|
|
||||||
var map, layer;
|
|
||||||
function setUp() {
|
|
||||||
map = new OpenLayers.Map("map");
|
|
||||||
layer = new OpenLayers.Layer.WMS(
|
|
||||||
"WMS",
|
|
||||||
window.location.href + "#",
|
|
||||||
null,
|
|
||||||
{transitionEffect: "resize"}
|
|
||||||
);
|
|
||||||
map.addLayer(layer)
|
|
||||||
map.setCenter(new OpenLayers.LonLat(0, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
function tearDown() {
|
|
||||||
map.destroy();
|
|
||||||
map = null;
|
|
||||||
layer = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
var position = new OpenLayers.Pixel(20,30);
|
|
||||||
var bounds = new OpenLayers.Bounds(1,2,3,4);
|
|
||||||
|
|
||||||
function test_initialize (t) {
|
|
||||||
t.plan(2);
|
|
||||||
setUp();
|
|
||||||
|
|
||||||
tile = new OpenLayers.Tile.Image(layer, position, bounds, null);
|
|
||||||
t.eq(tile.backBufferData, {}, "back buffer data initialized");
|
|
||||||
t.eq(tile.size.w, 256, "size object with default width created");
|
|
||||||
|
|
||||||
tearDown();
|
|
||||||
}
|
|
||||||
|
|
||||||
function test_backBufferMode(t) {
|
|
||||||
t.plan(4);
|
|
||||||
|
|
||||||
var l;
|
|
||||||
|
|
||||||
var map = new OpenLayers.Map("map");
|
|
||||||
l = new OpenLayers.Layer.WMS('', window.location.href + '#');
|
|
||||||
map.addLayer(l);
|
|
||||||
map.zoomToMaxExtent();
|
|
||||||
|
|
||||||
tile = new OpenLayers.Tile.Image(l, position, bounds, null);
|
|
||||||
t.eq(tile.backBufferMode, 0,
|
|
||||||
'backBufferMode correctly set [tiled]');
|
|
||||||
|
|
||||||
l = new OpenLayers.Layer.WMS('', window.location.href + '#',
|
|
||||||
null, {singleTile: true});
|
|
||||||
map.addLayer(l);
|
|
||||||
|
|
||||||
|
|
||||||
tile = new OpenLayers.Tile.Image(l, position, bounds, null);
|
|
||||||
t.eq(tile.backBufferMode, 1,
|
|
||||||
'backBufferMode correctly set [singleTile]');
|
|
||||||
|
|
||||||
l = new OpenLayers.Layer.WMS('', window.location.href + '#',
|
|
||||||
null, {transitionEffect: 'resize'});
|
|
||||||
map.addLayer(l);
|
|
||||||
tile = new OpenLayers.Tile.Image(l, position, bounds, null);
|
|
||||||
t.eq(tile.backBufferMode, 2,
|
|
||||||
'backBufferMode correctly set [tiled, transition]');
|
|
||||||
|
|
||||||
l = new OpenLayers.Layer.WMS('', window.location.href + '#',
|
|
||||||
null, {singleTile: true,
|
|
||||||
transitionEffect: 'resize'});
|
|
||||||
map.addLayer(l);
|
|
||||||
tile = new OpenLayers.Tile.Image(l, position, bounds, null);
|
|
||||||
t.eq(tile.backBufferMode, 3,
|
|
||||||
'backBufferMode correctly set [singleTile, transition]');
|
|
||||||
map.destroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
function test_setBackBufferData(t) {
|
|
||||||
t.plan(2);
|
|
||||||
|
|
||||||
setUp();
|
|
||||||
|
|
||||||
tile = new OpenLayers.Tile.Image(layer, position, bounds, null);
|
|
||||||
tile.draw();
|
|
||||||
// moveTo calls setBackBufferData
|
|
||||||
tile.moveTo(new OpenLayers.Bounds(1,2,3,4),
|
|
||||||
new OpenLayers.Pixel(30,40), true);
|
|
||||||
t.eq(tile.backBufferData.bounds.toString(), bounds.toString(),
|
|
||||||
"bounds stored correctly");
|
|
||||||
t.eq(tile.backBufferData.resolution, map.getResolution(),
|
|
||||||
"resolution stored correctly");
|
|
||||||
|
|
||||||
tearDown();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function test_updateBackBuffer(t) {
|
|
||||||
t.plan(1);
|
|
||||||
setUp();
|
|
||||||
|
|
||||||
tile = new OpenLayers.Tile.Image(layer, position, bounds, null);
|
|
||||||
tile.draw();
|
|
||||||
tile.isLoading = false;
|
|
||||||
map.zoomIn();
|
|
||||||
tile.updateBackBuffer();
|
|
||||||
t.eq(tile.backBufferData.tile.style.width, (layer.tileSize.w*2)+"%",
|
|
||||||
"backBuffer frame correctly resized");
|
|
||||||
|
|
||||||
tearDown();
|
|
||||||
}
|
|
||||||
|
|
||||||
function test_removeBackBuffer(t) {
|
|
||||||
t.plan(2);
|
|
||||||
setUp();
|
|
||||||
|
|
||||||
tile = new OpenLayers.Tile.Image(layer, position, bounds, null);
|
|
||||||
tile.draw();
|
|
||||||
tile.isLoading = false;
|
|
||||||
map.zoomIn();
|
|
||||||
tile.updateBackBuffer();
|
|
||||||
var backBuffer = tile.backBufferData.tile;
|
|
||||||
tile.removeBackBuffer();
|
|
||||||
t.eq(tile.backBufferData.tile, null,
|
|
||||||
"backBuffer reference removed");
|
|
||||||
t.ok(backBuffer.parentNode !== layer.div,
|
|
||||||
"backBuffer removed from layer");
|
|
||||||
|
|
||||||
tearDown();
|
|
||||||
}
|
|
||||||
|
|
||||||
function test_updateBackBuffer_scaled_layer(t) {
|
|
||||||
t.plan(16);
|
|
||||||
|
|
||||||
//
|
|
||||||
// set up
|
|
||||||
//
|
|
||||||
|
|
||||||
var backBuffer;
|
|
||||||
|
|
||||||
var map = new OpenLayers.Map('map', {
|
|
||||||
resolutions: [32, 16, 8, 4, 2, 1]
|
|
||||||
});
|
|
||||||
var layer = new OpenLayers.Layer.WMS(
|
|
||||||
"WMS",
|
|
||||||
window.location.href + "#",
|
|
||||||
null,
|
|
||||||
{transitionEffect: "resize"}
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
var serverResolitions = layer.serverResolutions;
|
|
||||||
layer.serverResolutions = [32, 16, 8];
|
|
||||||
|
|
||||||
map.addLayer(layer);
|
|
||||||
map.setCenter(new OpenLayers.LonLat(0, 0), 2);
|
|
||||||
|
|
||||||
tile = new OpenLayers.Tile.Image(layer, position, bounds, null);
|
|
||||||
tile.backBufferMode = 2; // transition effect
|
|
||||||
|
|
||||||
// mock createBackBuffer to avoid removing the image
|
|
||||||
// div from the tile
|
|
||||||
tile.insertBackBuffer = function() {
|
|
||||||
return this.frame.cloneNode(false);
|
|
||||||
};
|
|
||||||
tile.removeBackBuffer = function() {
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// test
|
|
||||||
//
|
|
||||||
|
|
||||||
tile.draw();
|
|
||||||
// check initial state
|
|
||||||
t.eq(tile.backBufferData.resolution, 8,
|
|
||||||
'resolution 8 is set in the back buffer data');
|
|
||||||
|
|
||||||
tile.isLoading = false;
|
|
||||||
|
|
||||||
// change resolution from 8 to 4
|
|
||||||
map.zoomTo(3);
|
|
||||||
backBuffer = tile.updateBackBuffer();
|
|
||||||
t.ok(backBuffer == undefined,
|
|
||||||
'[8->4] updateBackBuffer returns undefined');
|
|
||||||
|
|
||||||
// change resolution from 8 to 2
|
|
||||||
map.zoomTo(2); tile.setBackBufferData(); map.zoomTo(4);
|
|
||||||
backBuffer = tile.updateBackBuffer();
|
|
||||||
t.ok(backBuffer == undefined,
|
|
||||||
'[8->2] updateBackBuffer returns undefined');
|
|
||||||
|
|
||||||
// change resolution from 16 to 4
|
|
||||||
map.zoomTo(1); tile.setBackBufferData(); map.zoomTo(3);
|
|
||||||
backBuffer = tile.updateBackBuffer();
|
|
||||||
t.ok(backBuffer != undefined,
|
|
||||||
'[16->4] updateBackBuffer returns a back buffer tile');
|
|
||||||
t.eq(backBuffer.style.width, '512%',
|
|
||||||
'[16->4] back buffer width is as expected');
|
|
||||||
t.eq(backBuffer.style.width, '512%',
|
|
||||||
'[16->4] back buffer height is as expected');
|
|
||||||
|
|
||||||
// change resolution from 32 to 1
|
|
||||||
map.zoomTo(0); tile.setBackBufferData(); map.zoomTo(5);
|
|
||||||
backBuffer = tile.updateBackBuffer();
|
|
||||||
t.ok(backBuffer != undefined,
|
|
||||||
'[32->1] updateBackBuffer returns a back buffer tile');
|
|
||||||
t.eq(backBuffer.style.width, '1024%',
|
|
||||||
'[32->1] back buffer width is as expected');
|
|
||||||
t.eq(backBuffer.style.width, '1024%',
|
|
||||||
'[32->1] back buffer height is as expected');
|
|
||||||
|
|
||||||
// change resolution from 4 to 2
|
|
||||||
map.zoomTo(3); tile.setBackBufferData(); map.zoomTo(4);
|
|
||||||
backBuffer = tile.updateBackBuffer();
|
|
||||||
t.ok(backBuffer == undefined,
|
|
||||||
'[4->2] updateBackBuffer returns undefined');
|
|
||||||
|
|
||||||
// change resolution from 4 to 1
|
|
||||||
map.zoomTo(3); tile.setBackBufferData(); map.zoomTo(5);
|
|
||||||
backBuffer = tile.updateBackBuffer();
|
|
||||||
t.ok(backBuffer == undefined,
|
|
||||||
'[4->1] updateBackBuffer returns undefined');
|
|
||||||
|
|
||||||
// change resolution from 1 to 4
|
|
||||||
map.zoomTo(5); tile.setBackBufferData(); map.zoomTo(3);
|
|
||||||
backBuffer = tile.updateBackBuffer();
|
|
||||||
t.ok(backBuffer == undefined,
|
|
||||||
'[1->4] updateBackBuffer returns undefined');
|
|
||||||
|
|
||||||
// change resolution from 4 to 8
|
|
||||||
map.zoomTo(3); tile.setBackBufferData(); map.zoomTo(2);
|
|
||||||
backBuffer = tile.updateBackBuffer();
|
|
||||||
t.ok(backBuffer == undefined,
|
|
||||||
'[4->8] updateBackBuffer returns undefined');
|
|
||||||
|
|
||||||
// change resolution from 4 to 16
|
|
||||||
map.zoomTo(3); tile.setBackBufferData(); map.zoomTo(1);
|
|
||||||
backBuffer = tile.updateBackBuffer();
|
|
||||||
t.ok(backBuffer != undefined,
|
|
||||||
'[4->16] updateBackBuffer returns a back buffer tile');
|
|
||||||
t.eq(backBuffer.style.width, '128%',
|
|
||||||
'[4->16] back buffer width is as expected');
|
|
||||||
t.eq(backBuffer.style.width, '128%',
|
|
||||||
'[4->16] back buffer height is as expected');
|
|
||||||
|
|
||||||
//
|
|
||||||
// tear down
|
|
||||||
//
|
|
||||||
|
|
||||||
map.removeLayer(layer);
|
|
||||||
map.destroy();
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="map" style="height:550px;width:500px"></div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
+13
-6
@@ -317,8 +317,8 @@
|
|||||||
map.destroy();
|
map.destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
function test_insertBackBuffer(t) {
|
function test_createBackBuffer(t) {
|
||||||
t.plan(4);
|
t.plan(3);
|
||||||
|
|
||||||
var map = new OpenLayers.Map('map');
|
var map = new OpenLayers.Map('map');
|
||||||
var layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
|
var layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
|
||||||
@@ -326,11 +326,18 @@
|
|||||||
map.addLayer(layer);
|
map.addLayer(layer);
|
||||||
map.setCenter(new OpenLayers.LonLat(0,0), 5);
|
map.setCenter(new OpenLayers.LonLat(0,0), 5);
|
||||||
var tile = layer.grid[0][0];
|
var tile = layer.grid[0][0];
|
||||||
|
|
||||||
|
// we're going to create a back buffer while the image
|
||||||
|
// is actually loading, so we call stopObservingElement
|
||||||
|
// to avoid any unexpected behavior
|
||||||
|
tile.isLoading = false;
|
||||||
|
OpenLayers.Event.stopObservingElement(tile.imgDiv);
|
||||||
|
|
||||||
var img = tile.imgDiv;
|
var img = tile.imgDiv;
|
||||||
var backBuffer = tile.insertBackBuffer();
|
var bb = tile.createBackBuffer();
|
||||||
t.eq(backBuffer.style.left, tile.frame.style.left, "backBuffer tile has same left style as frame");
|
t.eq(bb.style.left, tile.frame.style.left,
|
||||||
t.ok(backBuffer.parentNode === layer.div, "backBuffer inserted into layer div");
|
"backbuffer has same left style as frame");
|
||||||
t.ok(backBuffer.firstChild === img, "image appended to backBuffer");
|
t.ok(bb.firstChild === img, "image appended to bb");
|
||||||
t.ok(tile.imgDiv == null, "image reference removed from tile");
|
t.ok(tile.imgDiv == null, "image reference removed from tile");
|
||||||
map.destroy();
|
map.destroy();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
var wmsUrl = "http://labs.metacarta.com/wms/vmap0?";
|
var wmsUrl = "http://labs.metacarta.com/wms/vmap0?";
|
||||||
|
|
||||||
function test_Tile_Image_IFrame_create (t) {
|
function test_Tile_Image_IFrame_create (t) {
|
||||||
t.plan( 5 );
|
t.plan( 3 );
|
||||||
map = new OpenLayers.Map('map');
|
map = new OpenLayers.Map('map');
|
||||||
var bar = new Array(205).join("1234567890");
|
var bar = new Array(205).join("1234567890");
|
||||||
layer = new OpenLayers.Layer.WMS(name, wmsUrl,
|
layer = new OpenLayers.Layer.WMS(name, wmsUrl,
|
||||||
@@ -25,7 +25,6 @@
|
|||||||
map.addLayer(layer);
|
map.addLayer(layer);
|
||||||
|
|
||||||
var tile = layer.addTile(bounds, position);
|
var tile = layer.addTile(bounds, position);
|
||||||
t.eq(tile.backBufferMode, 2, "backBufferMode is 2 after tile creation");
|
|
||||||
|
|
||||||
tile.draw();
|
tile.draw();
|
||||||
t.eq(tile.imgDiv.nodeName.toLowerCase(), "iframe", "IFrame used for long URL");
|
t.eq(tile.imgDiv.nodeName.toLowerCase(), "iframe", "IFrame used for long URL");
|
||||||
@@ -33,7 +32,6 @@
|
|||||||
layer.mergeNewParams({foo: null});
|
layer.mergeNewParams({foo: null});
|
||||||
tile.draw();
|
tile.draw();
|
||||||
t.eq(tile.imgDiv.nodeName.toLowerCase(), "img", "IMG used for short URL");
|
t.eq(tile.imgDiv.nodeName.toLowerCase(), "img", "IMG used for short URL");
|
||||||
t.eq(tile.backBufferMode, 2, "backBufferMode reset to 2");
|
|
||||||
|
|
||||||
tile.maxGetUrlLength = 0;
|
tile.maxGetUrlLength = 0;
|
||||||
tile.draw();
|
tile.draw();
|
||||||
|
|||||||
@@ -224,7 +224,6 @@
|
|||||||
<li>Symbolizer/Text.html</li>
|
<li>Symbolizer/Text.html</li>
|
||||||
<li>Tile.html</li>
|
<li>Tile.html</li>
|
||||||
<li>Tile/Image.html</li>
|
<li>Tile/Image.html</li>
|
||||||
<li>Tile/BackBufferable.html</li>
|
|
||||||
<li>Tile/Image/IFrame.html</li>
|
<li>Tile/Image/IFrame.html</li>
|
||||||
<li>Tile/WFS.html</li>
|
<li>Tile/WFS.html</li>
|
||||||
<li>Tween.html</li>
|
<li>Tween.html</li>
|
||||||
|
|||||||
+4
-6
@@ -7,16 +7,14 @@ if not os.path.exists(path):
|
|||||||
raise Exception("No closure-compiler.jar at %s; read README.txt!" % path)
|
raise Exception("No closure-compiler.jar at %s; read README.txt!" % path)
|
||||||
|
|
||||||
def minimize(code):
|
def minimize(code):
|
||||||
ntf = tempfile.NamedTemporaryFile(delete=False)
|
ntf = tempfile.NamedTemporaryFile()
|
||||||
ntf.write(code)
|
ntf.write(code)
|
||||||
ntf.flush()
|
ntf.flush()
|
||||||
|
|
||||||
ntf2 = tempfile.NamedTemporaryFile(delete=False)
|
ntf2 = tempfile.NamedTemporaryFile()
|
||||||
ntf.close()
|
|
||||||
ntf2.close()
|
|
||||||
|
|
||||||
os.system("java -jar %s --js %s --js_output_file %s" % (path, ntf.name, ntf2.name))
|
os.system("java -jar %s --js %s --js_output_file %s" % (path, ntf.name, ntf2.name))
|
||||||
data = open(ntf2.name).read()
|
data = open(ntf2.name).read()
|
||||||
os.unlink(ntf.name)
|
ntf.close()
|
||||||
os.unlink(ntf2.name)
|
ntf2.close()
|
||||||
return data
|
return data
|
||||||
|
|||||||
+13
-6
@@ -4,14 +4,17 @@
|
|||||||
|
|
||||||
|
|
||||||
# Get current 'Last Changed Rev'
|
# Get current 'Last Changed Rev'
|
||||||
REV=`svn info http://svn.openlayers.org/ | grep 'Revision' | awk '{print $2}'`
|
GITREV=`svn info https://github.com/openlayers/openlayers/ | grep 'Revision' | awk '{print $2}'`
|
||||||
|
SVNREV=`svn info http://svn.openlayers.org/ | grep 'Revision' | awk '{print $2}'`
|
||||||
|
|
||||||
# Get the last svn rev
|
# Get the last svn rev
|
||||||
|
touch /tmp/ol_git_rev
|
||||||
touch /tmp/ol_svn_rev
|
touch /tmp/ol_svn_rev
|
||||||
OLD_REV="o`cat /tmp/ol_svn_rev`"
|
OLD_GITREV="o`cat /tmp/ol_git_rev`"
|
||||||
|
OLD_SVNREV="o`cat /tmp/ol_svn_rev`"
|
||||||
|
|
||||||
# If they're not equal, do some work.
|
# If they're not equal, do some work.
|
||||||
if [ ! o$REV = $OLD_REV ]; then
|
if [ ! o$GITREV = $OLD_GITREV ]; then
|
||||||
svn revert -R /osgeo/openlayers/docs/dev
|
svn revert -R /osgeo/openlayers/docs/dev
|
||||||
svn up /osgeo/openlayers/docs/dev
|
svn up /osgeo/openlayers/docs/dev
|
||||||
|
|
||||||
@@ -37,10 +40,14 @@ if [ ! o$REV = $OLD_REV ]; then
|
|||||||
sed -i -e 's!../lib/OpenLayers.js!../OpenLayers.js!' examples/*.html
|
sed -i -e 's!../lib/OpenLayers.js!../OpenLayers.js!' examples/*.html
|
||||||
naturaldocs -i /osgeo/openlayers/docs/dev/lib -o HTML /osgeo/openlayers/dev/apidocs -p /osgeo/openlayers/docs/dev/apidoc_config -s Default OL >/dev/null
|
naturaldocs -i /osgeo/openlayers/docs/dev/lib -o HTML /osgeo/openlayers/dev/apidocs -p /osgeo/openlayers/docs/dev/apidoc_config -s Default OL >/dev/null
|
||||||
naturaldocs -i /osgeo/openlayers/docs/dev/lib -o HTML /osgeo/openlayers/dev/docs -p /osgeo/openlayers/docs/dev/doc_config -s Default OL >/dev/null
|
naturaldocs -i /osgeo/openlayers/docs/dev/lib -o HTML /osgeo/openlayers/dev/docs -p /osgeo/openlayers/docs/dev/doc_config -s Default OL >/dev/null
|
||||||
|
|
||||||
svn up /osgeo/openlayers/dev/sandbox/
|
|
||||||
# Record the revision
|
# Record the revision
|
||||||
echo -n $REV > /tmp/ol_svn_rev
|
echo -n $GITREV > /tmp/ol_git_rev
|
||||||
|
fi
|
||||||
|
if [ ! o$SVNREV = $OLD_SVNREV ]; then
|
||||||
|
svn up /osgeo/openlayers/dev/sandbox/
|
||||||
|
svn up /osgeo/openlayers/dev/addins/
|
||||||
|
# Record the revision
|
||||||
|
echo -n $SVNREV > /tmp/ol_svn_rev
|
||||||
fi
|
fi
|
||||||
|
|
||||||
svn up /osgeo/openlayers/documentation-checkout
|
svn up /osgeo/openlayers/documentation-checkout
|
||||||
|
|||||||
Reference in New Issue
Block a user