Use validity extent to generate default resolutions
Previously, the TiledWMS source generated a resolutions array derived from the world extent in meters, to match the default Web Mercator resolutions of the map. This wouldn't work for projections with distance units different than meters. It is better to commit to a default resolutions array where zoom level 0 is the validity extent of the projection (not the Web Mercator world extent!) at a 256 pixel tile size.
This commit is contained in:
@@ -51,14 +51,14 @@ var layers = new ol.Collection([
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
var map = new ol.Map({
|
var map = new ol.Map({
|
||||||
projection: epsg21781,
|
|
||||||
// By setting userProjection to the same as projection, we do not need
|
// By setting userProjection to the same as projection, we do not need
|
||||||
// proj4js because we do not need any transforms.
|
// proj4js because we do not need any transforms.
|
||||||
userProjection: epsg21781,
|
userProjection: epsg21781,
|
||||||
layers: layers,
|
layers: layers,
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new ol.View2D({
|
view: new ol.View2D({
|
||||||
|
projection: epsg21781,
|
||||||
center: new ol.Coordinate(660000, 190000),
|
center: new ol.Coordinate(660000, 190000),
|
||||||
zoom: 9
|
zoom: 2
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -35,20 +35,8 @@ ol.source.TiledWMS = function(tiledWMSOptions) {
|
|||||||
if (goog.isDef(tiledWMSOptions.tileGrid)) {
|
if (goog.isDef(tiledWMSOptions.tileGrid)) {
|
||||||
tileGrid = tiledWMSOptions.tileGrid;
|
tileGrid = tiledWMSOptions.tileGrid;
|
||||||
} else {
|
} else {
|
||||||
// FIXME Factor this out to a more central/generic place.
|
tileGrid = ol.tilegrid.createForProjection(projection,
|
||||||
var size = Math.max(
|
tiledWMSOptions.maxZoom);
|
||||||
projectionExtent.maxX - projectionExtent.minX,
|
|
||||||
projectionExtent.maxY - projectionExtent.minY);
|
|
||||||
var maxZoom = goog.isDef(tiledWMSOptions.maxZoom) ?
|
|
||||||
tiledWMSOptions.maxZoom : 18;
|
|
||||||
var resolutions = new Array(maxZoom + 1);
|
|
||||||
for (var z = 0, zz = resolutions.length; z < zz; ++z) {
|
|
||||||
resolutions[z] = ol.Projection.EPSG_3857_HALF_SIZE / (128 << z);
|
|
||||||
}
|
|
||||||
tileGrid = new ol.tilegrid.TileGrid({
|
|
||||||
origin: projectionExtent.getTopLeft(),
|
|
||||||
resolutions: resolutions
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var baseParams = {
|
var baseParams = {
|
||||||
|
|||||||
@@ -316,3 +316,26 @@ ol.tilegrid.TileGrid.prototype.getTileSize = function() {
|
|||||||
ol.tilegrid.TileGrid.prototype.getZForResolution = function(resolution) {
|
ol.tilegrid.TileGrid.prototype.getZForResolution = function(resolution) {
|
||||||
return ol.array.linearFindNearest(this.resolutions_, resolution);
|
return ol.array.linearFindNearest(this.resolutions_, resolution);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {ol.Projection} projection Projection.
|
||||||
|
* @param {number=} opt_maxZoom Maximum zoom level (optional). Default is 18.
|
||||||
|
* @return {ol.tilegrid.TileGrid} TileGrid instance.
|
||||||
|
*/
|
||||||
|
ol.tilegrid.createForProjection = function(projection, opt_maxZoom) {
|
||||||
|
var projectionExtent = projection.getExtent();
|
||||||
|
var size = Math.max(
|
||||||
|
projectionExtent.maxX - projectionExtent.minX,
|
||||||
|
projectionExtent.maxY - projectionExtent.minY);
|
||||||
|
var maxZoom = goog.isDef(opt_maxZoom) ?
|
||||||
|
opt_maxZoom : 18;
|
||||||
|
var resolutions = new Array(maxZoom + 1);
|
||||||
|
for (var z = 0, zz = resolutions.length; z < zz; ++z) {
|
||||||
|
resolutions[z] = size / (256 << z);
|
||||||
|
}
|
||||||
|
return new ol.tilegrid.TileGrid({
|
||||||
|
origin: projectionExtent.getTopLeft(),
|
||||||
|
resolutions: resolutions
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|||||||
@@ -48,8 +48,11 @@ ol.View2D = function(opt_view2DOptions) {
|
|||||||
if (goog.isDef(view2DOptions.resolution)) {
|
if (goog.isDef(view2DOptions.resolution)) {
|
||||||
values[ol.View2DProperty.RESOLUTION] = view2DOptions.resolution;
|
values[ol.View2DProperty.RESOLUTION] = view2DOptions.resolution;
|
||||||
} else if (goog.isDef(view2DOptions.zoom)) {
|
} else if (goog.isDef(view2DOptions.zoom)) {
|
||||||
values[ol.View2DProperty.RESOLUTION] =
|
var projectionExtent = values[ol.View2DProperty.PROJECTION].getExtent();
|
||||||
ol.Projection.EPSG_3857_HALF_SIZE / (128 << view2DOptions.zoom);
|
var size = Math.max(
|
||||||
|
projectionExtent.maxX - projectionExtent.minX,
|
||||||
|
projectionExtent.maxY - projectionExtent.minY);
|
||||||
|
values[ol.View2DProperty.RESOLUTION] = size / (256 << view2DOptions.zoom);
|
||||||
}
|
}
|
||||||
values[ol.View2DProperty.ROTATION] = view2DOptions.rotation;
|
values[ol.View2DProperty.ROTATION] = view2DOptions.rotation;
|
||||||
this.setValues(values);
|
this.setValues(values);
|
||||||
@@ -322,7 +325,11 @@ ol.View2D.createConstraints_ = function(view2DOptions) {
|
|||||||
numZoomLevels = view2DOptions.numZoomLevels;
|
numZoomLevels = view2DOptions.numZoomLevels;
|
||||||
zoomFactor = view2DOptions.zoomFactor;
|
zoomFactor = view2DOptions.zoomFactor;
|
||||||
} else {
|
} else {
|
||||||
maxResolution = ol.Projection.EPSG_3857_HALF_SIZE / 128;
|
var projectionExtent = ol.Projection.createProjection(
|
||||||
|
view2DOptions.projection, 'EPSG:3857').getExtent();
|
||||||
|
maxResolution = Math.max(
|
||||||
|
projectionExtent.maxX - projectionExtent.minX,
|
||||||
|
projectionExtent.maxY - projectionExtent.minY) / 256;
|
||||||
// number of steps we want between two data resolutions
|
// number of steps we want between two data resolutions
|
||||||
var numSteps = 4;
|
var numSteps = 4;
|
||||||
numZoomLevels = 29 * numSteps;
|
numZoomLevels = 29 * numSteps;
|
||||||
|
|||||||
Reference in New Issue
Block a user