[OpenLayers-Commits] r12106 - in trunk/openlayers: examples lib/OpenLayers lib/OpenLayers/Layer tests tests/Layer

commits-20090109 at openlayers.org commits-20090109 at openlayers.org
Sat Jun 18 15:25:48 EDT 2011


Author: ahocevar
Date: 2011-06-18 12:25:46 -0700 (Sat, 18 Jun 2011)
New Revision: 12106

Modified:
   trunk/openlayers/examples/bing-tiles.js
   trunk/openlayers/lib/OpenLayers/Layer.js
   trunk/openlayers/lib/OpenLayers/Layer/Bing.js
   trunk/openlayers/lib/OpenLayers/Layer/GoogleNG.js
   trunk/openlayers/lib/OpenLayers/Map.js
   trunk/openlayers/tests/Layer.html
   trunk/openlayers/tests/Layer/GoogleNG.html
   trunk/openlayers/tests/Map.html
Log:
removing the restrictedMinZoom property, and allow for restricting zoom levels with maxResolution and numZoomLevels. Thanks tschaub for the doc, test and examples improvements. r=tschaub (see #3338)


Modified: trunk/openlayers/examples/bing-tiles.js
===================================================================
--- trunk/openlayers/examples/bing-tiles.js	2011-06-18 19:11:54 UTC (rev 12105)
+++ trunk/openlayers/examples/bing-tiles.js	2011-06-18 19:25:46 UTC (rev 12106)
@@ -26,4 +26,4 @@
 map.setCenter(new OpenLayers.LonLat(-71.147, 42.472).transform(
     new OpenLayers.Projection("EPSG:4326"),
     map.getProjectionObject()
-), 12);
+), 11);

Modified: trunk/openlayers/lib/OpenLayers/Layer/Bing.js
===================================================================
--- trunk/openlayers/lib/OpenLayers/Layer/Bing.js	2011-06-18 19:11:54 UTC (rev 12105)
+++ trunk/openlayers/lib/OpenLayers/Layer/Bing.js	2011-06-18 19:25:46 UTC (rev 12106)
@@ -22,6 +22,21 @@
 OpenLayers.Layer.Bing = OpenLayers.Class(OpenLayers.Layer.XYZ, {
 
     /**
+     * Property: serverResolutions
+     * {Array} the resolutions provided by the Bing servers.
+     */
+    serverResolutions: [
+        156543.03390625, 78271.516953125, 39135.7584765625,
+        19567.87923828125, 9783.939619140625, 4891.9698095703125,
+        2445.9849047851562, 1222.9924523925781, 611.4962261962891,
+        305.74811309814453, 152.87405654907226, 76.43702827453613,
+        38.218514137268066, 19.109257068634033, 9.554628534317017,
+        4.777314267158508, 2.388657133579254, 1.194328566789627,
+        0.5971642833948135, 0.29858214169740677, 0.14929107084870338,
+        0.07464553542435169
+    ],
+    
+    /**
      * Property: attributionTemplate
      * {String}
      */
@@ -80,7 +95,6 @@
      */
     initialize: function(options) {
         options = OpenLayers.Util.applyDefaults({
-            restrictedMinZoom: 1,
             sphericalMercator: true
         }, options);
         var name = options.name || "Bing " + (options.type || this.type);
@@ -127,12 +141,14 @@
             this.url.push(url.replace("{subdomain}", res.imageUrlSubdomains[i]));
         };
         this.addOptions({
-            restrictedMinZoom: res.zoomMin,
-            numZoomLevels: res.zoomMax + 1
-        });
-        this.updateAttribution();
-        // redraw to replace "blank.gif" tiles with real tiles
-        this.redraw();
+            maxResolution: Math.min(
+                this.serverResolutions[res.zoomMin], this.maxResolution
+            ),
+            zoomOffset: res.zoomMin,
+            numZoomLevels: Math.min(
+                res.zoomMax + 1 - res.zoomMin, this.numZoomLevels
+            )
+        }, true);
     },
 
     /**

Modified: trunk/openlayers/lib/OpenLayers/Layer/GoogleNG.js
===================================================================
--- trunk/openlayers/lib/OpenLayers/Layer/GoogleNG.js	2011-06-18 19:11:54 UTC (rev 12105)
+++ trunk/openlayers/lib/OpenLayers/Layer/GoogleNG.js	2011-06-18 19:25:46 UTC (rev 12106)
@@ -26,6 +26,21 @@
     SUPPORTED_TRANSITIONS: [],
     
     /**
+     * Property: serverResolutions
+     * {Array} the resolutions provided by the Google API.
+     */
+    serverResolutions: [
+        156543.03390625, 78271.516953125, 39135.7584765625,
+        19567.87923828125, 9783.939619140625, 4891.9698095703125,
+        2445.9849047851562, 1222.9924523925781, 611.4962261962891,
+        305.74811309814453, 152.87405654907226, 76.43702827453613,
+        38.218514137268066, 19.109257068634033, 9.554628534317017,
+        4.777314267158508, 2.388657133579254, 1.194328566789627,
+        0.5971642833948135, 0.29858214169740677, 0.14929107084870338,
+        0.07464553542435169, 0.037322767712175846
+    ],
+    
+    /**
      * Property: attributionTemplate
      * {String}
      */
