diff --git a/src/ol/layer/TileLayer.js b/src/ol/layer/TileLayer.js index fea35263ed..dec560ef78 100644 --- a/src/ol/layer/TileLayer.js +++ b/src/ol/layer/TileLayer.js @@ -6,6 +6,169 @@ goog.require('ol.layer.Layer'); * @constructor * @extends {ol.layer.Layer} */ -ol.layer.TileLayer = function() {}; +ol.layer.TileLayer = function() { + + /** + * @protected + * @type {ol.Projection} + */ + this.projection_ = null; + + /** + * @private + * @type {ol.Bounds} + */ + this.extent_ = null; + + /** + * @protected + * @type {number} + */ + this.tileWidth_ = 256; + + /** + * @protected + * @type {number} + */ + this.tileHeight_ = 256; + + /** + * @protected + * @type {number|undefined} + */ + this.tileOriginX_ = undefined; + + /** + * @protected + * @type {number|undefined} + */ + this.tileOriginY_ = undefined; + + /** + * @private + * @type {string} + */ + this.tileOriginCorner_ = 'bl'; + + /** + * @protected + * @type {Array.} + */ + this.resolutions_ = null; + +}; goog.inherits(ol.layer.TileLayer, ol.layer.Layer); + + +/** + * Get layer extent. Return null if the layer has no extent + * and no projection. + * @return {ol.UnreferencedBounds} + */ +ol.layer.TileLayer.prototype.getExtent = function() { + if (!goog.isNull(this.extent_)) { + return this.extent_; + } + if (!goog.isNull(this.projection_)) { + return this.projection_.getExtent(); + } + return null; +}; + +/** + * Get tile origin. + * @return {Array.} + */ +ol.layer.TileLayer.prototype.getTileOrigin = function() { + if (goog.isDef(this.tileOriginX_) && + goog.isDef(this.tileOriginY_)) { + return [this.tileOriginX_, this.tileOriginY_]; + } + var errmsg; + if (goog.isDef(this.tileOriginCorner_)) { + var extent = this.getExtent(); + if (!goog.isNull(extent)) { + var tileOriginX, tileOriginY; + switch (this.tileOriginCorner_) { + case "tl": + tileOriginX = extent.getMinX(); + tileOriginY = extent.getMaxY(); + break; + case "tr": + tileOriginX = extent.getMaxX(); + tileOriginY = extent.getMaxY(); + break; + case "bl": + tileOriginX = extent.getMinX(); + tileOriginY = extent.getMinY(); + break; + case "br": + tileOriginX = extent.getMaxX(); + tileOriginY = extent.getMinY(); + break; + default: + // FIXME user error + goog.asserts.assert(false); + } + return [tileOriginX, tileOriginY]; + } + // FIXME user error + goog.asserts.assert(false); + } + // FIXME user error + goog.asserts.assert(false); + return null; +}; + +/** + * Set layer projection. + * @param {ol.Projection} projection + */ +ol.layer.TileLayer.prototype.setProjection = function(projection) { + this.projection_ = projection; +}; + +/** + * Set layer extent. + * @param {ol.Bounds} extent + */ +ol.layer.TileLayer.prototype.setExtent = function(extent) { + this.extent_ = extent; +}; + +/** + * Set tile width and height. + * @param {number} width + * @param {number} height + */ +ol.layer.TileLayer.prototype.setTileSize = function(width, height) { + this.tileWidth_ = width; + this.tileHeight_ = height; +}; + +/** + * Set tile origin. + * @param {number} tileOriginX + * @param {number} tileOriginY + */ +ol.layer.TileLayer.prototype.setTileOrigin = function(tileOriginX, tileOriginY) { + this.tileOriginX_ = tileOriginX; + this.tileOriginY_ = tileOriginY; +}; + +/** + * Set tile origin corner. + * @param {string} tileOriginCorner + */ +ol.layer.TileLayer.prototype.setTileOriginCorner = function(tileOriginCorner) { + this.tileOriginCorner_ = tileOriginCorner; +}; + +/** + * Set resolutions for the layer. + * @param {Array.} resolutions + */ +ol.layer.TileLayer.prototype.setResolutions = function(resolutions) { + this.resolutions_ = resolutions; +}; diff --git a/src/ol/layer/XYZ.js b/src/ol/layer/XYZ.js index f63e8899cd..e26e81f26a 100644 --- a/src/ol/layer/XYZ.js +++ b/src/ol/layer/XYZ.js @@ -22,41 +22,9 @@ ol.layer.XYZ = function(url) { */ this.url_ = url; - /** - * @private - * @type {number} - */ - this.tileWidth_ = 256; + goog.base(this); - /** - * @private - * @type {number} - */ - this.tileHeight_ = 256; - - /** - * @private - * @type {number} - */ - this.tileOriginX_ = -20037508.34; - - /** - * @private - * @type {number} - */ - this.tileOriginY_ = 20037508.34; - - /** - * @private - * @type {ol.Projection} - */ - this.projection_ = new ol.Projection('EPSG:900913'); - - /** - * @private - * @type {Array.} - */ - this.resolutions_ = [ + this.setResolutions([ 156543.03390625, 78271.516953125, 39135.7584765625, 19567.87923828125, 9783.939619140625, 4891.9698095703125, 2445.9849047851562, 1222.9924523925781, 611.4962261962891, @@ -65,48 +33,11 @@ ol.layer.XYZ = function(url) { 4.777314267158508, 2.388657133579254, 1.194328566789627, 0.5971642833948135, 0.29858214169740677, 0.14929107084870338, 0.07464553542435169 - ]; - + ]); }; goog.inherits(ol.layer.XYZ, ol.layer.TileLayer); -/** - * Set tile width and height. - * @param {number} width - * @param {number} height - */ -ol.layer.XYZ.prototype.setTileSize = function(width, height) { - this.tileWidth_ = width; - this.tileHeight_ = height; -}; - -/** - * Set the layer max extent. - * @param {ol.Bounds} maxExtent - */ -ol.layer.XYZ.prototype.setMaxExtent = function(maxExtent) { - this.maxExtent_ = maxExtent; -}; - -/** - * Set tile origin. - * @param {number} tileOriginX - * @param {number} tileOriginY - */ -ol.layer.XYZ.prototype.setTileOrigin = function(tileOriginX, tileOriginY) { - this.tileOriginX_ = tileOriginX; - this.tileOriginY_ = tileOriginY; -}; - -/** - * Set resolutions for the layer. - * @param {Array.} resolutions - */ -ol.layer.XYZ.prototype.setResolutions = function(resolutions) { - this.resolutions_ = resolutions; -}; - /** * Get data from the layer. This is the layer's main API function. * @param {ol.Bounds} bounds @@ -126,8 +57,9 @@ ol.layer.XYZ.prototype.getData = function(bounds, resolution) { tileWidth = me.tileWidth_, tileHeight = me.tileHeight_, - tileOriginX = me.tileOriginX_, - tileOriginY = me.tileOriginY_, + tileOrigin = me.getTileOrigin(), + tileOriginX = tileOrigin[0], + tileOriginY = tileOrigin[1], tileWidthGeo = tileWidth * resolution, tileHeightGeo = tileHeight * resolution, diff --git a/test/index.html b/test/index.html index e4b6022515..fd304c9144 100644 --- a/test/index.html +++ b/test/index.html @@ -63,6 +63,7 @@ + diff --git a/test/spec/ol/layer/TileLayer.test.js b/test/spec/ol/layer/TileLayer.test.js new file mode 100644 index 0000000000..4f0f31fcc7 --- /dev/null +++ b/test/spec/ol/layer/TileLayer.test.js @@ -0,0 +1,61 @@ +describe('ol.layer.TileLayer', function() { + + describe('create a tile layer', function() { + + it('returns an ol.layer.TileLayer instance', function() { + var layer = new ol.layer.TileLayer(); + expect(layer instanceof ol.layer.TileLayer).toBe(true); + }); + + }); + + describe('get tile origin', function() { + var layer; + + beforeEach(function() { + layer = new ol.layer.TileLayer(); + }); + + describe('with tileOriginX and tileOriginY set', function() { + + beforeEach(function() { + layer.setTileOrigin(1, 2); + }); + + it('returns the expected origin', function() { + var origin = layer.getTileOrigin(); + expect(origin).toEqual([1, 2]); + }); + + }); + + describe('with extent set', function() { + + beforeEach(function() { + layer.setExtent(new ol.Bounds(-180, -90, 180, 90)); + }); + + it('returns the expected origin', function() { + var origin = layer.getTileOrigin(); + expect(origin).toEqual([-180, -90]); + }); + + }); + + describe('with extent and tileOriginCorner set', function() { + + beforeEach(function() { + layer.setExtent(new ol.Bounds(-180, -90, 180, 90)); + layer.setTileOriginCorner('tr'); + }); + + it('returns the expected origin', function() { + var origin = layer.getTileOrigin(); + expect(origin).toEqual([180, 90]); + }); + + }); + + }); + +});