Merge branch 'master' into 3526
This commit is contained in:
@@ -98,6 +98,13 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
|
||||
*/
|
||||
tileLoadingDelay: 100,
|
||||
|
||||
/**
|
||||
* Property: serverResolutions
|
||||
* {Array(Number}} This property is documented in subclasses as
|
||||
* an API property.
|
||||
*/
|
||||
serverResolutions: null,
|
||||
|
||||
/**
|
||||
* Property: timerId
|
||||
* {Number} - The id of the tileLoadingDelay timer.
|
||||
@@ -221,8 +228,9 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
|
||||
* dragging - {Boolean}
|
||||
*/
|
||||
moveTo:function(bounds, zoomChanged, dragging) {
|
||||
|
||||
OpenLayers.Layer.HTTPRequest.prototype.moveTo.apply(this, arguments);
|
||||
|
||||
|
||||
bounds = bounds || this.map.getExtent();
|
||||
|
||||
if (bounds != null) {
|
||||
@@ -238,18 +246,41 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
|
||||
// We want to redraw whenever even the slightest part of the
|
||||
// current bounds is not contained by our tile.
|
||||
// (thus, we do not specify partial -- its default is false)
|
||||
if ( forceReTile ||
|
||||
if ( forceReTile ||
|
||||
(!dragging && !tilesBounds.containsBounds(bounds))) {
|
||||
this.initSingleTile(bounds);
|
||||
}
|
||||
} else {
|
||||
|
||||
|
||||
// if the bounds have changed such that they are not even
|
||||
// *partially* contained by our tiles (IE user has
|
||||
// programmatically panned to the other side of the earth)
|
||||
// then we want to reTile (thus, partial true).
|
||||
//
|
||||
if (forceReTile || !tilesBounds.containsBounds(bounds, true)) {
|
||||
|
||||
forceReTile = forceReTile ||
|
||||
!tilesBounds.containsBounds(bounds, true);
|
||||
|
||||
var resolution = this.map.getResolution();
|
||||
var serverResolution =
|
||||
this.getServerResolution(resolution);
|
||||
|
||||
if(resolution !== serverResolution) {
|
||||
bounds = this.map.calculateBounds(null, serverResolution);
|
||||
if(forceReTile) {
|
||||
// stretch the layer div
|
||||
var scale = serverResolution / resolution;
|
||||
this.transformDiv(scale);
|
||||
}
|
||||
} else {
|
||||
// reset the layer width, height, left, top, to deal with
|
||||
// the case where the layer was previously transformed
|
||||
this.div.style.width = '100%';
|
||||
this.div.style.height = '100%';
|
||||
this.div.style.left = '0%';
|
||||
this.div.style.top = '0%';
|
||||
}
|
||||
|
||||
if(forceReTile) {
|
||||
this.initGriddedTiles(bounds);
|
||||
} else {
|
||||
this.scheduleMoveGriddedTiles();
|
||||
@@ -258,6 +289,88 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: getServerResolution
|
||||
* Return the server-supported resolution that is the closest to
|
||||
* the resolution passed as a parameter. If no resolution is
|
||||
* passed the map resolution is used.
|
||||
*
|
||||
* Parameters:
|
||||
* resolution - {Number} The base resolution.
|
||||
*
|
||||
* Returns:
|
||||
* {Number} The closest server supported resolution.
|
||||
*/
|
||||
getServerResolution: function(resolution) {
|
||||
resolution = resolution || this.map.getResolution();
|
||||
if(this.serverResolutions &&
|
||||
OpenLayers.Util.indexOf(this.serverResolutions, resolution) === -1) {
|
||||
var i, serverResolution;
|
||||
for(var i=this.serverResolutions.length-1; i>= 0; i--) {
|
||||
serverResolution = this.serverResolutions[i];
|
||||
if(serverResolution > resolution) {
|
||||
resolution = serverResolution;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(i === -1) {
|
||||
throw 'no appropriate resolution in serverResolutions';
|
||||
}
|
||||
}
|
||||
return resolution;
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: getServerZoom
|
||||
* Return the zoom value corresponding to the best zoom supported by the server
|
||||
* resolution.
|
||||
*
|
||||
* Returns:
|
||||
* {Number} The closest server supported zoom.
|
||||
*/
|
||||
getServerZoom: function() {
|
||||
return this.map.getZoomForResolution(this.getServerResolution());
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: transformDiv
|
||||
* Transform the layer div.
|
||||
*
|
||||
* Parameters:
|
||||
* scale - {Number} The value by which the layer div is to
|
||||
* be scaled.
|
||||
*/
|
||||
transformDiv: function(scale) {
|
||||
|
||||
// scale the layer div
|
||||
|
||||
this.div.style.width = 100 * scale + '%';
|
||||
this.div.style.height = 100 * scale + '%';
|
||||
|
||||
// and translate the layer div as necessary
|
||||
|
||||
var size = this.map.getSize();
|
||||
var lcX = parseInt(this.map.layerContainerDiv.style.left, 10);
|
||||
var lcY = parseInt(this.map.layerContainerDiv.style.top, 10);
|
||||
var x = (lcX - (size.w / 2.)) * (scale - 1);
|
||||
var y = (lcY - (size.h / 2.)) * (scale - 1);
|
||||
|
||||
this.div.style.left = x + '%';
|
||||
this.div.style.top = y + '%';
|
||||
},
|
||||
|
||||
|
||||
/**
|
||||
* Method: getResolutionScale
|
||||
* Return the value by which the layer is currently scaled.
|
||||
*
|
||||
* Returns:
|
||||
* {Number} The resolution scale.
|
||||
*/
|
||||
getResolutionScale: function() {
|
||||
return parseInt(this.div.style.width, 10) / 100;
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: moveByPx
|
||||
* Move the layer based on pixel vector.
|
||||
@@ -465,7 +578,7 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
|
||||
* bounds - {<OpenLayers.Bounds>}
|
||||
*/
|
||||
initGriddedTiles:function(bounds) {
|
||||
|
||||
|
||||
// work out mininum number of rows and columns; this is the number of
|
||||
// tiles required to cover the viewport plus at least one for panning
|
||||
|
||||
@@ -476,7 +589,7 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
|
||||
Math.max(1, 2 * this.buffer);
|
||||
|
||||
var origin = this.getTileOrigin();
|
||||
var resolution = this.map.getResolution();
|
||||
var resolution = this.getServerResolution();
|
||||
|
||||
var tileLayout = this.calculateGridLayout(bounds, origin, resolution);
|
||||
|
||||
@@ -498,7 +611,7 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
|
||||
|
||||
var layerContainerDivLeft = parseInt(this.map.layerContainerDiv.style.left);
|
||||
var layerContainerDivTop = parseInt(this.map.layerContainerDiv.style.top);
|
||||
|
||||
|
||||
|
||||
do {
|
||||
var row = this.grid[rowidx++];
|
||||
@@ -707,17 +820,25 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
|
||||
moveGriddedTiles: function() {
|
||||
var shifted = true;
|
||||
var buffer = this.buffer || 1;
|
||||
var tlLayer = this.grid[0][0].position;
|
||||
var scale = this.getResolutionScale();
|
||||
var tlLayer = this.grid[0][0].position.clone();
|
||||
tlLayer.x *= scale;
|
||||
tlLayer.y *= scale;
|
||||
tlLayer = tlLayer.add(parseInt(this.div.style.left, 10),
|
||||
parseInt(this.div.style.top, 10));
|
||||
var offsetX = parseInt(this.map.layerContainerDiv.style.left);
|
||||
var offsetY = parseInt(this.map.layerContainerDiv.style.top);
|
||||
var tlViewPort = tlLayer.add(offsetX, offsetY);
|
||||
if (tlViewPort.x > -this.tileSize.w * (buffer - 1)) {
|
||||
var tileSize = this.tileSize.clone();
|
||||
tileSize.w *= scale;
|
||||
tileSize.h *= scale;
|
||||
if (tlViewPort.x > -tileSize.w * (buffer - 1)) {
|
||||
this.shiftColumn(true);
|
||||
} else if (tlViewPort.x < -this.tileSize.w * buffer) {
|
||||
} else if (tlViewPort.x < -tileSize.w * buffer) {
|
||||
this.shiftColumn(false);
|
||||
} else if (tlViewPort.y > -this.tileSize.h * (buffer - 1)) {
|
||||
} else if (tlViewPort.y > -tileSize.h * (buffer - 1)) {
|
||||
this.shiftRow(true);
|
||||
} else if (tlViewPort.y < -this.tileSize.h * buffer) {
|
||||
} else if (tlViewPort.y < -tileSize.h * buffer) {
|
||||
this.shiftRow(false);
|
||||
} else {
|
||||
shifted = false;
|
||||
@@ -743,7 +864,7 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
|
||||
var grid = this.grid;
|
||||
var modelRow = grid[modelRowIndex];
|
||||
|
||||
var resolution = this.map.getResolution();
|
||||
var resolution = this.getServerResolution();
|
||||
var deltaY = (prepend) ? -this.tileSize.h : this.tileSize.h;
|
||||
var deltaLat = resolution * -deltaY;
|
||||
|
||||
@@ -776,7 +897,7 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
|
||||
*/
|
||||
shiftColumn: function(prepend) {
|
||||
var deltaX = (prepend) ? -this.tileSize.w : this.tileSize.w;
|
||||
var resolution = this.map.getResolution();
|
||||
var resolution = this.getServerResolution();
|
||||
var deltaLon = resolution * deltaX;
|
||||
|
||||
for (var i=0, len=this.grid.length; i<len; i++) {
|
||||
@@ -799,7 +920,7 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
/**
|
||||
* Method: removeExcessTiles
|
||||
* When the size of the map or the buffer changes, we may need to
|
||||
|
||||
Reference in New Issue
Block a user