diff --git a/src/ol/tilegrid.js b/src/ol/tilegrid.js index 50a31a312e..1dc92ec9f5 100644 --- a/src/ol/tilegrid.js +++ b/src/ol/tilegrid.js @@ -1,4 +1,5 @@ goog.provide('ol.TileGrid'); +goog.provide('ol.TileGrid.createOpenStreetMap'); goog.require('goog.array'); goog.require('goog.asserts'); diff --git a/src/ol/tilestore.js b/src/ol/tilestore.js index 6ace711f3c..c1d2626ca3 100644 --- a/src/ol/tilestore.js +++ b/src/ol/tilestore.js @@ -1,4 +1,5 @@ goog.provide('ol.TileStore'); +goog.provide('ol.TileStore.createOpenStreetMap'); goog.require('ol.Store'); goog.require('ol.Tile'); @@ -60,11 +61,15 @@ ol.TileStore.createOpenStreetMap = function() { var projection = ol.Projection.createFromCode('EPSG:3857'); var tileGrid = ol.TileGrid.createOpenStreetMap(18); - var tileUrlFunction = ol.TileUrlFunction.createFromTemplates([ - 'http://a.tile.openstreetmap.org/{z}/{x}/{y}.png', - 'http://b.tile.openstreetmap.org/{z}/{x}/{y}.png', - 'http://c.tile.openstreetmap.org/{z}/{x}/{y}.png' - ]); + var tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform( + function(tileCoord) { + return new ol.TileCoord(tileCoord.z, tileCoord.x, -tileCoord.y - 1); + }, + ol.TileUrlFunction.createFromTemplates([ + 'http://a.tile.openstreetmap.org/{z}/{x}/{y}.png', + 'http://b.tile.openstreetmap.org/{z}/{x}/{y}.png', + 'http://c.tile.openstreetmap.org/{z}/{x}/{y}.png' + ])); var extent = projection.getExtent(); var attribution = '© ' + @@ -109,7 +114,6 @@ ol.TileStore.prototype.getTile = function(tileCoord) { * @return {string} Tile coord URL. */ ol.TileStore.prototype.getTileCoordUrl = function(tileCoord) { - // FIXME maybe wrap x and y return this.tileUrlFunction_(tileCoord); }; diff --git a/src/ol/tilestore_test.js b/src/ol/tilestore_test.js new file mode 100644 index 0000000000..609d90c7f9 --- /dev/null +++ b/src/ol/tilestore_test.js @@ -0,0 +1,39 @@ +goog.require('goog.testing.jsunit'); +goog.require('ol.TileStore.createOpenStreetMap'); + + +function testOpenStreetMap() { + + var tileStore = ol.TileStore.createOpenStreetMap(8); + var tileGrid = tileStore.getTileGrid(); + + var coordinate = + new goog.math.Coordinate(829330.2064098881, 5933916.615134273); + var tileUrl; + + var getTileCoordPart = function(tileUrl) { + return tileUrl.substr(32, tileUrl.length - 36); + }; + + tileUrl = tileStore.getTileCoordUrl(tileGrid.getTileCoord(0, coordinate)); + assertEquals('0/0/0', getTileCoordPart(tileUrl)); + + tileUrl = tileStore.getTileCoordUrl(tileGrid.getTileCoord(1, coordinate)); + assertEquals('1/1/0', getTileCoordPart(tileUrl)); + + tileUrl = tileStore.getTileCoordUrl(tileGrid.getTileCoord(2, coordinate)); + assertEquals('2/2/1', getTileCoordPart(tileUrl)); + + tileUrl = tileStore.getTileCoordUrl(tileGrid.getTileCoord(3, coordinate)); + assertEquals('3/4/2', getTileCoordPart(tileUrl)); + + tileUrl = tileStore.getTileCoordUrl(tileGrid.getTileCoord(4, coordinate)); + assertEquals('4/8/5', getTileCoordPart(tileUrl)); + + tileUrl = tileStore.getTileCoordUrl(tileGrid.getTileCoord(5, coordinate)); + assertEquals('5/16/11', getTileCoordPart(tileUrl)); + + tileUrl = tileStore.getTileCoordUrl(tileGrid.getTileCoord(6, coordinate)); + assertEquals('6/33/22', getTileCoordPart(tileUrl)); + +} diff --git a/src/ol/tileurlfunction.js b/src/ol/tileurlfunction.js index 87fdcd6c72..c6a319a4e5 100644 --- a/src/ol/tileurlfunction.js +++ b/src/ol/tileurlfunction.js @@ -44,3 +44,16 @@ ol.TileUrlFunction.createFromTemplates = function(templates) { return ol.TileUrlFunction.createFromTileUrlFunctions( goog.array.map(templates, ol.TileUrlFunction.createFromTemplate)); }; + + +/** + * @param {function(ol.TileCoord): ol.TileCoord} transform Transform. + * @param {ol.TileUrlFunctionType} tileUrlFunction Tile URL function. + * @return {ol.TileUrlFunctionType} Tile URL function. + */ +ol.TileUrlFunction.withTileCoordTransform = + function(transform, tileUrlFunction) { + return function(tileCoord) { + return tileUrlFunction(transform(tileCoord)); + }; +}; diff --git a/src/ol/tileurlfunction_test.js b/src/ol/tileurlfunction_test.js index 4812bbcadd..b009ec49ec 100644 --- a/src/ol/tileurlfunction_test.js +++ b/src/ol/tileurlfunction_test.js @@ -9,6 +9,16 @@ function testCreateFromTemplate() { } +function testWithTileCoordTransform() { + var tileUrl = ol.TileUrlFunction.withTileCoordTransform( + function(tileCoord) { + return new ol.TileCoord(tileCoord.z, tileCoord.x, -tileCoord.y); + }, + ol.TileUrlFunction.createFromTemplate('{z}/{x}/{y}')); + assertEquals('3/2/1', tileUrl(new ol.TileCoord(3, 2, -1))); +} + + function testCreateFromTileUrlFunctions() { var tileUrl = ol.TileUrlFunction.createFromTileUrlFunctions([ ol.TileUrlFunction.createFromTemplate('a'),