Files
openlayers/lib/OpenLayers/Tile/Google.js
ahocevar 058008864e fixing @requires dependencies
git-svn-id: http://svn.openlayers.org/trunk/openlayers@12128 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
2011-06-27 18:12:24 +00:00

155 lines
5.1 KiB
JavaScript

/* 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/Tile.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 = 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);
// 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);
OpenLayers.Layer.GoogleNG.mapObject.mapTypes[
this.layer.type
].releaseTile(this.node);
}
},
CLASS_NAME: "OpenLayers.Tile.Google"
});