From dd5e7693da523aa25038b486a47613c519e1cba1 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Fri, 11 Oct 2013 17:19:59 -0600 Subject: [PATCH 1/6] General purpose getCorner function for extents --- src/ol/extent.js | 37 +++++++++++++++++++++++++++++++++++++ test/spec/ol/extent.test.js | 26 ++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/src/ol/extent.js b/src/ol/extent.js index 1f7d84bfdb..b9a8f134e1 100644 --- a/src/ol/extent.js +++ b/src/ol/extent.js @@ -1,5 +1,6 @@ goog.provide('ol.Extent'); goog.provide('ol.extent'); +goog.provide('ol.extent.Corner'); goog.provide('ol.extent.Relationship'); goog.require('goog.asserts'); @@ -17,6 +18,18 @@ goog.require('ol.TransformFunction'); ol.Extent; +/** + * Extent corner. + * @enum {string} + */ +ol.extent.Corner = { + BOTTOM_LEFT: 'bottom-left', + BOTTOM_RIGHT: 'bottom-right', + TOP_LEFT: 'top-left', + TOP_RIGHT: 'top-right' +}; + + /** * Relationship to an extent. * @enum {number} @@ -456,6 +469,30 @@ ol.extent.getCenter = function(extent) { }; +/** + * Get a corner coordinate of an extent. + * @param {ol.Extent} extent Extent. + * @param {ol.extent.Corner} corner Corner. + * @return {ol.Coordinate} Corner coordinate. + */ +ol.extent.getCorner = function(extent, corner) { + var coordinate; + if (corner === ol.extent.Corner.BOTTOM_LEFT) { + coordinate = ol.extent.getBottomLeft(extent); + } else if (corner === ol.extent.Corner.BOTTOM_RIGHT) { + coordinate = ol.extent.getBottomRight(extent); + } else if (corner === ol.extent.Corner.TOP_LEFT) { + coordinate = ol.extent.getTopLeft(extent); + } else if (corner === ol.extent.Corner.TOP_RIGHT) { + coordinate = ol.extent.getTopRight(extent); + } else { + goog.asserts.fail('Invalid corner: %s', corner); + } + goog.asserts.assert(goog.isDef(coordinate)); + return coordinate; +}; + + /** * @param {ol.Extent} extent1 Extent 1. * @param {ol.Extent} extent2 Extent 2. diff --git a/test/spec/ol/extent.test.js b/test/spec/ol/extent.test.js index 4a884b64ab..8cde8720e5 100644 --- a/test/spec/ol/extent.test.js +++ b/test/spec/ol/extent.test.js @@ -177,6 +177,31 @@ describe('ol.extent', function() { }); }); + describe('getCorner', function() { + var extent = [1, 2, 3, 4]; + + it('gets the bottom left', function() { + var corner = ol.extent.Corner.BOTTOM_LEFT; + expect(ol.extent.getCorner(extent, corner)).to.eql([1, 2]); + }); + + it('gets the bottom right', function() { + var corner = ol.extent.Corner.BOTTOM_RIGHT; + expect(ol.extent.getCorner(extent, corner)).to.eql([3, 2]); + }); + + it('gets the top left', function() { + var corner = ol.extent.Corner.TOP_LEFT; + expect(ol.extent.getCorner(extent, corner)).to.eql([1, 4]); + }); + + it('gets the top right', function() { + var corner = ol.extent.Corner.TOP_RIGHT; + expect(ol.extent.getCorner(extent, corner)).to.eql([3, 4]); + }); + + }); + describe('getForViewAndSize', function() { it('works for a unit square', function() { @@ -538,5 +563,6 @@ describe('ol.extent', function() { goog.require('goog.vec.Mat4'); goog.require('ol.extent'); +goog.require('ol.extent.Corner'); goog.require('ol.extent.Relationship'); goog.require('ol.proj'); From 63ad916ca7879930f3e4836b55f672352c68d943 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Fri, 11 Oct 2013 17:21:10 -0600 Subject: [PATCH 2/6] Function for creating tile grids from extents --- src/ol/tilegrid/tilegrid.js | 62 +++++++++++++++++++------- test/spec/ol/tilegrid/tilegrid.test.js | 60 +++++++++++++++++++++++++ 2 files changed, 107 insertions(+), 15 deletions(-) diff --git a/src/ol/tilegrid/tilegrid.js b/src/ol/tilegrid/tilegrid.js index 8996b786d2..eca53f7626 100644 --- a/src/ol/tilegrid/tilegrid.js +++ b/src/ol/tilegrid/tilegrid.js @@ -8,6 +8,7 @@ goog.require('ol.TileCoord'); goog.require('ol.TileRange'); goog.require('ol.array'); goog.require('ol.extent'); +goog.require('ol.extent.Corner'); goog.require('ol.proj.METERS_PER_UNIT'); goog.require('ol.proj.Projection'); goog.require('ol.proj.Units'); @@ -404,31 +405,62 @@ ol.tilegrid.getForProjection = function(projection) { /** - * @param {ol.proj.Projection} projection Projection. - * @param {number=} opt_maxZoom Maximum zoom level. - * @param {number=} opt_tileSize Tile size. + * @param {ol.Extent} extent Extent. + * @param {number=} opt_maxZoom Maximum zoom level (default is + * ol.DEFAULT_MAX_ZOOM). + * @param {number=} opt_tileSize Tile size (default uses ol.DEFAULT_TILE_SIZE). + * @param {ol.extent.Corner=} opt_corner Extent corner (default is + * ol.extent.Corner.BOTTOM_LEFT). * @return {ol.tilegrid.TileGrid} TileGrid instance. */ -ol.tilegrid.createForProjection = - function(projection, opt_maxZoom, opt_tileSize) { - var projectionExtent = projection.getExtent(); - var size = goog.isNull(projectionExtent) ? - 360 * ol.proj.METERS_PER_UNIT[ol.proj.Units.DEGREES] / - projection.getMetersPerUnit() : - Math.max(projectionExtent[2] - projectionExtent[0], - projectionExtent[3] - projectionExtent[1]); +ol.tilegrid.createForExtent = + function(extent, opt_maxZoom, opt_tileSize, opt_corner) { var maxZoom = goog.isDef(opt_maxZoom) ? opt_maxZoom : ol.DEFAULT_MAX_ZOOM; - var tileSize = goog.isDef(opt_tileSize) ? opt_tileSize : ol.DEFAULT_TILE_SIZE; + + var tileSize = goog.isDef(opt_tileSize) ? + opt_tileSize : ol.DEFAULT_TILE_SIZE; + + var corner = goog.isDef(opt_corner) ? + opt_corner : ol.extent.Corner.BOTTOM_LEFT; + + var extentHeight = ol.extent.getHeight(extent); + var extentWidth = ol.extent.getWidth(extent); + + var maxResolution = Math.max( + extentWidth / tileSize, extentHeight / tileSize); + var resolutions = new Array(maxZoom + 1); - var maxResolution = size / tileSize; + for (var z = 0, zz = resolutions.length; z < zz; ++z) { resolutions[z] = maxResolution / Math.pow(2, z); } + return new ol.tilegrid.TileGrid({ - origin: goog.isNull(projectionExtent) ? [0, 0] : - ol.extent.getBottomLeft(projectionExtent), + origin: ol.extent.getCorner(extent, corner), resolutions: resolutions, tileSize: tileSize }); }; + + +/** + * @param {ol.proj.Projection} projection Projection. + * @param {number=} opt_maxZoom Maximum zoom level (default is + * ol.DEFAULT_MAX_ZOOM). + * @param {number=} opt_tileSize Tile size (default uses ol.DEFAULT_TILE_SIZE). + * @param {ol.extent.Corner=} opt_corner Extent corner (default is + * ol.extent.Corner.BOTTOM_LEFT). + * @return {ol.tilegrid.TileGrid} TileGrid instance. + */ +ol.tilegrid.createForProjection = + function(projection, opt_maxZoom, opt_tileSize, opt_corner) { + var extent = projection.getExtent(); + if (goog.isNull(extent)) { + var half = 180 * ol.proj.METERS_PER_UNIT[ol.proj.Units.DEGREES] / + projection.getMetersPerUnit(); + extent = ol.extent.createOrUpdate(-half, -half, half, half); + } + return ol.tilegrid.createForExtent( + extent, opt_maxZoom, opt_tileSize, opt_corner); +}; diff --git a/test/spec/ol/tilegrid/tilegrid.test.js b/test/spec/ol/tilegrid/tilegrid.test.js index 08e1063a4b..747b695364 100644 --- a/test/spec/ol/tilegrid/tilegrid.test.js +++ b/test/spec/ol/tilegrid/tilegrid.test.js @@ -161,6 +161,18 @@ describe('ol.tilegrid.TileGrid', function() { }); }); + describe('createForExtent', function() { + it('allows creation of tile grid from extent', function() { + var extent = ol.extent.createOrUpdate(-100, -100, 100, 100); + var grid = ol.tilegrid.createForExtent(extent); + expect(grid).to.be.a(ol.tilegrid.TileGrid); + + var resolutions = grid.getResolutions(); + expect(resolutions.length).to.be(ol.DEFAULT_MAX_ZOOM + 1); + expect(grid.getOrigin()).to.eql([-100, -100]); + }); + }); + describe('createForProjection', function() { it('allows easier creation of a tile grid', function() { @@ -200,6 +212,50 @@ describe('ol.tilegrid.TileGrid', function() { ol.DEFAULT_TILE_SIZE / Math.pow(2, 5)); }); + it('assumes origin is bottom-left', function() { + var projection = ol.proj.get('EPSG:3857'); + var grid = ol.tilegrid.createForProjection(projection); + var origin = grid.getOrigin(); + var half = ol.proj.EPSG3857.HALF_SIZE; + expect(origin).to.eql([-half, -half]); + }); + + it('accepts bottom-left as corner', function() { + var projection = ol.proj.get('EPSG:3857'); + var grid = ol.tilegrid.createForProjection( + projection, undefined, undefined, ol.extent.Corner.BOTTOM_LEFT); + var origin = grid.getOrigin(); + var half = ol.proj.EPSG3857.HALF_SIZE; + expect(origin).to.eql([-half, -half]); + }); + + it('accepts bottom-right as corner', function() { + var projection = ol.proj.get('EPSG:3857'); + var grid = ol.tilegrid.createForProjection( + projection, undefined, undefined, ol.extent.Corner.BOTTOM_RIGHT); + var origin = grid.getOrigin(); + var half = ol.proj.EPSG3857.HALF_SIZE; + expect(origin).to.eql([half, -half]); + }); + + it('accepts top-left as corner', function() { + var projection = ol.proj.get('EPSG:3857'); + var grid = ol.tilegrid.createForProjection( + projection, undefined, undefined, ol.extent.Corner.TOP_LEFT); + var origin = grid.getOrigin(); + var half = ol.proj.EPSG3857.HALF_SIZE; + expect(origin).to.eql([-half, half]); + }); + + it('accepts top-right as corner', function() { + var projection = ol.proj.get('EPSG:3857'); + var grid = ol.tilegrid.createForProjection( + projection, undefined, undefined, ol.extent.Corner.TOP_RIGHT); + var origin = grid.getOrigin(); + var half = ol.proj.EPSG3857.HALF_SIZE; + expect(origin).to.eql([half, half]); + }); + }); describe('getForProjection', function() { @@ -643,8 +699,12 @@ describe('ol.tilegrid.TileGrid', function() { }); goog.require('ol.Coordinate'); +goog.require('ol.extent'); +goog.require('ol.extent.Corner'); goog.require('ol.proj'); goog.require('ol.proj.METERS_PER_UNIT'); +goog.require('ol.proj'); +goog.require('ol.proj.EPSG3857'); goog.require('ol.proj.Projection'); goog.require('ol.proj.Units'); goog.require('ol.tilegrid.TileGrid'); From e97f79b4abf3c67b8cf522fcc303f2c4bee34d51 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Mon, 18 Aug 2014 23:03:33 -0600 Subject: [PATCH 3/6] Respect XYZ source projection --- externs/olx.js | 20 +++++++++-- src/ol/source/xyzsource.js | 5 ++- src/ol/tilegrid/tilegrid.js | 66 +++++++++++++++++++++++++--------- src/ol/tilegrid/xyztilegrid.js | 21 ++++++----- 4 files changed, 81 insertions(+), 31 deletions(-) diff --git a/externs/olx.js b/externs/olx.js index 2faa3bf5e1..ca007aca10 100644 --- a/externs/olx.js +++ b/externs/olx.js @@ -5092,7 +5092,9 @@ olx.tilegrid.WMTSOptions.prototype.tileSizes; /** - * @typedef {{maxZoom: number}} + * @typedef {{maxZoom: (number|undefined), + * minZoom: (number|undefined), + * projection: (ol.proj.ProjectionLike|undefined)}} * @api */ olx.tilegrid.XYZOptions; @@ -5100,11 +5102,25 @@ olx.tilegrid.XYZOptions; /** * Maximum zoom. - * @type {number} + * @type {number|undefined} */ olx.tilegrid.XYZOptions.prototype.maxZoom; +/** + * Minimum zoom. Default is 0. + * @type {number|undefined} + */ +olx.tilegrid.XYZOptions.prototype.minZoom; + + +/** + * Projection. Default is `'EPSG:3857'`. + * @type {ol.proj.ProjectionLike|undefined} + */ +olx.tilegrid.XYZOptions.prototype.projection; + + /** * @typedef {{resolutions: !Array.}} * @api diff --git a/src/ol/source/xyzsource.js b/src/ol/source/xyzsource.js index 5ccf3bec14..4654362859 100644 --- a/src/ol/source/xyzsource.js +++ b/src/ol/source/xyzsource.js @@ -21,10 +21,9 @@ ol.source.XYZ = function(options) { var projection = goog.isDef(options.projection) ? options.projection : 'EPSG:3857'; - var maxZoom = goog.isDef(options.maxZoom) ? options.maxZoom : 18; - var tileGrid = new ol.tilegrid.XYZ({ - maxZoom: maxZoom + maxZoom: options.maxZoom, + projection: options.projection }); goog.base(this, { diff --git a/src/ol/tilegrid/tilegrid.js b/src/ol/tilegrid/tilegrid.js index eca53f7626..64887fb263 100644 --- a/src/ol/tilegrid/tilegrid.js +++ b/src/ol/tilegrid/tilegrid.js @@ -9,6 +9,7 @@ goog.require('ol.TileRange'); goog.require('ol.array'); goog.require('ol.extent'); goog.require('ol.extent.Corner'); +goog.require('ol.proj'); goog.require('ol.proj.METERS_PER_UNIT'); goog.require('ol.proj.Projection'); goog.require('ol.proj.Units'); @@ -415,26 +416,14 @@ ol.tilegrid.getForProjection = function(projection) { */ ol.tilegrid.createForExtent = function(extent, opt_maxZoom, opt_tileSize, opt_corner) { - var maxZoom = goog.isDef(opt_maxZoom) ? - opt_maxZoom : ol.DEFAULT_MAX_ZOOM; - var tileSize = goog.isDef(opt_tileSize) ? opt_tileSize : ol.DEFAULT_TILE_SIZE; var corner = goog.isDef(opt_corner) ? opt_corner : ol.extent.Corner.BOTTOM_LEFT; - var extentHeight = ol.extent.getHeight(extent); - var extentWidth = ol.extent.getWidth(extent); - - var maxResolution = Math.max( - extentWidth / tileSize, extentHeight / tileSize); - - var resolutions = new Array(maxZoom + 1); - - for (var z = 0, zz = resolutions.length; z < zz; ++z) { - resolutions[z] = maxResolution / Math.pow(2, z); - } + var resolutions = ol.tilegrid.resolutionsFromExtent( + extent, opt_maxZoom, tileSize); return new ol.tilegrid.TileGrid({ origin: ol.extent.getCorner(extent, corner), @@ -445,7 +434,37 @@ ol.tilegrid.createForExtent = /** - * @param {ol.proj.Projection} projection Projection. + * Create a resolutions array from an extent. A zoom factor of 2 is assumed. + * @param {ol.Extent} extent Extent. + * @param {number=} opt_maxZoom Maximum zoom level (default is + * ol.DEFAULT_MAX_ZOOM). + * @param {number=} opt_tileSize Tile size (default uses ol.DEFAULT_TILE_SIZE). + * @return {!Array.} Resolutions array. + */ +ol.tilegrid.resolutionsFromExtent = + function(extent, opt_maxZoom, opt_tileSize) { + var maxZoom = goog.isDef(opt_maxZoom) ? + opt_maxZoom : ol.DEFAULT_MAX_ZOOM; + + var height = ol.extent.getHeight(extent); + var width = ol.extent.getWidth(extent); + + var tileSize = goog.isDef(opt_tileSize) ? + opt_tileSize : ol.DEFAULT_TILE_SIZE; + var maxResolution = Math.max( + width / tileSize, height / tileSize); + + var length = maxZoom + 1; + var resolutions = new Array(length); + for (var z = 0; z < length; ++z) { + resolutions[z] = maxResolution / Math.pow(2, z); + } + return resolutions; +}; + + +/** + * @param {ol.proj.ProjectionLike} projection Projection. * @param {number=} opt_maxZoom Maximum zoom level (default is * ol.DEFAULT_MAX_ZOOM). * @param {number=} opt_tileSize Tile size (default uses ol.DEFAULT_TILE_SIZE). @@ -455,12 +474,25 @@ ol.tilegrid.createForExtent = */ ol.tilegrid.createForProjection = function(projection, opt_maxZoom, opt_tileSize, opt_corner) { + var extent = ol.tilegrid.extentFromProjection(projection); + return ol.tilegrid.createForExtent( + extent, opt_maxZoom, opt_tileSize, opt_corner); +}; + + +/** + * Generate a tile grid extent from a projection. If the projection has an + * extent, it is used. If not, a global extent is assumed. + * @param {ol.proj.ProjectionLike} projection Projection. + * @return {ol.Extent} Extent. + */ +ol.tilegrid.extentFromProjection = function(projection) { + projection = ol.proj.get(projection); var extent = projection.getExtent(); if (goog.isNull(extent)) { var half = 180 * ol.proj.METERS_PER_UNIT[ol.proj.Units.DEGREES] / projection.getMetersPerUnit(); extent = ol.extent.createOrUpdate(-half, -half, half, half); } - return ol.tilegrid.createForExtent( - extent, opt_maxZoom, opt_tileSize, opt_corner); + return extent; }; diff --git a/src/ol/tilegrid/xyztilegrid.js b/src/ol/tilegrid/xyztilegrid.js index 61ef4165d7..8d66446bf6 100644 --- a/src/ol/tilegrid/xyztilegrid.js +++ b/src/ol/tilegrid/xyztilegrid.js @@ -4,8 +4,9 @@ goog.require('goog.math'); goog.require('ol'); goog.require('ol.TileCoord'); goog.require('ol.TileRange'); +goog.require('ol.extent'); +goog.require('ol.extent.Corner'); goog.require('ol.proj'); -goog.require('ol.proj.EPSG3857'); goog.require('ol.tilecoord'); goog.require('ol.tilegrid.TileGrid'); @@ -22,19 +23,21 @@ goog.require('ol.tilegrid.TileGrid'); * @api */ ol.tilegrid.XYZ = function(options) { + var projection = goog.isDef(options.projection) ? + options.projection : 'EPSG:3857'; + var extent = ol.tilegrid.extentFromProjection(projection); - var resolutions = new Array(options.maxZoom + 1); - var z; - var size = 2 * ol.proj.EPSG3857.HALF_SIZE / ol.DEFAULT_TILE_SIZE; - for (z = 0; z <= options.maxZoom; ++z) { - resolutions[z] = size / Math.pow(2, z); - } + var tileSize = ol.DEFAULT_TILE_SIZE; + var resolutions = ol.tilegrid.resolutionsFromExtent( + extent, options.maxZoom, tileSize); + + var origin = ol.extent.getCorner(extent, ol.extent.Corner.TOP_LEFT); goog.base(this, { minZoom: options.minZoom, - origin: [-ol.proj.EPSG3857.HALF_SIZE, ol.proj.EPSG3857.HALF_SIZE], + origin: origin, resolutions: resolutions, - tileSize: ol.DEFAULT_TILE_SIZE + tileSize: tileSize }); }; From ee487ca3087b71007e12db75863ccd15847ed420 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Mon, 18 Aug 2014 23:26:36 -0600 Subject: [PATCH 4/6] Sources may be configured with a projection, tile grids with an extent An XYZ tile grid is constructed with an extent defining the bounds of the tile grid. --- externs/olx.js | 23 +++++++++++++---------- src/ol/source/bingmapssource.js | 3 ++- src/ol/source/tilejsonsource.js | 4 +++- src/ol/source/xyzsource.js | 5 ++--- src/ol/tilegrid/xyztilegrid.js | 12 +++++------- 5 files changed, 25 insertions(+), 22 deletions(-) diff --git a/externs/olx.js b/externs/olx.js index ca007aca10..4c170ec6e2 100644 --- a/externs/olx.js +++ b/externs/olx.js @@ -5092,14 +5092,24 @@ olx.tilegrid.WMTSOptions.prototype.tileSizes; /** - * @typedef {{maxZoom: (number|undefined), - * minZoom: (number|undefined), - * projection: (ol.proj.ProjectionLike|undefined)}} + * @typedef {{extent: (ol.Extent|undefined), + * maxZoom: (number|undefined), + * minZoom: (number|undefined)}} * @api */ olx.tilegrid.XYZOptions; +/** + * Extent for the tile grid. The origin for an XYZ tile grid is the top-left + * corner of the extent. The zero level of the grid is defined by the + * resolution at which one 256 x 256 tile fits in the provided extent. If not + * provided, the extent of the EPSG:3857 projection is used. + * @type {ol.Extent|undefined} + */ +olx.tilegrid.XYZOptions.prototype.extent; + + /** * Maximum zoom. * @type {number|undefined} @@ -5114,13 +5124,6 @@ olx.tilegrid.XYZOptions.prototype.maxZoom; olx.tilegrid.XYZOptions.prototype.minZoom; -/** - * Projection. Default is `'EPSG:3857'`. - * @type {ol.proj.ProjectionLike|undefined} - */ -olx.tilegrid.XYZOptions.prototype.projection; - - /** * @typedef {{resolutions: !Array.}} * @api diff --git a/src/ol/source/bingmapssource.js b/src/ol/source/bingmapssource.js index bccce2b375..7d6a7b4158 100644 --- a/src/ol/source/bingmapssource.js +++ b/src/ol/source/bingmapssource.js @@ -89,7 +89,9 @@ ol.source.BingMaps.prototype.handleImageryMetadataResponse = var resource = response.resourceSets[0].resources[0]; goog.asserts.assert(resource.imageWidth == resource.imageHeight); + var sourceProjection = this.getProjection(); var tileGrid = new ol.tilegrid.XYZ({ + extent: ol.tilegrid.extentFromProjection(sourceProjection), minZoom: resource.zoomMin, maxZoom: resource.zoomMax, tileSize: resource.imageWidth @@ -97,7 +99,6 @@ ol.source.BingMaps.prototype.handleImageryMetadataResponse = this.tileGrid = tileGrid; var culture = this.culture_; - var sourceProjection = this.getProjection(); this.tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform( tileGrid.createTileCoordTransform(), ol.TileUrlFunction.createFromTileUrlFunctions( diff --git a/src/ol/source/tilejsonsource.js b/src/ol/source/tilejsonsource.js index 24c1ba8402..a9a623d601 100644 --- a/src/ol/source/tilejsonsource.js +++ b/src/ol/source/tilejsonsource.js @@ -54,10 +54,11 @@ ol.source.TileJSON.prototype.handleTileJSONResponse = function(tileJSON) { var epsg4326Projection = ol.proj.get('EPSG:4326'); + var sourceProjection = this.getProjection(); var extent; if (goog.isDef(tileJSON.bounds)) { var transform = ol.proj.getTransformFromProjections( - epsg4326Projection, this.getProjection()); + epsg4326Projection, sourceProjection); extent = ol.extent.applyTransform(tileJSON.bounds, transform); } @@ -67,6 +68,7 @@ ol.source.TileJSON.prototype.handleTileJSONResponse = function(tileJSON) { var minZoom = tileJSON.minzoom || 0; var maxZoom = tileJSON.maxzoom || 22; var tileGrid = new ol.tilegrid.XYZ({ + extent: ol.tilegrid.extentFromProjection(sourceProjection), maxZoom: maxZoom, minZoom: minZoom }); diff --git a/src/ol/source/xyzsource.js b/src/ol/source/xyzsource.js index 4654362859..ab72d2bac7 100644 --- a/src/ol/source/xyzsource.js +++ b/src/ol/source/xyzsource.js @@ -17,13 +17,12 @@ goog.require('ol.tilegrid.XYZ'); * @api */ ol.source.XYZ = function(options) { - var projection = goog.isDef(options.projection) ? options.projection : 'EPSG:3857'; var tileGrid = new ol.tilegrid.XYZ({ - maxZoom: options.maxZoom, - projection: options.projection + extent: ol.tilegrid.extentFromProjection(projection), + maxZoom: options.maxZoom }); goog.base(this, { diff --git a/src/ol/tilegrid/xyztilegrid.js b/src/ol/tilegrid/xyztilegrid.js index 8d66446bf6..47638ebba0 100644 --- a/src/ol/tilegrid/xyztilegrid.js +++ b/src/ol/tilegrid/xyztilegrid.js @@ -7,6 +7,7 @@ goog.require('ol.TileRange'); goog.require('ol.extent'); goog.require('ol.extent.Corner'); goog.require('ol.proj'); +goog.require('ol.proj.EPSG3857'); goog.require('ol.tilecoord'); goog.require('ol.tilegrid.TileGrid'); @@ -23,19 +24,16 @@ goog.require('ol.tilegrid.TileGrid'); * @api */ ol.tilegrid.XYZ = function(options) { - var projection = goog.isDef(options.projection) ? - options.projection : 'EPSG:3857'; - var extent = ol.tilegrid.extentFromProjection(projection); - + // TODO: accept a tileSize option var tileSize = ol.DEFAULT_TILE_SIZE; + var extent = goog.isDef(options.extent) ? + options.extent : ol.proj.EPSG3857.EXTENT; var resolutions = ol.tilegrid.resolutionsFromExtent( extent, options.maxZoom, tileSize); - var origin = ol.extent.getCorner(extent, ol.extent.Corner.TOP_LEFT); - goog.base(this, { minZoom: options.minZoom, - origin: origin, + origin: ol.extent.getCorner(extent, ol.extent.Corner.TOP_LEFT), resolutions: resolutions, tileSize: tileSize }); From 1ede97ae18db33fc2ff4ff59efb43285e31680ab Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Mon, 18 Aug 2014 23:37:09 -0600 Subject: [PATCH 5/6] Respect the tileSize option for XYZ grids --- externs/olx.js | 14 +++++++++++--- src/ol/tilegrid/xyztilegrid.js | 6 ++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/externs/olx.js b/externs/olx.js index 4c170ec6e2..2773c35a18 100644 --- a/externs/olx.js +++ b/externs/olx.js @@ -5094,7 +5094,8 @@ olx.tilegrid.WMTSOptions.prototype.tileSizes; /** * @typedef {{extent: (ol.Extent|undefined), * maxZoom: (number|undefined), - * minZoom: (number|undefined)}} + * minZoom: (number|undefined), + * tileSize: (number|undefined)}} * @api */ olx.tilegrid.XYZOptions; @@ -5103,8 +5104,8 @@ olx.tilegrid.XYZOptions; /** * Extent for the tile grid. The origin for an XYZ tile grid is the top-left * corner of the extent. The zero level of the grid is defined by the - * resolution at which one 256 x 256 tile fits in the provided extent. If not - * provided, the extent of the EPSG:3857 projection is used. + * resolution at which one tile fits in the provided extent. If not provided, + * the extent of the EPSG:3857 projection is used. * @type {ol.Extent|undefined} */ olx.tilegrid.XYZOptions.prototype.extent; @@ -5124,6 +5125,13 @@ olx.tilegrid.XYZOptions.prototype.maxZoom; olx.tilegrid.XYZOptions.prototype.minZoom; +/** + * Tile size in pixels. Default is 256. (Only square tiles are supported.) + * @type {number|undefined} + */ +olx.tilegrid.XYZOptions.prototype.tileSize; + + /** * @typedef {{resolutions: !Array.}} * @api diff --git a/src/ol/tilegrid/xyztilegrid.js b/src/ol/tilegrid/xyztilegrid.js index 47638ebba0..60b5b1df8e 100644 --- a/src/ol/tilegrid/xyztilegrid.js +++ b/src/ol/tilegrid/xyztilegrid.js @@ -24,18 +24,16 @@ goog.require('ol.tilegrid.TileGrid'); * @api */ ol.tilegrid.XYZ = function(options) { - // TODO: accept a tileSize option - var tileSize = ol.DEFAULT_TILE_SIZE; var extent = goog.isDef(options.extent) ? options.extent : ol.proj.EPSG3857.EXTENT; var resolutions = ol.tilegrid.resolutionsFromExtent( - extent, options.maxZoom, tileSize); + extent, options.maxZoom, options.tileSize); goog.base(this, { minZoom: options.minZoom, origin: ol.extent.getCorner(extent, ol.extent.Corner.TOP_LEFT), resolutions: resolutions, - tileSize: tileSize + tileSize: options.tileSize }); }; From 6bd0d7efae536539c6dabb161efaecaefe56c74f Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Tue, 19 Aug 2014 10:20:06 -0600 Subject: [PATCH 6/6] Additional documentation --- externs/olx.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/externs/olx.js b/externs/olx.js index 2773c35a18..70fcdf62b1 100644 --- a/externs/olx.js +++ b/externs/olx.js @@ -5112,7 +5112,9 @@ olx.tilegrid.XYZOptions.prototype.extent; /** - * Maximum zoom. + * Maximum zoom. The default is `ol.DEFAULT_MAX_ZOOM`. This determines the + * number of levels in the grid set. For example, a `maxZoom` of 21 means there + * are 22 levels in the grid set. * @type {number|undefined} */ olx.tilegrid.XYZOptions.prototype.maxZoom;