[OpenLayers-Commits] r12000 - in trunk/openlayers: examples lib lib/OpenLayers lib/OpenLayers/Layer lib/OpenLayers/Tile tests tests/Layer tests/Tile theme/default

commits-20090109 at openlayers.org commits-20090109 at openlayers.org
Mon May 23 17:42:12 EDT 2011


Author: ahocevar
Date: 2011-05-23 14:42:09 -0700 (Mon, 23 May 2011)
New Revision: 12000

Added:
   trunk/openlayers/examples/google-ng.html
   trunk/openlayers/examples/google-ng.js
   trunk/openlayers/lib/OpenLayers/Layer/GoogleNG.js
   trunk/openlayers/lib/OpenLayers/Tile/Google.js
   trunk/openlayers/tests/Layer/GoogleNG.html
   trunk/openlayers/tests/Tile/Google.html
Modified:
   trunk/openlayers/lib/OpenLayers.js
   trunk/openlayers/lib/OpenLayers/Tile.js
   trunk/openlayers/tests/list-tests.html
   trunk/openlayers/theme/default/style.css
Log:
New GoogleNG layer using tiles from the v3 API's mapType::getTile method. r=bartvde (closes #3312)

Added: trunk/openlayers/examples/google-ng.html
===================================================================
--- trunk/openlayers/examples/google-ng.html	                        (rev 0)
+++ trunk/openlayers/examples/google-ng.html	2011-05-23 21:42:09 UTC (rev 12000)
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html>
+    <head>
+    <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;" />
+    <meta name="apple-mobile-web-app-capable" content="yes" />
+        <title>OpenLayers Google NG Layer Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css">
+        <link rel="stylesheet" href="../theme/default/google.css" type="text/css">
+        <link rel="stylesheet" href="style.css" type="text/css">
+        <style type="text/css">
+        .olControlAttribution {
+            left: 5px;
+            right: inherit;
+            bottom: 5px; 
+        }
+        </style>
+        <script src="http://maps.google.com/maps/api/js?v=3.5&amp;sensor=false"></script>
+        <script src="../lib/OpenLayers.js"></script>
+        <script src="google-ng.js"></script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Google NG Layer Example</h1>
+        <div id="tags">
+            Google, api key, apikey
+        </div>
+        <p id="shortdesc">
+            Demonstrate use of tiles from the Google Maps v3 API.
+        </p>
+        <div id="map" class="smallmap"></div>
+        <div id="docs">
+            <p>
+                If you use OpenLayers.Layer.GoogleNG, the getTile method of the
+                GMaps v3 API's MapType is used to load tiles.  This allows for
+                better integration than interacting with a whole map generated
+                by a google.maps.Map instance, as done with
+                OpenLayers.Layer.Google.  See the
+                <a href="google-ng.js" target="_blank">google-ng.js source</a> 
+                to see how this is done.
+            </p>
+        </div>
+    </body>
+</html>

Added: trunk/openlayers/examples/google-ng.js
===================================================================
--- trunk/openlayers/examples/google-ng.js	                        (rev 0)
+++ trunk/openlayers/examples/google-ng.js	2011-05-23 21:42:09 UTC (rev 12000)
@@ -0,0 +1,28 @@
+var map;
+
+function init() {
+    map = new OpenLayers.Map('map');
+    map.addControl(new OpenLayers.Control.LayerSwitcher());
+    
+    var gphy = new OpenLayers.Layer.GoogleNG(
+        {type: google.maps.MapTypeId.TERRAIN}
+    );
+    var gmap = new OpenLayers.Layer.GoogleNG(
+        // ROADMAP, the default
+    );
+    var ghyb = new OpenLayers.Layer.GoogleNG(
+        {type: google.maps.MapTypeId.HYBRID}
+    );
+    var gsat = new OpenLayers.Layer.GoogleNG(
+        {type: google.maps.MapTypeId.SATELLITE}
+    );
+
+    map.addLayers([gphy, gmap, ghyb, gsat]);
+
+    // GoogleNG uses EPSG:900913 as projection, so we have to
+    // transform our coordinates
+    map.setCenter(new OpenLayers.LonLat(10.2, 48.9).transform(
+        new OpenLayers.Projection("EPSG:4326"),
+        map.getProjectionObject()
+    ), 5);
+}

