diff --git a/src/ol/Map.js b/src/ol/Map.js index 3dfb3da70e..de9f98a0e3 100644 --- a/src/ol/Map.js +++ b/src/ol/Map.js @@ -298,16 +298,43 @@ ol.Map.prototype.setCenter = function(center) { /** - * @param {number} zoom * @param {ol.Loc} center + * @param {number} zoom */ -ol.Map.prototype.zoomTo = function(zoom, center) { +ol.Map.prototype.setCenterAndZoom = function(center, zoom) { this.zoom_ = this.limitZoom(zoom); this.center_ = center; this.conditionallyRender(); }; +/** + * @param {number} zoom The zoom level to zoom to + * @param {goog.math.Coordinate|{x: number, y: number}=} opt_anchor + * Optional anchor pixel for the zoom origin. + */ +ol.Map.prototype.setZoom = function(zoom, opt_anchor) { + var currentZoom = this.zoom_, + newZoom = this.limitZoom(zoom), + newCenter; + if (newZoom === currentZoom) { + return; + } + if (goog.isDef(opt_anchor)) { + var size = this.getSize(), + anchorLoc = this.getLocForPixel(opt_anchor), + newRes = this.getResolutionForZoom(newZoom); + newCenter = new ol.Loc( + anchorLoc.getX() + (size.width/2 - opt_anchor.x) * newRes, + anchorLoc.getY() - (size.height/2 - opt_anchor.y) * newRes + ); + } else { + newCenter = this.center_; + } + this.setCenterAndZoom(newCenter, newZoom); +}; + + /** * @param {ol.Projection} projection Projection. */ @@ -324,18 +351,6 @@ ol.Map.prototype.setUserProjection = function(userProjection) { }; -/** - * @param {number} zoom Zoom. - */ -ol.Map.prototype.setZoom = function(zoom) { - zoom = this.limitZoom(zoom); - if (zoom !== this.zoom_) { - this.zoom_ = zoom; - this.conditionallyRender(); - } -}; - - /** * @param {number} zoom * @return {number} zoom clamped to the range of available zoom levels.