Respect XYZ source projection
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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, {
|
||||||
|
|||||||
@@ -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);
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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
|
||||||
});
|
});
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user