@@ -94,7 +109,6 @@
         var newArgs = [options.name, null, options];
         OpenLayers.Layer.XYZ.prototype.initialize.apply(this, newArgs);
         
-        this.options.numZoomLevels = options.numZoomLevels;
         if (!OpenLayers.Layer.GoogleNG.mapObject) {
             OpenLayers.Layer.GoogleNG.mapObject =
                 new google.maps.Map(document.createElement("div"));
@@ -121,26 +135,16 @@
             this.setName("Google " + mapType.name);
         }
         
-        var numZoomLevels = mapType.maxZoom + 1;
-        if (this.options.numZoomLevels != null) {
-            numZoomLevels = Math.min(numZoomLevels, this.options.numZoomLevels);
-        }
-        var restrictedMinZoom;
-        if (this.restrictedMinZoom || mapType.minZoom) {
-            restrictedMinZoom = Math.max(
-                mapType.minZoom || 0, this.restrictedMinZoom || 0
-            );
-        }
-        
+        var minZoom = mapType.minZoom || 0;
         this.addOptions({
-            restrictedMinZoom: restrictedMinZoom,
-            numZoomLevels: numZoomLevels,
-            tileSize: new OpenLayers.Size(
-                mapType.tileSize.width, mapType.tileSize.height
+            maxResolution: Math.min(
+                this.serverResolutions[minZoom], this.maxResolution
+            ),
+            zoomOffset: minZoom,
+            numZoomLevels: Math.min(
+                mapType.maxZoom + 1 - minZoom, this.numZoomLevels
             )
-        });
-        // redraw to populate tiles with content
-        this.redraw();
+        }, true);
     },
 
     /**

Modified: trunk/openlayers/lib/OpenLayers/Layer.js
===================================================================
--- trunk/openlayers/lib/OpenLayers/Layer.js	2011-06-18 19:11:54 UTC (rev 12105)
+++ trunk/openlayers/lib/OpenLayers/Layer.js	2011-06-18 19:25:46 UTC (rev 12106)
@@ -276,18 +276,6 @@
     numZoomLevels: null,
     
     /**
-     * Property: restrictedMinZoom
-     * {Integer} Restriction of the minimum zoom level. This is used for layers
-     *     that only use a subset of the resolutions in the <resolutions>
-     *     array. This is independent of <numResolutions>, which always starts
-     *     counting at zoom level 0. If restrictedMinZoom is e.g. set to 2,
-     *     the first two zoom levels (0 and 1) will not be used by this layer.
-     *     If the layer is a base layer, zooming to the map's maxExtent means
-     *     setting the map's zoom to 2.
-     */
-    restrictedMinZoom: 0,
-   
-    /**
      * APIProperty: minScale
      * {Float}
      */
@@ -474,8 +462,12 @@
     * 
     * Parameters:
     * newOptions - {Object}
