From 0a5dae9ed0bc96b71fbeacaa668f378f25462f12 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Mon, 18 Feb 2013 18:37:27 -0700 Subject: [PATCH] Avoid left shift in resolution calculations --- src/ol/tilegrid/tilegrid.js | 3 ++- src/ol/tilegrid/xyztilegrid.js | 4 ++-- src/ol/view2d.js | 2 +- test/spec/ol/tilegrid.test.js | 31 +++++++++++++++++++++++++++++++ 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/ol/tilegrid/tilegrid.js b/src/ol/tilegrid/tilegrid.js index 58dfaacfda..7a0fecf81e 100644 --- a/src/ol/tilegrid/tilegrid.js +++ b/src/ol/tilegrid/tilegrid.js @@ -333,8 +333,9 @@ ol.tilegrid.createForProjection = opt_tileSize : new ol.Size(ol.DEFAULT_TILE_SIZE, ol.DEFAULT_TILE_SIZE); var resolutions = new Array(maxZoom + 1); goog.asserts.assert(tileSize.width == tileSize.height); + size = size / tileSize.width; for (var z = 0, zz = resolutions.length; z < zz; ++z) { - resolutions[z] = size / (tileSize.width << z); + resolutions[z] = size / Math.pow(2, z); } return new ol.tilegrid.TileGrid({ origin: projectionExtent.getTopLeft(), diff --git a/src/ol/tilegrid/xyztilegrid.js b/src/ol/tilegrid/xyztilegrid.js index c948010ba7..d57909413e 100644 --- a/src/ol/tilegrid/xyztilegrid.js +++ b/src/ol/tilegrid/xyztilegrid.js @@ -17,9 +17,9 @@ ol.tilegrid.XYZ = function(xyzOptions) { var resolutions = new Array(xyzOptions.maxZoom + 1); var z; + var size = 2 * ol.Projection.EPSG_3857_HALF_SIZE / ol.DEFAULT_TILE_SIZE; for (z = 0; z <= xyzOptions.maxZoom; ++z) { - resolutions[z] = - 2 * ol.Projection.EPSG_3857_HALF_SIZE / (ol.DEFAULT_TILE_SIZE << z); + resolutions[z] = size / Math.pow(2, z); } goog.base(this, { diff --git a/src/ol/view2d.js b/src/ol/view2d.js index ed707f2e74..be3e30564b 100644 --- a/src/ol/view2d.js +++ b/src/ol/view2d.js @@ -56,7 +56,7 @@ ol.View2D = function(opt_view2DOptions) { projectionExtent.maxX - projectionExtent.minX, projectionExtent.maxY - projectionExtent.minY); values[ol.View2DProperty.RESOLUTION] = - size / (ol.DEFAULT_TILE_SIZE << view2DOptions.zoom); + size / (ol.DEFAULT_TILE_SIZE * Math.pow(2, view2DOptions.zoom)); } values[ol.View2DProperty.ROTATION] = view2DOptions.rotation; this.setValues(values); diff --git a/test/spec/ol/tilegrid.test.js b/test/spec/ol/tilegrid.test.js index bcaba344f6..3831522c4b 100644 --- a/test/spec/ol/tilegrid.test.js +++ b/test/spec/ol/tilegrid.test.js @@ -94,6 +94,37 @@ describe('ol.tilegrid.TileGrid', function() { }); }); + describe('createForProjection', function() { + + it('allows easier creation of a tile grid', function() { + var projection = ol.Projection.getFromCode('EPSG:3857'); + var grid = ol.tilegrid.createForProjection(projection); + expect(grid).toBeA(ol.tilegrid.TileGrid); + + var resolutions = grid.getResolutions(); + expect(resolutions.length).toBe(19); + }); + + it('accepts a number of zoom levels', function() { + var projection = ol.Projection.getFromCode('EPSG:3857'); + var grid = ol.tilegrid.createForProjection(projection, 22); + expect(grid).toBeA(ol.tilegrid.TileGrid); + + var resolutions = grid.getResolutions(); + expect(resolutions.length).toBe(23); + }); + + it('accepts a big number of zoom levels', function() { + var projection = ol.Projection.getFromCode('EPSG:3857'); + var grid = ol.tilegrid.createForProjection(projection, 23); + expect(grid).toBeA(ol.tilegrid.TileGrid); + + var resolutions = grid.getResolutions(); + expect(resolutions.length).toBe(24); + }); + + }); + describe('getTileCoordFromCoordAndZ', function() { describe('Y North, X East', function() {