Added: trunk/openlayers/lib/OpenLayers/Layer/GoogleNG.js
===================================================================
--- trunk/openlayers/lib/OpenLayers/Layer/GoogleNG.js	                        (rev 0)
+++ trunk/openlayers/lib/OpenLayers/Layer/GoogleNG.js	2011-05-23 21:42:09 UTC (rev 12000)
@@ -0,0 +1,239 @@
+/* Copyright (c) 2006-2011 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Layer/XYZ.js
+ */
+
+/** 
+ * Class: OpenLayers.Layer.GoogleNG
+ * Google layer using <OpenLayers.Tile.Google> tiles. Note: Terms of Service
+ * compliant use requires the map to be configured with an
+ * <OpenLayers.Control.Attribution> control and the attribution placed on or
+ * near the map.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Layer.XYZ>
+ */
+OpenLayers.Layer.GoogleNG = OpenLayers.Class(OpenLayers.Layer.XYZ, {
+
+    /**
+     * Property: SUPPORTED_TRANSITIONS
+     * {Array} An immutable (that means don't change it!) list of supported 
+     *     transitionEffect values. This layer type supports none.
+     */
+    SUPPORTED_TRANSITIONS: [],
+    
+    /**
+     * Property: attributionTemplate
+     * {String}
+     */
+    attributionTemplate: '<span class="olGoogleAttribution ${mapType}">' +
+         '<div><a target="_blank" href="http://maps.google.com/maps?' +
+         'll=${center}&z=${zoom}&t=${t}"><img width="62" height="24" ' +
+         'src="http://maps.gstatic.com/mapfiles/google_white.png"/></a>' +
+         '</div><a style="white-space: nowrap" target="_blank" ' +
+         'href="http://maps.google.com/maps/api/staticmap?sensor=true' +
+         '&center=${center}&zoom=${zoom}&size=${size}&maptype=${mapType}">' +
+         'Map data</a> - <a style="white-space: nowrap" target="_blank" ' +
+         'href="http://www.google.com/help/terms_maps.html">' +
+         'Terms of Use</a></span>',
+    
+    /**
+     * Property: mapTypes
+     * {Object} mapping of {google.maps.MapTypeId} to the t param of
+     * http://maps.google.com/maps? permalinks
+     */
+    mapTypes: {
+        "roadmap": "m",
+        "satellite": "k",
+        "hybrid": "h",
+        "terrain": "p"
+    },
+    
+    /**
+     * Property: mapObject
+     * {google.maps.Map} Shared GMaps instance - will be set on the prototype
+     * upon instantiation of the 1st GoogleNG layer
+     */
+    mapObject: null,
+
+    /**
+     * APIProperty: type
+     * {google.maps.MapTypeId} See
+     * http://code.google.com/apis/maps/documentation/javascript/reference.html#MapTypeId
+     */
+    type: null,
+    
+    /**
+     * Constructor: OpenLayers.Layer.GoogleNG
+     * Create a new GoogleNG layer. Requires the GMaps v3 JavaScript API script
+     * included in the html document.
+     *
+     * Example:
+     * (code)
+     * var terrain = new OpenLayers.Layer.GoogleNG({
+     *     name: "Google Terrain",
+     *     type: google.maps.MapTypeId.TERRAIN
+     * });
+     * (end)
+     *
+     * Parameters:
+     * options - {Object} Configuration properties for the layer.
+     *
+     * Required configuration properties:
+     * type - {google.maps.MapTypeId} The layer identifier.  See
+     *     http://code.google.com/apis/maps/documentation/javascript/reference.html#MapTypeId
+     *     for valid types.
+     *
+     * Any other documented layer properties can be provided in the config object.
+     */
+    initialize: function(options) {
+        options = OpenLayers.Util.applyDefaults({
+            sphericalMercator: true
+        }, options);
+
+        if (!options.type) {
+            options.type = google.maps.MapTypeId.ROADMAP;
+        }
+        var newArgs = [options.name, null, options];
+        OpenLayers.Layer.XYZ.prototype.initialize.apply(this, newArgs);
+        
+        this.options.numZoomLevels = options.numZoomLevels;
+        if (!this.mapObject) {
+            OpenLayers.Layer.GoogleNG.prototype.mapObject =
+                new google.maps.Map(document.createElement("div"));
+        }
+        if (this.mapObject.mapTypes[this.type]) {
+            this.initLayer();
+        } else {
+            google.maps.event.addListenerOnce(
+                this.mapObject, 
+                "idle", 
+                OpenLayers.Function.bind(this.initLayer, this)
+            );
+        }
+    },
+
+    /**
+     * Method: initLayer
+     *
+     * Sets layer properties according to the metadata provided by the API
+     */
+    initLayer: function() {
+        var mapType = this.mapObject.mapTypes[this.type];
+        if (!this.name) {
+            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
+            );
+        }
+        
+        this.addOptions({
+            restrictedMinZoom: restrictedMinZoom,
+            numZoomLevels: numZoomLevels,
+            tileSize: new OpenLayers.Size(
+                mapType.tileSize.width, mapType.tileSize.height
+            )
+        });
+        // redraw to populate tiles with content
+        this.redraw();
+    },
+
+    /**
+     * APIMethod: addTile
+     * Create a tile, initialize it, and add it to the layer div. 
+     *
+     * Parameters
+     * bounds - {<OpenLayers.Bounds>}
+     * position - {<OpenLayers.Pixel>}
+     *
+     * Returns:
+     * {<OpenLayers.Tile.Google>} The added OpenLayers.Tile.Google
+     */
+    addTile:function(bounds, position) {
+        return new OpenLayers.Tile.Google(
+            this, position, bounds, this.tileOptions
+        );
+    },
+    
+    /**
+     * Method: updateAttribution
+     * Updates the attribution using the <attributionTemplate>
+     */
+    updateAttribution: function() {
+        var center = this.map.getCenter();
+        center && center.transform(
+            this.map.getProjectionObject(),
+            new OpenLayers.Projection("EPSG:4326")
+        );
+        var size = this.map.getSize();
+        this.attribution = OpenLayers.String.format(this.attributionTemplate, {
+            center: center ? center.lat + "," + center.lon : "",
+            zoom: this.map.getZoom(),
+            size: size.w + "x" + size.h,
+            t: this.mapTypes[this.type],
+            mapType: this.type
+        });
+        this.map && this.map.events.triggerEvent("changelayer", {layer: this});
+    },
+
+    /**
+     * Method: setMap
+     */
+    setMap: function() {
+        OpenLayers.Layer.XYZ.prototype.setMap.apply(this, arguments);
+
+        this.updateAttribution();
+        this.map.events.register("moveend", this, this.updateAttribution);
+    },
+    
+    /**
+     * Method: removeMap
+     */
+    removeMap: function() {
+        OpenLayers.Layer.XYZ.prototype.removeMap.apply(this, arguments);
+        this.map.events.unregister("moveend", this, this.updateAttribution);
+    },
+        
+    /**
+     * APIMethod: clone
+     * 
+     * Parameters:
+     * obj - {Object}
+     * 
+     * Returns:
+     * {<OpenLayers.Layer.GoogleNG>} An exact clone of this
+     * <OpenLayers.Layer.GoogleNG>
+     */
+    clone: function(obj) {
+        if (obj == null) {
+            obj = new OpenLayers.Layer.GoogleNG(this.options);
+        }
+        //get all additions from superclasses
+        obj = OpenLayers.Layer.XYZ.prototype.clone.apply(this, [obj]);
+        // copy/set any non-init, non-simple values here
+        return obj;
+    },
+    
+    /**
+     * Method: destroy
+     */
+    destroy: function() {
+        this.map &&
+            this.map.events.unregister("moveend", this, this.updateAttribution);
+        OpenLayers.Layer.XYZ.prototype.destroy.apply(this, arguments);
+    },
+    
+    CLASS_NAME: "OpenLayers.Layer.GoogleNG"
+});
\ No newline at end of file

