[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' +
- '¢er=${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 ©" + 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