Merge pull request #509 from twpayne/use-high-resolution-tiles

Use high resolution tiles
This commit is contained in:
Tom Payne
2013-04-09 06:34:45 -07:00
7 changed files with 68 additions and 12 deletions
-1
View File
@@ -8,7 +8,6 @@ goog.require('ol.source.OpenStreetMap');
var map = new ol.Map({ var map = new ol.Map({
layers: [ layers: [
new ol.layer.TileLayer({ new ol.layer.TileLayer({
preload: 4,
source: new ol.source.OpenStreetMap() source: new ol.source.OpenStreetMap()
}) })
], ],
-1
View File
@@ -9,7 +9,6 @@ goog.require('ol.source.Stamen');
var map = new ol.Map({ var map = new ol.Map({
layers: [ layers: [
new ol.layer.TileLayer({ new ol.layer.TileLayer({
preload: 4,
source: new ol.source.Stamen({ source: new ol.source.Stamen({
layer: 'watercolor' layer: 'watercolor'
}) })
@@ -201,7 +201,7 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame =
tilesToDrawByZ, getTileIfLoaded); tilesToDrawByZ, getTileIfLoaded);
var allTilesLoaded = true; var allTilesLoaded = true;
var tile, tileState, x, y; var childTileRange, fullyLoaded, tile, tileState, x, y;
for (x = tileRange.minX; x <= tileRange.maxX; ++x) { for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
for (y = tileRange.minY; y <= tileRange.maxY; ++y) { for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
@@ -215,7 +215,14 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame =
} }
allTilesLoaded = false; allTilesLoaded = false;
tileGrid.forEachTileCoordParentTileRange(tile.tileCoord, findLoadedTiles); fullyLoaded = tileGrid.forEachTileCoordParentTileRange(
tile.tileCoord, findLoadedTiles);
if (!fullyLoaded) {
childTileRange = tileGrid.getTileCoordChildTileRange(tile.tileCoord);
if (!goog.isNull(childTileRange)) {
findLoadedTiles(z + 1, childTileRange);
}
}
} }
} }
+9 -2
View File
@@ -115,7 +115,7 @@ ol.renderer.dom.TileLayer.prototype.renderFrame =
tilesToDrawByZ, getTileIfLoaded); tilesToDrawByZ, getTileIfLoaded);
var allTilesLoaded = true; var allTilesLoaded = true;
var tile, tileState, x, y; var childTileRange, fullyLoaded, tile, tileState, x, y;
for (x = tileRange.minX; x <= tileRange.maxX; ++x) { for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
for (y = tileRange.minY; y <= tileRange.maxY; ++y) { for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
@@ -130,7 +130,14 @@ ol.renderer.dom.TileLayer.prototype.renderFrame =
} }
allTilesLoaded = false; allTilesLoaded = false;
tileGrid.forEachTileCoordParentTileRange(tile.tileCoord, findLoadedTiles); fullyLoaded = tileGrid.forEachTileCoordParentTileRange(
tile.tileCoord, findLoadedTiles);
if (!fullyLoaded) {
childTileRange = tileGrid.getTileCoordChildTileRange(tile.tileCoord);
if (!goog.isNull(childTileRange)) {
findLoadedTiles(z + 1, childTileRange);
}
}
} }
@@ -199,7 +199,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame =
tilesToDrawByZ, getTileIfLoaded); tilesToDrawByZ, getTileIfLoaded);
var allTilesLoaded = true; var allTilesLoaded = true;
var tile, tileState, x, y; var childTileRange, fullyLoaded, tile, tileState, x, y;
for (x = tileRange.minX; x <= tileRange.maxX; ++x) { for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
for (y = tileRange.minY; y <= tileRange.maxY; ++y) { for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
@@ -216,8 +216,14 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame =
} }
allTilesLoaded = false; allTilesLoaded = false;
tileGrid.forEachTileCoordParentTileRange( fullyLoaded = tileGrid.forEachTileCoordParentTileRange(
tile.tileCoord, findLoadedTiles); tile.tileCoord, findLoadedTiles);
if (!fullyLoaded) {
childTileRange = tileGrid.getTileCoordChildTileRange(tile.tileCoord);
if (!goog.isNull(childTileRange)) {
findLoadedTiles(z + 1, childTileRange);
}
}
} }
+18 -1
View File
@@ -96,6 +96,7 @@ ol.tilegrid.TileGrid = function(options) {
* @param {ol.TileCoord} tileCoord Tile coordinate. * @param {ol.TileCoord} tileCoord Tile coordinate.
* @param {function(this: T, number, ol.TileRange): boolean} callback Callback. * @param {function(this: T, number, ol.TileRange): boolean} callback Callback.
* @param {T=} opt_obj Object. * @param {T=} opt_obj Object.
* @return {boolean} Callback succeeded.
* @template T * @template T
*/ */
ol.tilegrid.TileGrid.prototype.forEachTileCoordParentTileRange = ol.tilegrid.TileGrid.prototype.forEachTileCoordParentTileRange =
@@ -105,10 +106,11 @@ ol.tilegrid.TileGrid.prototype.forEachTileCoordParentTileRange =
while (z >= 0) { while (z >= 0) {
if (callback.call( if (callback.call(
opt_obj, z, this.getTileRangeForExtentAndZ(tileCoordExtent, z))) { opt_obj, z, this.getTileRangeForExtentAndZ(tileCoordExtent, z))) {
return; return true;
} }
--z; --z;
} }
return false;
}; };
@@ -164,6 +166,21 @@ ol.tilegrid.TileGrid.prototype.getResolutions = function() {
}; };
/**
* @param {ol.TileCoord} tileCoord Tile coordinate.
* @return {ol.TileRange} Tile range.
*/
ol.tilegrid.TileGrid.prototype.getTileCoordChildTileRange =
function(tileCoord) {
if (tileCoord.z < this.resolutions_.length) {
var tileCoordExtent = this.getTileCoordExtent(tileCoord);
return this.getTileRangeForExtentAndZ(tileCoordExtent, tileCoord.z + 1);
} else {
return null;
}
};
/** /**
* @param {number} z Z. * @param {number} z Z.
* @param {ol.TileRange} tileRange Tile range. * @param {ol.TileRange} tileRange Tile range.
+24 -3
View File
@@ -15,10 +15,16 @@ goog.require('ol.tilegrid.TileGrid');
*/ */
ol.tilegrid.XYZ = function(options) { ol.tilegrid.XYZ = function(options) {
var resolutions = new Array(options.maxZoom + 1); /**
* @private
* @type {number}
*/
this.maxZoom_ = options.maxZoom;
var resolutions = new Array(this.maxZoom_ + 1);
var z; var z;
var size = 2 * ol.projection.EPSG3857.HALF_SIZE / ol.DEFAULT_TILE_SIZE; var size = 2 * ol.projection.EPSG3857.HALF_SIZE / ol.DEFAULT_TILE_SIZE;
for (z = 0; z <= options.maxZoom; ++z) { for (z = 0; z <= this.maxZoom_; ++z) {
resolutions[z] = size / Math.pow(2, z); resolutions[z] = size / Math.pow(2, z);
} }
@@ -33,6 +39,20 @@ ol.tilegrid.XYZ = function(options) {
goog.inherits(ol.tilegrid.XYZ, ol.tilegrid.TileGrid); goog.inherits(ol.tilegrid.XYZ, ol.tilegrid.TileGrid);
/**
* @inheritDoc
*/
ol.tilegrid.XYZ.prototype.getTileCoordChildTileRange = function(tileCoord) {
if (tileCoord.z < this.maxZoom_) {
return new ol.TileRange(
tileCoord.x << 1, tileCoord.y << 1,
tileCoord.x + 1 << 1, tileCoord.y + 1 << 1);
} else {
return null;
}
};
/** /**
* @inheritDoc * @inheritDoc
*/ */
@@ -44,7 +64,8 @@ ol.tilegrid.XYZ.prototype.forEachTileCoordParentTileRange =
tileRange.minX = tileRange.maxX >>= 1; tileRange.minX = tileRange.maxX >>= 1;
tileRange.minY = tileRange.maxY >>= 1; tileRange.minY = tileRange.maxY >>= 1;
if (callback.call(opt_obj, z, tileRange)) { if (callback.call(opt_obj, z, tileRange)) {
break; return true;
} }
} }
return false;
}; };