+    * reinitialize - {Boolean} If set to true, and if resolution options of the
+    *     current baseLayer were changed, the map will be recentered to make
+    *     sure that it is displayed with a valid resolution, and a
+    *     changebaselayer event will be triggered.
     */
-    addOptions: function (newOptions) {
+    addOptions: function (newOptions, reinitialize) {
 
         if (this.options == null) {
             this.options = {};
@@ -502,6 +494,8 @@
         // properties of the "properties" array defined below is set
         // in the new options
         if(this.map) {
+            // store current resolution so we can try to restore it later
+            var resolution = this.map.getResolution();
             var properties = this.RESOLUTION_PROPERTIES.concat(
                 ["projection", "units", "minExtent", "maxExtent"]
             );
@@ -510,6 +504,20 @@
                    OpenLayers.Util.indexOf(properties, o) >= 0) {
 
                     this.initResolutions();
+                    if (reinitialize && this.map.baseLayer === this) {
+                        // update map position, and restore previous resolution
+                        this.map.setCenter(this.map.getCenter(),
+                            this.map.getZoomForResolution(resolution),
+                            false, true
+                        );
+                        // trigger a changebaselayer event to make sure that
+                        // all controls (especially
+                        // OpenLayers.Control.PanZoomBar) get notified of the
+                        // new options
+                        this.map.events.triggerEvent("changebaselayer", {
+                            layer: this
+                        });
+                    }
                     break;
                 }
             }
@@ -763,8 +771,7 @@
         } else {
             if (this.map) {
                 var resolution = this.map.getResolution();
-                inRange = ( this.map.getZoom() >= this.restrictedMinZoom &&
-                            (resolution >= this.minResolution) &&
+                inRange = ( (resolution >= this.minResolution) &&
                             (resolution <= this.maxResolution) );
             }
         }
@@ -1197,7 +1204,7 @@
             }
             zoom = Math.max(0, i-1);
         }
