diff --git a/src/ol/mapoptions.js b/src/ol/mapoptions.js
index ac3b3313f0..5285767287 100644
--- a/src/ol/mapoptions.js
+++ b/src/ol/mapoptions.js
@@ -1,3 +1,5 @@
+// FIXME rotation constraint is not configurable at the moment
+
goog.provide('ol.MapOptions');
goog.provide('ol.MapOptionsLiteral');
goog.provide('ol.MapOptionsType');
@@ -171,9 +173,27 @@ ol.MapOptions.create = function(mapOptionsLiteral) {
* @return {ol.Constraints} Map constraints.
*/
ol.MapOptions.createConstraints_ = function(mapOptionsLiteral) {
- // FIXME this should be configurable
- var resolutionConstraint = ol.ResolutionConstraint.createSnapToPower(
- Math.exp(Math.log(2) / 4), ol.Projection.EPSG_3857_HALF_SIZE / 128);
+ var resolutionConstraint;
+ if (goog.isDef(mapOptionsLiteral.resolutions)) {
+ resolutionConstraint = ol.ResolutionConstraint.createSnapToResolutions(
+ mapOptionsLiteral.resolutions);
+ } else {
+ var maxResolution, numZoomLevels, zoomFactor;
+ if (goog.isDef(mapOptionsLiteral.maxResolution) &&
+ goog.isDef(mapOptionsLiteral.numZoomLevels) &&
+ goog.isDef(mapOptionsLiteral.zoomFactor)) {
+ maxResolution = mapOptionsLiteral.maxResolution;
+ numZoomLevels = mapOptionsLiteral.numZoomLevels;
+ zoomFactor = mapOptionsLiteral.zoomFactor;
+ } else {
+ maxResolution = ol.Projection.EPSG_3857_HALF_SIZE / 128;
+ numZoomLevels = 29;
+ zoomFactor = Math.exp(Math.log(2) / 4);
+ }
+ resolutionConstraint = ol.ResolutionConstraint.createSnapToPower(
+ zoomFactor, maxResolution, numZoomLevels - 1);
+ }
+ // FIXME rotation constraint is not configurable at the moment
var rotationConstraint = ol.RotationConstraint.none;
return new ol.Constraints(resolutionConstraint, rotationConstraint);
};
diff --git a/test/ol.html b/test/ol.html
index 5f554dfa31..35f98a39a2 100644
--- a/test/ol.html
+++ b/test/ol.html
@@ -76,6 +76,7 @@
+
diff --git a/test/spec/ol/mapoptions.test.js b/test/spec/ol/mapoptions.test.js
new file mode 100644
index 0000000000..cfdb6a9815
--- /dev/null
+++ b/test/spec/ol/mapoptions.test.js
@@ -0,0 +1,54 @@
+goog.require('ol.MapOptions');
+
+describe('ol.MapOptions', function() {
+
+ describe('create constraints', function() {
+
+ describe('create resolution constraint', function() {
+
+ describe('with no options', function() {
+ it('gives a correct resolution constraint function', function() {
+ var options = {};
+ var fn = ol.MapOptions.createConstraints_(options).resolution;
+ expect(fn(156543.03392804097, 0))
+ .toRoughlyEqual(156543.03392804097, 1e-9);
+ expect(fn(78271.51696402048, 0))
+ .toRoughlyEqual(78271.51696402048, 1e-10);
+ });
+ });
+
+ describe('with maxResolution, numZoomLevels, and zoomFactor options',
+ function() {
+ it('gives a correct resolution constraint function', function() {
+ var options = {
+ maxResolution: 81,
+ numZoomLevels: 4,
+ zoomFactor: 3
+ };
+ var fn = ol.MapOptions.createConstraints_(options).resolution;
+ expect(fn(82, 0)).toEqual(81);
+ expect(fn(81, 0)).toEqual(81);
+ expect(fn(27, 0)).toEqual(27);
+ expect(fn(9, 0)).toEqual(9);
+ expect(fn(3, 0)).toEqual(3);
+ expect(fn(2, 0)).toEqual(3);
+ });
+ });
+
+ describe('with resolutions', function() {
+ it('gives a correct resolution constraint function', function() {
+ var options = {
+ resolutions: [97, 76, 65, 54, 0.45]
+ };
+ var fn = ol.MapOptions.createConstraints_(options).resolution;
+ expect(fn(97, 0), 97);
+ expect(fn(76, 0), 76);
+ expect(fn(65, 0), 65);
+ expect(fn(54, 0), 54);
+ expect(fn(0.45, 0), 0.45);
+ });
+ });
+
+ });
+ });
+});