Added: trunk/openlayers/lib/OpenLayers/Tile/Google.js
===================================================================
--- trunk/openlayers/lib/OpenLayers/Tile/Google.js	                        (rev 0)
+++ trunk/openlayers/lib/OpenLayers/Tile/Google.js	2011-05-23 21:42:09 UTC (rev 12000)
@@ -0,0 +1,151 @@
+/* Copyright (c) 2006-2011 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/*
+ * @requires OpenLayers/BaseTypes/Class.js
+ * @requires OpenLayers/Util.js
+ * @requires OpenLayers/Console.js
+ * @requires OpenLayers/Lang.js
+ */
+
+/*
+ * Class: OpenLayers.Tile.Google
+ * Instances of OpenLayers.Tile.Google are used to manage the tiles created
+ * by google.maps.MapType (see
+ * http://code.google.com/apis/maps/documentation/javascript/reference.html#MapType).
+ *
+ * Inherits from:
+ *  - <OpenLayers.Tile>
+ */
+OpenLayers.Tile.Google = OpenLayers.Class(OpenLayers.Tile, {
+    
+    /**
+     * Property: node
+     * {DOMElement} The tile node from the MapType's getTile method
+     */
+    node: null,
+        
+    /** 
+     * Constructor: OpenLayers.Tile.Google
+     * Constructor for a new <OpenLayers.Tile.Google> instance.
+     * 
+     * Parameters:
+     * layer - {<OpenLayers.Layer>} layer that the tile will go in.
+     * position - {<OpenLayers.Pixel>}
+     * bounds - {<OpenLayers.Bounds>}
+     * options - {Object}
+     */   
+    initialize: function(layer, position, bounds, options) {
+        OpenLayers.Tile.prototype.initialize.apply(this, [
+            layer, position, bounds, null, null, options
+        ]);
+    },
+
+    /** 
+     * APIMethod: destroy
+     * Nullify references to prevent circular references and memory leaks.
+     */
+    destroy:function() {
+        this.node && this.clear();
+        this.node = null;
+        OpenLayers.Tile.prototype.destroy.apply(this, arguments);
+    },
+    
+    /**
+     * Method: clone
+     *
+     * Parameters:
+     * obj - {<OpenLayers.Tile>} The tile to be cloned
+     *
+     * Returns:
+     * {<OpenLayers.Tile>} An exact clone of this <OpenLayers.Tile.Google>
+     */
+    clone: function (obj) {
+        if (obj == null) {
+            obj = new OpenLayers.Tile.Google(this.layer, 
+                                      this.position, 
+                                      this.bounds);
+        } 
+        
+        // catch any randomly tagged-on properties
+        OpenLayers.Util.applyDefaults(obj, this);
+        
+        obj.node = null;
+        
+        return obj;
+    },
+
+    /**
+     * Method: draw
+     * Check that a tile should be drawn, and draw it.
+     * 
+     * Returns:
+     * {Boolean} Always returns true.
+     */
+    draw: function() {
+        var layerType = this.layer.mapObject.mapTypes[this.layer.type];
+        if (layerType && OpenLayers.Tile.prototype.draw.apply(this, arguments)) {
+            var xyz = this.layer.getXYZ(this.bounds);
+            var point = new google.maps.Point(xyz.x, xyz.y);
+
+            // The hybrid tile consists of two images. For some reason, we have
+            // to make sure that the satellite image loads first, otherwise we
+            // occasionally get blank tiles for one of the two images. This is
+            // done by requesting the tile for just the satellite mapType
+            // first, before requesting the hybrid one.
+            //TODO revisit this - it may be a temporary issue with GMaps
+            var tempTile;
+            if (this.layer.type === google.maps.MapTypeId.HYBRID) {
+                tempTile = layerType.getTile(point, xyz.z, document);
+            }
+            
+            this.node = layerType.getTile(point, xyz.z, document);
+                        
+            this.isLoading = true;
+            this.events.triggerEvent("loadstart");
+
+            this.layer.div.appendChild(this.node);
+            
+            // We only modify what we need to - we expect the size to be set
+            // by getTile, and we have a test that will fail if this changes.
+            OpenLayers.Util.modifyDOMElement(
+                this.node, null, this.position, null, "absolute"
+            );  
+            
+            // The images inside the node returned from getTile seem to be
+            // preloaded already, so registering onload events on these images
+            // won't work. Instead, we trigger the loadend event immediately
+            // in the next cycle.
+            window.setTimeout(OpenLayers.Function.bind(function() {
+                this.isLoading = false;
+                // check for this.events - we may be destroyed already
+                this.events && this.events.triggerEvent("loadend"); 
+
+                // see hybrid tile issue above
+                //TODO revisit this - it may be a temporary issue with GMaps
+                if (tempTile) {
+                    layerType.releaseTile(tempTile);
+                }
+            }, this), 0);
+        }
+        return true;
+    },
+    
+    /** 
+     * Method: clear
+     * Clear the tile of any bounds/position-related data so that it can 
+     *     be reused in a new location. To be implemented by subclasses.
+     */
+    clear: function() {
+        if (this.node) {
+            this.node.parentNode &&
+                this.node.parentNode.removeChild(this.node);
+            this.layer.mapObject.mapTypes[this.layer.type].releaseTile(this.node);
+        }
+    },
+    
+    CLASS_NAME: "OpenLayers.Tile.Google"
+});

