diff --git a/examples/wms-image-custom-proj.js b/examples/wms-image-custom-proj.js index 80262a7c03..4548247b84 100644 --- a/examples/wms-image-custom-proj.js +++ b/examples/wms-image-custom-proj.js @@ -28,6 +28,7 @@ var layers = [ 'LAYERS': 'ch.swisstopo.pixelkarte-farbe-pk1000.noscale', 'FORMAT': 'image/jpeg' }, + serverType: 'mapserver', extent: extent }) }), @@ -42,6 +43,7 @@ var layers = [ 'National parks / geo.admin.ch' })], params: {'LAYERS': 'ch.bafu.schutzgebiete-paerke_nationaler_bedeutung'}, + serverType: 'mapserver', extent: extent }) }) diff --git a/examples/wms-image.js b/examples/wms-image.js index f6c753779e..dd495aac46 100644 --- a/examples/wms-image.js +++ b/examples/wms-image.js @@ -15,6 +15,7 @@ var layers = [ source: new ol.source.ImageWMS({ url: 'http://demo.opengeo.org/geoserver/wms', params: {'LAYERS': 'topp:states'}, + serverType: 'geoserver', extent: [-13884991, 2870341, -7455066, 6338219] }) }) diff --git a/examples/wms-no-proj.js b/examples/wms-no-proj.js index 09e7da57a8..260961b6b6 100644 --- a/examples/wms-no-proj.js +++ b/examples/wms-no-proj.js @@ -37,6 +37,7 @@ var layers = [ })], crossOrigin: 'anonymous', params: {'LAYERS': 'ch.bafu.schutzgebiete-paerke_nationaler_bedeutung'}, + serverType: 'mapserver', url: 'http://wms.geo.admin.ch/' }) }) diff --git a/src/objectliterals.jsdoc b/src/objectliterals.jsdoc index 375d0ea464..3fb309839e 100644 --- a/src/objectliterals.jsdoc +++ b/src/objectliterals.jsdoc @@ -516,6 +516,9 @@ * @property {ol.Extent|undefined} extent Extent. * @property {boolean|undefined} hidpi Use the `ol.Map#devicePixelRatio` value when * requesting the image from the remote server. Default is `true`. + * @property {ol.source.wms.ServerType|undefined} serverType The type of the remote WMS + * server: `mapserver`, `geoserver` or `qgis`. Only needed if `hidpi` is `true`. + * Default is `undefined`. * @property {boolean|undefined} useOverlay If `true`, will use * `GETDYNAMICMAPOVERLAYIMAGE`. * @property {ol.proj.ProjectionLike} projection Projection. diff --git a/src/ol/source/imagewmssource.js b/src/ol/source/imagewmssource.js index a52a8b698f..89b228408c 100644 --- a/src/ol/source/imagewmssource.js +++ b/src/ol/source/imagewmssource.js @@ -38,6 +38,12 @@ ol.source.ImageWMS = function(options) { imageUrlFunction: imageUrlFunction }); + /** + * @private + * @type {ol.source.wms.ServerType|undefined} + */ + this.serverType_ = options.serverType; + /** * @private * @type {boolean} @@ -92,6 +98,11 @@ ol.source.ImageWMS.prototype.getImage = var height = (extent[3] - extent[1]) / resolution; var size = [width * pixelRatio, height * pixelRatio]; + if (goog.isDef(this.serverType_) && pixelRatio > 1) { + var param = ol.source.wms.getDpiParam(this.serverType_, pixelRatio); + goog.object.extend(this.params_, param); + } + this.image_ = this.createImage( extent, resolution, pixelRatio, size, projection); return this.image_; diff --git a/src/ol/source/wmssource.js b/src/ol/source/wmssource.js index 9fdd7a80ad..47e8968d1e 100644 --- a/src/ol/source/wmssource.js +++ b/src/ol/source/wmssource.js @@ -1,9 +1,20 @@ goog.provide('ol.source.wms'); +goog.require('goog.asserts'); goog.require('goog.object'); goog.require('goog.uri.utils'); +/** + * @enum {string} + */ +ol.source.wms.ServerType = { + MAPSERVER: 'mapserver', + GEOSERVER: 'geoserver', + QGIS: 'qgis' +}; + + /** * @param {string} baseUrl WMS base URL. * @param {Object.} params Request parameters. @@ -12,8 +23,7 @@ goog.require('goog.uri.utils'); * @param {ol.proj.Projection} projection Projection. * @return {string} WMS GetMap request URL. */ -ol.source.wms.getUrl = - function(baseUrl, params, extent, size, projection) { +ol.source.wms.getUrl = function(baseUrl, params, extent, size, projection) { var baseParams = { 'SERVICE': 'WMS', 'VERSION': '1.3.0', @@ -40,3 +50,23 @@ ol.source.wms.getUrl = return goog.uri.utils.appendParamsFromMap(baseUrl, baseParams); }; + + +/** + * @param {ol.source.wms.ServerType} serverType Server name. + * @param {number} pixelRatio Pixel ratio. + * @return {Object.} + */ +ol.source.wms.getDpiParam = function(serverType, pixelRatio) { + var param = {}; + if (serverType == ol.source.wms.ServerType.MAPSERVER) { + param['MAP_RESOLUTION'] = 90 * pixelRatio; + } else if (serverType == ol.source.wms.ServerType.GEOSERVER) { + param['FORMAT_OPTION'] = 'dpi:' + 90 * pixelRatio; + } else if (serverType == ol.source.wms.ServerType.QGIS) { + param['DPI'] = 90 * pixelRatio; + } else { + goog.asserts.fail(); + } + return param; +};