diff --git a/src/objectliterals.jsdoc b/src/objectliterals.jsdoc index c6eec5c892..8f9a3053fc 100644 --- a/src/objectliterals.jsdoc +++ b/src/objectliterals.jsdoc @@ -635,6 +635,7 @@ /** * @typedef {Object} olx.source.MapGuideOptions * @property {string|undefined} url The mapagent url. + * @property {number|undefined} displayDpi The display resolution. Default is `96`. * @property {number|undefined} metersPerUnit The meters-per-unit value. Default is `1`. * @property {ol.Extent|undefined} extent Extent. * @property {boolean|undefined} useOverlay If `true`, will use diff --git a/src/ol/source/mapguidesource.js b/src/ol/source/mapguidesource.js index a8ddc8484b..8389f17f10 100644 --- a/src/ol/source/mapguidesource.js +++ b/src/ol/source/mapguidesource.js @@ -31,6 +31,13 @@ ol.source.MapGuide = function(options) { imageUrlFunction: imageUrlFunction }); + /** + * @private + * @type {number} + */ + this.displayDpi_ = goog.isDef(options.displayDpi) ? + options.displayDpi : 96; + /** * @private * @type {number} @@ -91,20 +98,20 @@ ol.source.MapGuide.prototype.getImage = /** * @param {ol.Extent} extent The map extents. * @param {ol.Size} size the viewport size. + * @param {number} metersPerUnit The meters-per-unit value. + * @param {number} dpi The display resolution. * @return {number} The computed map scale. */ -ol.source.MapGuide.prototype.getScale = function(extent, size) { - var mcsW = extent[2] - extent[0]; - var mcsH = extent[3] - extent[1]; +ol.source.MapGuide.getScale = function(extent, size, metersPerUnit, dpi) { + var mcsW = ol.extent.getWidth(extent); + var mcsH = ol.extent.getHeight(extent); var devW = size[0]; var devH = size[1]; - var dpi = 96; - var mpu = this.metersPerUnit_; var mpp = 0.0254 / dpi; if (devH * mcsW > devW * mcsH) { - return mcsW * mpu / (devW * mpp); // width limited + return mcsW * metersPerUnit / (devW * mpp); // width limited } else { - return mcsH * mpu / (devH * mpp); // height limited + return mcsH * metersPerUnit / (devH * mpp); // height limited } }; @@ -119,19 +126,21 @@ ol.source.MapGuide.prototype.getScale = function(extent, size) { */ ol.source.MapGuide.prototype.getUrl = function(baseUrl, params, extent, size, projection) { - var scale = this.getScale(extent, size); + var scale = ol.source.MapGuide.getScale(extent, size, + this.metersPerUnit_, this.displayDpi_); + var center = ol.extent.getCenter(extent); var baseParams = { 'OPERATION': this.useOverlay_ ? 'GETDYNAMICMAPOVERLAYIMAGE' : 'GETMAPIMAGE', 'VERSION': '2.0.0', 'LOCALE': 'en', 'CLIENTAGENT': 'ol.source.MapGuide source', 'CLIP': '1', - 'SETDISPLAYDPI': 96, + 'SETDISPLAYDPI': this.displayDpi_, 'SETDISPLAYWIDTH': Math.round(size[0]), 'SETDISPLAYHEIGHT': Math.round(size[1]), 'SETVIEWSCALE': scale, - 'SETVIEWCENTERX': (extent[0] + extent[2]) / 2, - 'SETVIEWCENTERY': (extent[1] + extent[3]) / 2 + 'SETVIEWCENTERX': center[0], + 'SETVIEWCENTERY': center[1] }; goog.object.extend(baseParams, params); return goog.uri.utils.appendParamsFromMap(baseUrl, baseParams);