Modified: trunk/openlayers/lib/OpenLayers/Tile.js
===================================================================
--- trunk/openlayers/lib/OpenLayers/Tile.js	2011-05-23 21:27:54 UTC (rev 11999)
+++ trunk/openlayers/lib/OpenLayers/Tile.js	2011-05-23 21:42:09 UTC (rev 12000)
@@ -103,7 +103,9 @@
         this.position = position.clone();
         this.bounds = bounds.clone();
         this.url = url;
-        this.size = size.clone();
+        if (size) {
+            this.size = size.clone();
+        }
 
         //give the tile a unique id based on its BBOX.
         this.id = OpenLayers.Util.createUniqueID("Tile_");

Modified: trunk/openlayers/lib/OpenLayers.js
===================================================================
--- trunk/openlayers/lib/OpenLayers.js	2011-05-23 21:27:54 UTC (rev 11999)
+++ trunk/openlayers/lib/OpenLayers.js	2011-05-23 21:42:09 UTC (rev 12000)
@@ -120,6 +120,7 @@
                 "OpenLayers/Marker/Box.js",
                 "OpenLayers/Popup.js",
                 "OpenLayers/Tile.js",
+                "OpenLayers/Tile/Google.js",
                 "OpenLayers/Tile/Image.js",
                 "OpenLayers/Tile/Image/IFrame.js",
                 "OpenLayers/Tile/WFS.js",
