From b7e7a9b3ba7df61d2906aa8b2427fc9b6a22f36c Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sat, 4 Aug 2012 16:45:11 +0200 Subject: [PATCH] Add zoom to/from anchor --- src/ol/control/control.js | 33 ++++++++++++++++++++++++++------ src/ol/control/dblclickzoom.js | 3 ++- src/ol/control/keyboardzoom.js | 3 ++- src/ol/control/mousewheelzoom.js | 3 ++- 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/ol/control/control.js b/src/ol/control/control.js index b8eefd1b31..9195848924 100644 --- a/src/ol/control/control.js +++ b/src/ol/control/control.js @@ -80,15 +80,36 @@ ol.Control.prototype.setResolution = function(map, resolution) { /** * @param {ol.Map} map Map. + * @param {number|undefined} resolution Resolution. * @param {number} delta Delta. * @param {ol.Coordinate=} opt_anchor Anchor. */ -ol.Control.prototype.zoom = function(map, delta, opt_anchor) { - //if (false && goog.isDef(opt_anchor)) { - // FIXME - //} else { - var resolution = map.getResolution(); +ol.Control.prototype.zoom = function(map, resolution, delta, opt_anchor) { + if (goog.isDefAndNotNull(opt_anchor)) { + var mapCenter = /** @type {!ol.Coordinate} */ map.getCenter(); + var mapResolution = map.getResolution(); + resolution = this.constraints.resolution(resolution, delta); + var center; + if (resolution < mapResolution) { + center = opt_anchor.clone(); + center.subtract(mapCenter); + center.scale(resolution / mapResolution); + center.add(mapCenter); + } else if (resolution == mapResolution) { + center = mapCenter; + } else { + center = mapCenter.clone(); + center.subtract(opt_anchor); + center.scale(resolution / mapResolution); + center.add(opt_anchor); + } + center = this.constraints.center(center, resolution, ol.Coordinate.ZERO); + map.withFrozenRendering(function() { + map.setCenter(center); + map.setResolution(resolution); + }); + } else { resolution = this.constraints.resolution(resolution, delta); map.setResolution(resolution); - //} + } }; diff --git a/src/ol/control/dblclickzoom.js b/src/ol/control/dblclickzoom.js index 1ffef392f7..0241916588 100644 --- a/src/ol/control/dblclickzoom.js +++ b/src/ol/control/dblclickzoom.js @@ -25,9 +25,10 @@ ol.control.DblClickZoom.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { if (mapBrowserEvent.type == goog.events.EventType.DBLCLICK) { var map = mapBrowserEvent.map; + var resolution = map.getResolution(); var delta = mapBrowserEvent.browserEvent.shiftKey ? -1 : 1; var anchor = mapBrowserEvent.getCoordinate(); - this.zoom(map, delta, anchor); + this.zoom(map, resolution, delta, anchor); mapBrowserEvent.preventDefault(); } }; diff --git a/src/ol/control/keyboardzoom.js b/src/ol/control/keyboardzoom.js index c6cb3e2076..97dff8658b 100644 --- a/src/ol/control/keyboardzoom.js +++ b/src/ol/control/keyboardzoom.js @@ -29,8 +29,9 @@ ol.control.KeyboardZoom.prototype.handleMapBrowserEvent = var charCode = keyEvent.charCode; if (charCode == '+'.charCodeAt(0) || charCode == '-'.charCodeAt(0)) { var map = mapBrowserEvent.map; + var resolution = map.getResolution(); var delta = charCode == '+'.charCodeAt(0) ? 1 : -1; - this.zoom(map, delta); + this.zoom(map, resolution, delta); keyEvent.preventDefault(); mapBrowserEvent.preventDefault(); } diff --git a/src/ol/control/mousewheelzoom.js b/src/ol/control/mousewheelzoom.js index 849a633cb4..9b55cab962 100644 --- a/src/ol/control/mousewheelzoom.js +++ b/src/ol/control/mousewheelzoom.js @@ -31,8 +31,9 @@ ol.control.MouseWheelZoom.prototype.handleMapBrowserEvent = goog.asserts.assert(mouseWheelEvent instanceof goog.events.MouseWheelEvent); if (mouseWheelEvent.deltaY !== 0) { var delta = mouseWheelEvent.deltaY < 0 ? 1 : -1; + var resolution = map.getResolution(); var anchor = mapBrowserEvent.getCoordinate(); - this.zoom(map, delta, anchor); + this.zoom(map, resolution, delta, anchor); mapBrowserEvent.preventDefault(); mouseWheelEvent.preventDefault(); }