-        return Math.max(this.restrictedMinZoom, zoom);
+        return zoom;
     },
     
     /**

Modified: trunk/openlayers/lib/OpenLayers/Map.js
===================================================================
--- trunk/openlayers/lib/OpenLayers/Map.js	2011-06-18 19:11:54 UTC (rev 12105)
+++ trunk/openlayers/lib/OpenLayers/Map.js	2011-06-18 19:25:46 UTC (rev 12106)
@@ -1927,8 +1927,8 @@
      */
     isValidZoomLevel: function(zoomLevel) {
         return ( (zoomLevel != null) &&
-                (zoomLevel >= this.getRestrictedMinZoom()) && 
-                (zoomLevel < this.getNumZoomLevels()) );
+                 (zoomLevel >= 0) && 
+                 (zoomLevel < this.getNumZoomLevels()) );
     },
     
     /**
@@ -2032,20 +2032,6 @@
     },
     
     /**
-     * Method: getRestricteMinZoom
-     *
-     * Returns:
-     * {Integer} the minimum zoom level allowed for the current baseLayer.
-     */
-    getRestrictedMinZoom: function() {
-        var minZoom = null;
-        if (this.baseLayer != null) {
-            minZoom = this.baseLayer.restrictedMinZoom;
-        }
-        return minZoom;
-    },
-    
-    /**
      * APIMethod: getNumZoomLevels
      * 
      * Returns:

Modified: trunk/openlayers/tests/Layer/GoogleNG.html
===================================================================
--- trunk/openlayers/tests/Layer/GoogleNG.html	2011-06-18 19:11:54 UTC (rev 12105)
+++ trunk/openlayers/tests/Layer/GoogleNG.html	2011-06-18 19:25:46 UTC (rev 12106)
@@ -20,7 +20,7 @@
         var log = {};
         layer = new OpenLayers.Layer.GoogleNG({
             numZoomLevels: 10,
-            restrictedMinZoom: 2,
+            maxResolution: 39135.7584765625,
             initLayer: function() {
                 log[layer.id] = true;
                 OpenLayers.Layer.GoogleNG.prototype.initLayer.apply(this, arguments);
@@ -30,13 +30,14 @@
         map.zoomToMaxExtent();
         
         var map2 = new OpenLayers.Map("map2");
+        var minZoom = 1;
         var layer2 = new OpenLayers.Layer.GoogleNG({
             numZoomLevels: 24,
             initLayer: function() {
                 log[layer2.id] = true;
                 var origMinZoom = OpenLayers.Layer.GoogleNG.mapObject.mapTypes[layer2.type].minZoom;
-                // pretend the API reports a minZoom of 1
-                OpenLayers.Layer.GoogleNG.mapObject.mapTypes[layer2.type].minZoom = 1;
+                // pretend the API reports a different minZoom
+                OpenLayers.Layer.GoogleNG.mapObject.mapTypes[layer2.type].minZoom = minZoom;
                 OpenLayers.Layer.GoogleNG.prototype.initLayer.apply(this, arguments);
                 OpenLayers.Layer.GoogleNG.mapObject.mapTypes[layer2.type].minZoom = origMinZoom;
             }
@@ -49,10 +50,10 @@
             t.eq(log[layer2.id], true, "initLayer called for 2nd layer");
             
             t.eq(layer.numZoomLevels, 10, "numZoomLevels from configuration takes precedence if lower");
-            t.eq(layer2.numZoomLevels, OpenLayers.Layer.GoogleNG.mapObject.mapTypes[layer2.type].maxZoom+1, "numZoomLevels from API takes precedence if lower");
+            t.eq(layer2.numZoomLevels, OpenLayers.Layer.GoogleNG.mapObject.mapTypes[layer2.type].maxZoom + 1 - minZoom, "numZoomLevels from API takes precedence if lower");
 
-            t.eq(layer.restrictedMinZoom, 2, "restrictedMinZoom from configuration takes precedence if higher");
-            t.eq(layer2.restrictedMinZoom, 1, "restrictedMinZoom from API takes precedence if higher");
+            t.eq(layer.maxResolution, 39135.7584765625, "maxResolution from configuration takes precedence if higher");
+            t.eq(layer2.maxResolution, 78271.516953125, "maxResolution from API takes precedence if higher");
 
             map.destroy();
             map2.destroy();            

Modified: trunk/openlayers/tests/Layer.html
===================================================================
--- trunk/openlayers/tests/Layer.html	2011-06-18 19:11:54 UTC (rev 12105)
+++ trunk/openlayers/tests/Layer.html	2011-06-18 19:25:46 UTC (rev 12106)
@@ -82,9 +82,9 @@
 
     function test_Layer_addOptions (t) {
         
-        t.plan( 19 );
+        t.plan( 20 );
 
-        var map = new OpenLayers.Map("map");
+        var map = new OpenLayers.Map("map", {allOverlays: true});
         var options = { chicken: 151, foo: "bar" };
         var layer = new OpenLayers.Layer('Test Layer', options);
         map.addLayer(layer);
@@ -156,6 +156,17 @@
         layer.addOptions({projection: "EPSG:900913"});
         t.ok(layer.projection instanceof OpenLayers.Projection,
              "addOptions creates a Projection object when given a projection string");
+        
+        log = null;
+        // adding a 2nd layer to see if it gets reinitialized properly
+        var layer2 = new OpenLayers.Layer(null, {
+            moveTo: function(bounds) {
+                log = bounds;
+            }
+        });
+        map.addLayer(layer2);
+        layer.addOptions({maxResolution: 0.00034332275390625}, true);
+        t.eq(log.toBBOX(), map.getExtent().toBBOX(), "when reinitialize is set to true, changing base layer's resolution property reinitializes all layers.");
 
         map.removeLayer(layer);
         log = 0;
@@ -556,7 +567,7 @@
 
     function test_Layer_getZoomForResolution(t) {
 
-        t.plan(13);
+        t.plan(12);
 
         var layer = new OpenLayers.Layer('Test Layer');
         layer.map = {};
@@ -584,10 +595,6 @@
              "(fractionalZoom) doesn't return zoom below zero");
         t.eq(layer.getZoomForResolution(1).toPrecision(6), (layer.resolutions.length - 1).toPrecision(6),
              "(fractionalZoom) doesn't return zoom above highest index");
-        
-        layer.restrictedMinZoom = 1;
-        t.eq(layer.getZoomForResolution(200), 1, "zoom all the way out, but we have a restrictedMinZoom of 1");
-
     }
     
     function test_Layer_redraw(t) {

Modified: trunk/openlayers/tests/Map.html
===================================================================
--- trunk/openlayers/tests/Map.html	2011-06-18 19:11:54 UTC (rev 12105)
+++ trunk/openlayers/tests/Map.html	2011-06-18 19:25:46 UTC (rev 12106)
@@ -338,32 +338,25 @@
  */
 
     function test_Map_isValidZoomLevel(t) {
-        t.plan(6);
+        t.plan(4);
         var map = new OpenLayers.Map("map");
         map.addLayer(new OpenLayers.Layer(null, {
             isBaseLayer: true, numZoomLevels: 19
         }))
         var valid;
 
+        valid = OpenLayers.Map.prototype.isValidZoomLevel.apply(map, [-1]);
+        t.eq(valid, false, "-1 is not a valid zoomLevel");
+
         valid = OpenLayers.Map.prototype.isValidZoomLevel.apply(map, [0]);
-        t.eq(valid, true, "0 is a valid zoomLevel when baseLayer has no restrictedMinZoom");
+        t.eq(valid, true, "0 is a valid zoomLevel");
 
         valid = OpenLayers.Map.prototype.isValidZoomLevel.apply(map, [18]);
         t.eq(valid, true, "18 is a valid zoomLevel");
 
         valid = OpenLayers.Map.prototype.isValidZoomLevel.apply(map, [19]);
         t.eq(valid, false, "19 is not a valid zoomLevel");
-        
-        map.baseLayer.restrictedMinZoom = 1;
-        valid = OpenLayers.Map.prototype.isValidZoomLevel.apply(map, [0]);
-        t.eq(valid, false, "0 is not a valid zoomLevel when baseLayer has restrictedMinZoom of 1");
 
-        valid = OpenLayers.Map.prototype.isValidZoomLevel.apply(map, [1]);
-        t.eq(valid, true, "1 is a valid zoomLevel");
-
-        valid = OpenLayers.Map.prototype.isValidZoomLevel.apply(map, [19]);
-        t.eq(valid, false, "19 is not a valid zoomLevel when baseLayer has restrictedMinZoom of 1");
-
         map.destroy();
     }
     