@@ -152,6 +153,7 @@
                 "OpenLayers/Layer/Boxes.js",
                 "OpenLayers/Layer/XYZ.js",
                 "OpenLayers/Layer/Bing.js",
+                "OpenLayers/Layer/GoogleNG.js",
                 "OpenLayers/Layer/TMS.js",
                 "OpenLayers/Layer/TileCache.js",
                 "OpenLayers/Layer/Zoomify.js",

Added: trunk/openlayers/tests/Layer/GoogleNG.html
===================================================================
--- trunk/openlayers/tests/Layer/GoogleNG.html	                        (rev 0)
+++ trunk/openlayers/tests/Layer/GoogleNG.html	2011-05-23 21:42:09 UTC (rev 12000)
@@ -0,0 +1,96 @@
+<html>
+<head>
+  <script src="http://maps.google.com/maps/api/js?sensor=false&v=3.5"></script>
+  <script src="../OLLoader.js"></script>
+  <script type="text/javascript">
+    var map, layer; 
+
+    function test_constructor(t) {
+        t.plan(2);
+                       
+        layer = new OpenLayers.Layer.GoogleNG({type: google.maps.MapTypeId.HYBRID});
+        t.ok(layer instanceof OpenLayers.Layer.GoogleNG, "returns OpenLayers.Layer.GoogleNG object" );
+        t.eq(layer.type, google.maps.MapTypeId.HYBRID, "Layer type set");
+    }
+    
+    function test_initLayer(t) {
+        t.plan(6);
+
+        map = new OpenLayers.Map("map");
+        var log = {};
+        layer = new OpenLayers.Layer.GoogleNG({
+            numZoomLevels: 10,
+            restrictedMinZoom: 2,
+            initLayer: function() {
+                log[layer.id] = true;
+                OpenLayers.Layer.GoogleNG.prototype.initLayer.apply(this, arguments);
+            }
+        });
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        
+        var map2 = new OpenLayers.Map("map2");
+        var layer2 = new OpenLayers.Layer.GoogleNG({
+            numZoomLevels: 24,
+            initLayer: function() {
+                log[layer2.id] = true;
+                var origMinZoom = layer2.mapObject.mapTypes[layer2.type].minZoom;
+                // pretend the API reports a minZoom of 1
+                layer2.mapObject.mapTypes[layer2.type].minZoom = 1;
+                OpenLayers.Layer.GoogleNG.prototype.initLayer.apply(this, arguments);
+                layer2.mapObject.mapTypes[layer2.type].minZoom = origMinZoom;
+            }
+        });
+        map2.addLayer(layer2);
+        map2.zoomToMaxExtent();
+        
+        t.delay_call(1, function() {
+            t.eq(log[layer.id], true, "initLayer called for 1st layer");
+            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, layer2.mapObject.mapTypes[layer2.type].maxZoom+1, "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");
+
+            map.destroy();
+            map2.destroy();            
+        });
+    }
+    
+    function test_attribution(t) {
+        t.plan(3);
+        
+        var log = [];
+        map = new OpenLayers.Map("map");
+        layer = new OpenLayers.Layer.GoogleNG({type: google.maps.MapTypeId.HYBRID});
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        
+        t.delay_call(1, function() {
+            t.ok(layer.attribution.indexOf('olGoogleAttribution hybrid') !== -1, "Attribution has the correct css class");
+            t.ok(layer.attribution.indexOf('?ll=0,0&z=0&t=h"') != -1, "maps.google.com link has correct parameters");
+            t.ok(layer.attribution.indexOf('&center=0,0&zoom=0&size=500x550&maptype=hybrid') != -1 , "Attribution has correct map data link");
+            map.destroy();
+        });
+    }
+
+    function test_clone(t) {
+        t.plan(2);
+        
+        var clone;
+        
+        layer = new OpenLayers.Layer.GoogleNG({type: google.maps.MapTypeId.HYBRID});
+        clone = layer.clone();
+        t.ok(clone instanceof OpenLayers.Layer.GoogleNG, "clone is a Layer.GoogleNG instance");
+        t.eq(clone.type, google.maps.MapTypeId.HYBRID, "with the correct map type");
+    }
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:500px;height:550px"></div>
+<div id="map2" style="width:500px;height:550px"></div>
+</body>
+</html>

