[OpenLayers-Commits] r12023 - in sandbox/ahocevar/google-ng: lib/OpenLayers/Layer lib/OpenLayers/Tile theme/default

commits-20090109 at openlayers.org commits-20090109 at openlayers.org
Sat May 28 05:15:56 EDT 2011


Author: ahocevar
Date: 2011-05-28 02:15:55 -0700 (Sat, 28 May 2011)
New Revision: 12023

Modified:
   sandbox/ahocevar/google-ng/lib/OpenLayers/Layer/GoogleNG.js
   sandbox/ahocevar/google-ng/lib/OpenLayers/Tile/Google.js
   sandbox/ahocevar/google-ng/theme/default/style.css
Log:
using Google Maps Copyright Service mode to get the attribution text and display it inside the content, as demanded by the Terms of Service

Modified: sandbox/ahocevar/google-ng/lib/OpenLayers/Layer/GoogleNG.js
===================================================================
--- sandbox/ahocevar/google-ng/lib/OpenLayers/Layer/GoogleNG.js	2011-05-28 09:13:20 UTC (rev 12022)
+++ sandbox/ahocevar/google-ng/lib/OpenLayers/Layer/GoogleNG.js	2011-05-28 09:15:55 UTC (rev 12023)
@@ -31,13 +31,11 @@
      * {String}
      */
     attributionTemplate: '<span class="olGoogleAttribution ${mapType}">' +
-         '<div><a target="_blank" href="http://maps.google.com/maps?' +
+         '<div><a title="Click to see this area on Google Maps" ' + 
+         '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" ' +
+         '</div>${mapData} - <a style="white-space: nowrap" target="_blank" ' +
          'href="http://www.google.com/help/terms_maps.html">' +
          'Terms of Use</a></span>',
     
