From 46f63f135842faea0d3a16e0bd64448f81186c73 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Dec 2013 13:13:22 +0100 Subject: [PATCH 1/6] Add crossOrigin option to ol.source.OSM options --- src/objectliterals.jsdoc | 2 ++ src/ol/source/osmsource.js | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/objectliterals.jsdoc b/src/objectliterals.jsdoc index e9c0fe5c09..709810cf94 100644 --- a/src/objectliterals.jsdoc +++ b/src/objectliterals.jsdoc @@ -665,6 +665,8 @@ /** * @typedef {Object} ol.source.OSMOptions * @property {Array.|undefined} attributions Attributions. + * @property {null|string|undefined} crossOrigin crossOrigin setting for image + * requests. Default is `anonymous`. * @property {number|undefined} maxZoom Max zoom. * @property {ol.TileLoadFunctionType|undefined} tileLoadFunction Optional * function to load a tile given a URL. diff --git a/src/ol/source/osmsource.js b/src/ol/source/osmsource.js index 92e13ec6b8..96012bc18d 100644 --- a/src/ol/source/osmsource.js +++ b/src/ol/source/osmsource.js @@ -22,12 +22,15 @@ ol.source.OSM = function(opt_options) { attributions = ol.source.OSM.ATTRIBUTIONS; } + var crossOrigin = goog.isDef(options.crossOrigin) ? + options.crossOrigin : 'anonymous'; + var url = goog.isDef(options.url) ? options.url : 'http://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png'; goog.base(this, { attributions: attributions, - crossOrigin: 'anonymous', + crossOrigin: crossOrigin, opaque: true, maxZoom: options.maxZoom, tileLoadFunction: options.tileLoadFunction, From aa10a542ae23f382c76a7094682a6077b37bdc6d Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 13 Dec 2013 22:03:24 +0100 Subject: [PATCH 2/6] Add OpenSeaMap layer to localized-openstreetmap example --- examples/localized-openstreetmap.html | 4 +- examples/localized-openstreetmap.js | 53 +++++++++++++++++++-------- 2 files changed, 39 insertions(+), 18 deletions(-) diff --git a/examples/localized-openstreetmap.html b/examples/localized-openstreetmap.html index 4cbfa2c000..7f4d64e0e8 100644 --- a/examples/localized-openstreetmap.html +++ b/examples/localized-openstreetmap.html @@ -32,11 +32,11 @@

Localized OpenStreetMap example

-

Example of a localized OpenStreetMap map with a custom tile server and a custom attribution.

+

Example of a localized OpenStreetMap map with a custom tile server and a custom attribution. The base layer is OpenCycleMap with an overlay from OpenSeaMap. The OpenSeaMap tile server does not support CORS headers.

See the localized-openstreetmap.js source to see how this is done.

-
localized-openstreetmap, openstreetmap
+
cors, localized-openstreetmap, openseamap, openstreetmap
diff --git a/examples/localized-openstreetmap.js b/examples/localized-openstreetmap.js index a640c42e41..11857960d9 100644 --- a/examples/localized-openstreetmap.js +++ b/examples/localized-openstreetmap.js @@ -1,31 +1,52 @@ goog.require('ol.Attribution'); goog.require('ol.Map'); -goog.require('ol.RendererHints'); +goog.require('ol.RendererHint'); goog.require('ol.View2D'); goog.require('ol.layer.Tile'); goog.require('ol.source.OSM'); +// tiles.openseamap.org does not set CORS headers, so we have to disable +// crossOrigin and we cannot use WebGL. + +var openCycleMapLayer = new ol.layer.Tile({ + source: new ol.source.OSM({ + attributions: [ + new ol.Attribution({ + html: 'All maps © ' + + 'OpenCycleMap' + }), + ol.source.OSM.DATA_ATTRIBUTION + ], + url: 'http://{a-c}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png' + }) +}); + +var openSeaMapLayer = new ol.layer.Tile({ + source: new ol.source.OSM({ + attributions: [ + new ol.Attribution({ + html: 'All maps © ' + + 'OpenSeaMap' + }), + ol.source.OSM.DATA_ATTRIBUTION + ], + crossOrigin: null, + url: 'http://tiles.openseamap.org/seamark/{z}/{x}/{y}.png' + }) +}); + + var map = new ol.Map({ layers: [ - new ol.layer.Tile({ - source: new ol.source.OSM({ - attributions: [ - new ol.Attribution({ - html: 'All maps © ' + - 'OpenCycleMap' - }), - ol.source.OSM.DATA_ATTRIBUTION - ], - url: 'http://{a-c}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png' - }) - }) + openCycleMapLayer, + openSeaMapLayer ], - renderers: ol.RendererHints.createFromQueryData(), + renderer: ol.RendererHint.CANVAS, target: 'map', view: new ol.View2D({ maxZoom: 18, - center: [-172857, 5977746], - zoom: 12 + center: [-244780.24508882355, 5986452.183179816], + zoom: 15 }) }); From 59e04c5371bb0c06719cf526eb03f70008f218dd Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Mon, 16 Dec 2013 09:53:28 +0100 Subject: [PATCH 3/6] Use ol.extent.* functions in ol.source.MapGuide --- src/ol/source/mapguidesource.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/ol/source/mapguidesource.js b/src/ol/source/mapguidesource.js index a8ddc8484b..7c20c7468c 100644 --- a/src/ol/source/mapguidesource.js +++ b/src/ol/source/mapguidesource.js @@ -94,8 +94,8 @@ ol.source.MapGuide.prototype.getImage = * @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]; + var mcsW = ol.extent.getWidth(extent); + var mcsH = ol.extent.getHeight(extent); var devW = size[0]; var devH = size[1]; var dpi = 96; @@ -120,6 +120,7 @@ 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 center = ol.extent.getCenter(extent); var baseParams = { 'OPERATION': this.useOverlay_ ? 'GETDYNAMICMAPOVERLAYIMAGE' : 'GETMAPIMAGE', 'VERSION': '2.0.0', @@ -130,8 +131,8 @@ ol.source.MapGuide.prototype.getUrl = '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); From ede84739c4d54a4914944478b138727015d2933c Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Mon, 16 Dec 2013 09:58:27 +0100 Subject: [PATCH 4/6] Add displayDpi option to ol.source.MapGuide constructor --- src/objectliterals.jsdoc | 1 + src/ol/source/mapguidesource.js | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) 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 7c20c7468c..0a0d51cb1e 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} @@ -98,7 +105,7 @@ ol.source.MapGuide.prototype.getScale = function(extent, size) { var mcsH = ol.extent.getHeight(extent); var devW = size[0]; var devH = size[1]; - var dpi = 96; + var dpi = this.displayDpi_; var mpu = this.metersPerUnit_; var mpp = 0.0254 / dpi; if (devH * mcsW > devW * mcsH) { @@ -127,7 +134,7 @@ ol.source.MapGuide.prototype.getUrl = '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, From b381536b2a02a5cf4d5bd63f6a2bcbae80013847 Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Mon, 16 Dec 2013 10:31:48 +0100 Subject: [PATCH 5/6] Add ol.source.MapGuide.getScale function --- src/ol/source/mapguidesource.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/ol/source/mapguidesource.js b/src/ol/source/mapguidesource.js index 0a0d51cb1e..8389f17f10 100644 --- a/src/ol/source/mapguidesource.js +++ b/src/ol/source/mapguidesource.js @@ -98,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) { +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 = this.displayDpi_; - 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 } }; @@ -126,7 +126,8 @@ 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', From fad3251545422a1202fb04c7cc31178a6d5bf8de Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 15 Dec 2013 22:33:14 +0100 Subject: [PATCH 6/6] Add ol.structs.RBush#getExtent --- src/ol/structs/rbush.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/ol/structs/rbush.js b/src/ol/structs/rbush.js index 8f45d27cb6..7e8ff0ff50 100644 --- a/src/ol/structs/rbush.js +++ b/src/ol/structs/rbush.js @@ -522,6 +522,15 @@ ol.structs.RBush.prototype.getAllInExtent = function(extent) { }; +/** + * @param {ol.Extent=} opt_extent Extent. + * @return {ol.Extent} Extent. + */ +ol.structs.RBush.prototype.getExtent = function(opt_extent) { + return ol.extent.returnOrUpdate(this.root_.extent, opt_extent); +}; + + /** * @param {T} value Value. * @private