Added: trunk/openlayers/tests/Tile/Google.html
===================================================================
--- trunk/openlayers/tests/Tile/Google.html	                        (rev 0)
+++ trunk/openlayers/tests/Tile/Google.html	2011-05-23 21:42:09 UTC (rev 12000)
@@ -0,0 +1,74 @@
+<html>
+<head>
+  <script src="http://maps.google.com/maps/api/js?sensor=false&v=3.5"></script>
+  <script src="../OLLoader.js"></script>
+  <script type="text/javascript">
+    var tile; 
+    var layer = new OpenLayers.Layer.GoogleNG(); 
+    var position = new OpenLayers.Pixel(20,30);
+    var bounds = new OpenLayers.Bounds(1,2,3,4);
+
+    
+    function test_constructor (t) {
+        t.plan( 4 );
+        
+        tile = new OpenLayers.Tile.Google(layer, position, bounds);
+    
+        t.ok( tile instanceof OpenLayers.Tile.Google, "new OpenLayers.Tile.Google returns Tile object" );
+        t.ok( tile.layer == layer, "tile.layer is set correctly");
+        t.ok( tile.position.equals(position), "tile.position is set correctly");
+        t.ok( tile.bounds.equals(bounds), "tile.bounds is set correctly");
+    }
+
+    function test_clone (t) {
+        t.plan( 5 );
+        
+        tile = new OpenLayers.Tile.Google(layer, position, bounds);
+        tile.node = document.createElement("div");
+        var clone = tile.clone();
+    
+        t.ok( clone instanceof OpenLayers.Tile.Google, "OpenLayers.Tile.Google.clone returns Tile.Google object" );
+        t.ok( clone.layer == layer, "clone.layer is set correctly");
+        t.ok( clone.position.equals(position), "clone.position is set correctly");
+        t.ok( clone.bounds.equals(bounds), "clone.bounds is set correctly");
+        t.ok( !clone.node, "node not cloned");
+    }
+    
+    function test_draw (t) {
+        t.plan( 5 );
+
+        var map = new OpenLayers.Map('map');
+        map.addLayer(layer);  
+
+        tile = new OpenLayers.Tile.Google(layer, position, bounds);
+
+        tile.events.register("loadstart", this, function() { 
+            t.ok(true, "loadstart triggered");
+        });
+        tile.events.register("loadend", this, function() { 
+            t.ok(true, "loadend triggered");
+        });
+
+        t.delay_call(1, function() {
+            //this should trigger a "loadstart" event
+            tile.draw();
+
+            t.ok( tile.node, "tile.draw creates a node");
+            // The two tests below will fail when getTile doesn't set the tile size
+            t.eq( tile.node.style.width, layer.tileSize.w+"px", "Image width is correct" );
+            t.eq( tile.node.style.height, layer.tileSize.h+"px", "Image height is correct" );
+        });       
+        t.delay_call(2, function() {
+            map.removeLayer(layer);
+            map.destroy();
+            /* wait until "loadend" fires */
+        });        
+        
+    }
+        
+  </script>
+</head>
+<body>
+<div id="map" style="height:550px;width:500px"></div>
+</body>
+</html>
\ No newline at end of file