@@ -1296,27 +1289,6 @@
         var maxExtent = OpenLayers.Map.prototype.getMaxExtent.apply(map, [options]);
         t.ok(maxExtent == map.baseLayer.maxExtent, "null options, valid baseLayer returns map.baseLayer.maxExtent");     
     }
-
-    function test_Map_getRestrictedMinZoom(t){
-        t.plan(3);
-
-        var map = {};
-
-      //no baseLayer
-        var minZoom = OpenLayers.Map.prototype.getRestrictedMinZoom.apply(map);
-        t.eq(minZoom, null, "no baseLayer returns null");
-        
-        map.baseLayer = new OpenLayers.Layer(null, {isBaseLayer: true});
-
-      //baseLayer
-        minZoom = OpenLayers.Map.prototype.getRestrictedMinZoom.apply(map);
-        t.eq(minZoom, 0, "default baseLayer.restrictedMinZoom returns 0");     
-
-      //custom minZoomLevel on baseLayer
-        map.baseLayer.restrictedMinZoom = 1;
-        minZoom = OpenLayers.Map.prototype.getRestrictedMinZoom.apply(map);
-        t.eq(minZoom, map.baseLayer.restrictedMinZoom, "custom baseLayer.restrictedMinZoom returns map.baseLayer.restrictedMinZoom");     
-    }
     
     function test_Map_zoomToMaxExtent(t){
         t.plan(4)



More information about the Commits mailing list