@@ -54,13 +52,6 @@
     },
     
     /**
-     * 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
@@ -102,15 +93,15 @@
         OpenLayers.Layer.XYZ.prototype.initialize.apply(this, newArgs);
         
         this.options.numZoomLevels = options.numZoomLevels;
-        if (!this.mapObject) {
-            OpenLayers.Layer.GoogleNG.prototype.mapObject =
+        if (!OpenLayers.Layer.GoogleNG.mapObject) {
+            OpenLayers.Layer.GoogleNG.mapObject =
                 new google.maps.Map(document.createElement("div"));
         }
-        if (this.mapObject.mapTypes[this.type]) {
+        if (OpenLayers.Layer.GoogleNG.mapObject.mapTypes[this.type]) {
             this.initLayer();
         } else {
             google.maps.event.addListenerOnce(
-                this.mapObject, 
+                OpenLayers.Layer.GoogleNG.mapObject, 
                 "idle", 
                 OpenLayers.Function.bind(this.initLayer, this)
             );
@@ -123,7 +114,7 @@
      * Sets layer properties according to the metadata provided by the API
      */
     initLayer: function() {
-        var mapType = this.mapObject.mapTypes[this.type];
+        var mapType = OpenLayers.Layer.GoogleNG.mapObject.mapTypes[this.type];
         if (!this.name) {
             this.setName("Google " + mapType.name);
         }
@@ -171,7 +162,25 @@
      * Method: updateAttribution
      * Updates the attribution using the <attributionTemplate>
      */
-    updateAttribution: function() {
+    updateAttribution: function(copyrights) {
+        var myCopyrights;
+        if (this.type == google.maps.MapTypeId.HYBRID) {
+            // the Copyright Service returns "k" and "m" copyrights for the
+            // HYBRID layer type.
+            candidates = [].concat(
+                copyrights["h"], copyrights["k"], copyrights["m"]
+            );
+            myCopyrights = [];
+            for (var i=candidates.length-1; i>=0; --i) {
+                if (OpenLayers.Util.indexOf(candidates, myCopyrights) == -1) {
+                    myCopyrights.push(candidates[i]);
+                }
+            }
+        } else {
+            myCopyrights = copyrights[this.mapTypes[this.type]];
+        }
+        var mapData = "Map Data &copy;" + new Date().getFullYear() + " " +
+            myCopyrights.join(", ");
         var center = this.map.getCenter();
         center && center.transform(
             this.map.getProjectionObject(),
@@ -179,23 +188,23 @@
         );
         var size = this.map.getSize();
         this.attribution = OpenLayers.String.format(this.attributionTemplate, {
-            center: center ? center.lat + "," + center.lon : "",
+            t: this.mapTypes[this.type],
             zoom: this.map.getZoom(),
-            size: size.w + "x" + size.h,
-            t: this.mapTypes[this.type],
-            mapType: this.type
+            center: center.lat + "," + center.lon,
+            mapType: this.type,
+            mapData: mapData
         });
         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);
+        this.events.register("moveend", this,
+            OpenLayers.Layer.GoogleNG.loadCopyrights
+        );
     },
     
     /**
@@ -203,7 +212,9 @@
      */
     removeMap: function() {
         OpenLayers.Layer.XYZ.prototype.removeMap.apply(this, arguments);
-        this.map.events.unregister("moveend", this, this.updateAttribution);
+        this.events.unregister("moveend", this,
+            OpenLayers.Layer.GoogleNG.loadCopyrights
+        );
     },
         
     /**
@@ -226,14 +237,86 @@
         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
+});
+
+/**
+ * Property: mapObject
+ * {google.maps.Map} Shared GMaps instance - will be set upon instantiation of
+ * the 1st GoogleNG layer
+ */
+OpenLayers.Layer.GoogleNG.mapObject = null;
+
+/**
+ * Function: loadCopyrights
+ * Using the Google Maps Copyright Service mode (see
+ * http://mapki.com/wiki/Google_Map_Parameters#Misc) to get the attribution for
+ * the current map extent. Will be called by each GoogleNG layer instance on
+ * moveend. 
+ */
+OpenLayers.Layer.GoogleNG.loadCopyrights = function() {
+    var me = OpenLayers.Layer.GoogleNG.loadCopyrights;
+    if (me.numLoadingScripts == undefined) {
+        me.loadingScripts = [];
+        me.numLoadingScripts = 0;
+        me.copyrights = {"m": [], "k": [], "h": [], "p": []};
+        
+        // store window scope functions before overwriting them
+        me.origGAddCopyright = window.GAddCopyright;
+        me.origGVerify = window.GVerify;
+        me.origGAppFeatures = window.GAppFeatures;
+        
+        // defining window scope functions called by the script that the
+        // Copyright Service returns
+        window.GAddCopyright = function() {
+            var copyright = arguments[7];
+            var category = me.copyrights[arguments[0]];
+            if (OpenLayers.Util.indexOf(category, copyright) == -1) {
+                copyright && category.push(copyright);
+            }
+        };
+        window.GVerify = OpenLayers.Function.True;
+        window.GAppFeatures = OpenLayers.Function.bind(function() {
+            me.numLoadingScripts--;
+            if (me.numLoadingScripts == 0) {
+                var script;
+                for (var i=me.loadingScripts.length-1; i>=0; --i) {
+                    script = me.loadingScripts[i][0];
+                    me.loadingScripts[i][1].updateAttribution(me.copyrights);
+                    script.parentNode.removeChild(script);
+                }
+                
+                // restore original functions
+                window.GAddCopyright = me.origGAddCopyright;
+                delete me.origGAddCopyright;
+                window.GVerify = me.origGVerify;
+                delete me.origGVerify;
+                window.GAppFeatures = me.origGAppFeatures;
+                delete me.origGAppFeatures;
+                
+                delete me.loadingScripts;
+                delete me.numLoadingScripts;
+                delete me.copyrights;
+            }
+        }, this);
+    }
+    var mapProj = this.map.getProjectionObject();
+    var llProj = new OpenLayers.Projection("EPSG:4326");
+    var center = this.map.getCenter().transform(mapProj, llProj);
+    var extent = this.map.getExtent().transform(mapProj, llProj);
+    var params = {
+        spn: extent.getHeight() + "," + extent.getWidth(),
+        z: this.map.getZoom(),
+        t: this.mapTypes[this.type],
+        vp: center.lat + "," + center.lon
+    };
+    var url = "http://maps.google.com/maps?" +
+        OpenLayers.Util.getParameterString(params);
+    var script = document.createElement("script");
+    script.type = "text/javascript";
+    script.src = url;
+    me.numLoadingScripts++;
+    me.loadingScripts.push([script, this]);
+    document.getElementsByTagName("head")[0].appendChild(script);
+};
+

Modified: sandbox/ahocevar/google-ng/lib/OpenLayers/Tile/Google.js
===================================================================
--- sandbox/ahocevar/google-ng/lib/OpenLayers/Tile/Google.js	2011-05-28 09:13:20 UTC (rev 12022)
+++ sandbox/ahocevar/google-ng/lib/OpenLayers/Tile/Google.js	2011-05-28 09:15:55 UTC (rev 12023)
@@ -86,7 +86,9 @@
      * {Boolean} Always returns true.
      */
     draw: function() {
-        var layerType = this.layer.mapObject.mapTypes[this.layer.type];
+        var layerType = OpenLayers.Layer.GoogleNG.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);
@@ -143,7 +145,9 @@
         if (this.node) {
             this.node.parentNode &&
                 this.node.parentNode.removeChild(this.node);
-            this.layer.mapObject.mapTypes[this.layer.type].releaseTile(this.node);
+            OpenLayers.Layer.GoogleNG.mapObject.mapTypes[
+                this.layer.type
+            ].releaseTile(this.node);
         }
     },
     

Modified: sandbox/ahocevar/google-ng/theme/default/style.css
===================================================================
--- sandbox/ahocevar/google-ng/theme/default/style.css	2011-05-28 09:13:20 UTC (rev 12022)
+++ sandbox/ahocevar/google-ng/theme/default/style.css	2011-05-28 09:15:55 UTC (rev 12023)
@@ -356,7 +356,7 @@
 }
 
 .olGoogleAttribution.hybrid, .olGoogleAttribution.satellite {
-    color: #DDD;
+    color: white;
 }
 .olGoogleAttribution {
     color: #333;



More information about the Commits mailing list