Modified: trunk/openlayers/tests/list-tests.html
===================================================================
--- trunk/openlayers/tests/list-tests.html	2011-05-23 21:27:54 UTC (rev 11999)
+++ trunk/openlayers/tests/list-tests.html	2011-05-23 21:42:09 UTC (rev 12000)
@@ -144,6 +144,7 @@
     <li>Layer/GML.html</li>
     <li>Layer/Google.html</li>
     <li>Layer/Google/v3.html</li>
+    <li>Layer/GoogleNG.html</li>
     <li>Layer/Grid.html</li>
     <li>Layer/HTTPRequest.html</li>
     <li>Layer/Image.html</li>
@@ -213,6 +214,7 @@
     <li>Symbolizer/Raster.html</li>
     <li>Symbolizer/Text.html</li>
     <li>Tile.html</li>
+    <li>Tile/Google.html</li>
     <li>Tile/Image.html</li>
     <li>Tile/Image/IFrame.html</li>
     <li>Tile/WFS.html</li>

Modified: trunk/openlayers/theme/default/style.css
===================================================================
--- trunk/openlayers/theme/default/style.css	2011-05-23 21:27:54 UTC (rev 11999)
+++ trunk/openlayers/theme/default/style.css	2011-05-23 21:42:09 UTC (rev 12000)
@@ -355,6 +355,19 @@
     color: #333;
 }
 
+.olGoogleAttribution.hybrid, .olGoogleAttribution.satellite {
+    color: #DDD;
+}
+.olGoogleAttribution {
+    color: #333;
+}
+span.olGoogleAttribution a {
+    color: #77C;
+}
+span.olGoogleAttribution.hybrid a, span.olGoogleAttribution.satellite a {
+    color: white;
+}
+
 /**
  * Editing and navigation icons.
  * (using the editing_tool_bar.png sprint image)



More information about the Commits mailing list