Respect XYZ source projection

This commit is contained in:
Tim Schaub
2014-08-18 23:03:33 -06:00
parent 63ad916ca7
commit e97f79b4ab
4 changed files with 81 additions and 31 deletions

View File

@@ -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 * @api
*/ */
olx.tilegrid.XYZOptions; olx.tilegrid.XYZOptions;
@@ -5100,11 +5102,25 @@ olx.tilegrid.XYZOptions;
/** /**
* Maximum zoom. * Maximum zoom.
* @type {number} * @type {number|undefined}
*/ */
olx.tilegrid.XYZOptions.prototype.maxZoom; 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.<number>}} * @typedef {{resolutions: !Array.<number>}}
* @api * @api

View File

@@ -21,10 +21,9 @@ ol.source.XYZ = function(options) {
var projection = goog.isDef(options.projection) ? var projection = goog.isDef(options.projection) ?
options.projection : 'EPSG:3857'; options.projection : 'EPSG:3857';
var maxZoom = goog.isDef(options.maxZoom) ? options.maxZoom : 18;
var tileGrid = new ol.tilegrid.XYZ({ var tileGrid = new ol.tilegrid.XYZ({
maxZoom: maxZoom maxZoom: options.maxZoom,
projection: options.projection
}); });
goog.base(this, { goog.base(this, {

View File

@@ -9,6 +9,7 @@ goog.require('ol.TileRange');
goog.require('ol.array'); goog.require('ol.array');
goog.require('ol.extent'); goog.require('ol.extent');
goog.require('ol.extent.Corner'); goog.require('ol.extent.Corner');
goog.require('ol.proj');
goog.require('ol.proj.METERS_PER_UNIT'); goog.require('ol.proj.METERS_PER_UNIT');
goog.require('ol.proj.Projection'); goog.require('ol.proj.Projection');
goog.require('ol.proj.Units'); goog.require('ol.proj.Units');
@@ -415,26 +416,14 @@ ol.tilegrid.getForProjection = function(projection) {
*/ */
ol.tilegrid.createForExtent = ol.tilegrid.createForExtent =
function(extent, opt_maxZoom, opt_tileSize, opt_corner) { 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) ? var tileSize = goog.isDef(opt_tileSize) ?
opt_tileSize : ol.DEFAULT_TILE_SIZE; opt_tileSize : ol.DEFAULT_TILE_SIZE;
var corner = goog.isDef(opt_corner) ? var corner = goog.isDef(opt_corner) ?
opt_corner : ol.extent.Corner.BOTTOM_LEFT; opt_corner : ol.extent.Corner.BOTTOM_LEFT;
var extentHeight = ol.extent.getHeight(extent); var resolutions = ol.tilegrid.resolutionsFromExtent(
var extentWidth = ol.extent.getWidth(extent); extent, opt_maxZoom, tileSize);
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);
}
return new ol.tilegrid.TileGrid({ return new ol.tilegrid.TileGrid({
origin: ol.extent.getCorner(extent, corner), 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.<number>} 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 * @param {number=} opt_maxZoom Maximum zoom level (default is
* ol.DEFAULT_MAX_ZOOM). * ol.DEFAULT_MAX_ZOOM).
* @param {number=} opt_tileSize Tile size (default uses ol.DEFAULT_TILE_SIZE). * @param {number=} opt_tileSize Tile size (default uses ol.DEFAULT_TILE_SIZE).
@@ -455,12 +474,25 @@ ol.tilegrid.createForExtent =
*/ */
ol.tilegrid.createForProjection = ol.tilegrid.createForProjection =
function(projection, opt_maxZoom, opt_tileSize, opt_corner) { 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(); var extent = projection.getExtent();
if (goog.isNull(extent)) { if (goog.isNull(extent)) {
var half = 180 * ol.proj.METERS_PER_UNIT[ol.proj.Units.DEGREES] / var half = 180 * ol.proj.METERS_PER_UNIT[ol.proj.Units.DEGREES] /
projection.getMetersPerUnit(); projection.getMetersPerUnit();
extent = ol.extent.createOrUpdate(-half, -half, half, half); extent = ol.extent.createOrUpdate(-half, -half, half, half);
} }
return ol.tilegrid.createForExtent( return extent;
extent, opt_maxZoom, opt_tileSize, opt_corner);
}; };

View File

@@ -4,8 +4,9 @@ goog.require('goog.math');
goog.require('ol'); goog.require('ol');
goog.require('ol.TileCoord'); goog.require('ol.TileCoord');
goog.require('ol.TileRange'); goog.require('ol.TileRange');
goog.require('ol.extent');
goog.require('ol.extent.Corner');
goog.require('ol.proj'); goog.require('ol.proj');
goog.require('ol.proj.EPSG3857');
goog.require('ol.tilecoord'); goog.require('ol.tilecoord');
goog.require('ol.tilegrid.TileGrid'); goog.require('ol.tilegrid.TileGrid');
@@ -22,19 +23,21 @@ goog.require('ol.tilegrid.TileGrid');
* @api * @api
*/ */
ol.tilegrid.XYZ = function(options) { 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 tileSize = ol.DEFAULT_TILE_SIZE;
var z; var resolutions = ol.tilegrid.resolutionsFromExtent(
var size = 2 * ol.proj.EPSG3857.HALF_SIZE / ol.DEFAULT_TILE_SIZE; extent, options.maxZoom, tileSize);
for (z = 0; z <= options.maxZoom; ++z) {
resolutions[z] = size / Math.pow(2, z); var origin = ol.extent.getCorner(extent, ol.extent.Corner.TOP_LEFT);
}
goog.base(this, { goog.base(this, {
minZoom: options.minZoom, minZoom: options.minZoom,
origin: [-ol.proj.EPSG3857.HALF_SIZE, ol.proj.EPSG3857.HALF_SIZE], origin: origin,
resolutions: resolutions, resolutions: resolutions,
tileSize: ol.DEFAULT_TILE_SIZE tileSize: tileSize
}); });
}; };