|
/* Copyright (c) 2006-2010 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/Grid.js |
|
* @requires OpenLayers/Tile/Image.js |
|
*/ |
|
|
|
/** |
|
* Class: OpenLayers.Layer.XYZ |
|
* The XYZ class is designed to make it easier for people who have tiles |
|
* arranged by a standard XYZ grid. |
|
* |
|
* Inherits from: |
|
* - <OpenLayers.Layer.Grid> |
|
*/ |
|
OpenLayers.Layer.XYZ = OpenLayers.Class(OpenLayers.Layer.Grid, { |
|
|
|
/** |
|
* APIProperty: isBaseLayer |
|
* Default is true, as this is designed to be a base tile source. |
|
*/ |
|
isBaseLayer: true, |
|
|
|
/** |
|
* APIProperty: sphericalMecator |
|
* Whether the tile extents should be set to the defaults for |
|
* spherical mercator. Useful for things like OpenStreetMap. |
|
* Default is false, except for the OSM subclass. |
|
*/ |
|
sphericalMercator: false, |
|
|
|
/** |
|
* APIProperty: zoomOffset |
|
* {Number} If your cache has more zoom levels than you want to provide |
|
* access to with this layer, supply a zoomOffset. This zoom offset |
|
* is added to the current map zoom level to determine the level |
|
* for a requested tile. For example, if you supply a zoomOffset |
|
* of 3, when the map is at the zoom 0, tiles will be requested from |
|
* level 3 of your cache. Default is 0 (assumes cache level and map |
|
* zoom are equivalent). |
|
*/ |
|
zoomOffset: 0, |
|
|
|
/** |
|
* Constructor: OpenLayers.Layer.XYZ |
|
* |
|
* Parameters: |
|
* name - {String} |
|
* url - {String} |
|
* options - {Object} Hashtable of extra options to tag onto the layer |
|
*/ |
|
initialize: function(name, url, options) { |
|
if (options && options.sphericalMercator || this.sphericalMercator) { |
|
options = OpenLayers.Util.extend({ |
|
maxExtent: new OpenLayers.Bounds( |
|
-128 * 156543.0339, |
|
-128 * 156543.0339, |
|
128 * 156543.0339, |
|
128 * 156543.0339 |
|
), |
|
maxResolution: 156543.0339, |
|
numZoomLevels: 19, |
|
units: "m", |
|
projection: "EPSG:900913" |
|
}, options); |
|
} |
|
url = url || this.url; |
|
name = name || this.name; |
|
var newArguments = [name, url, {}, options]; |
|
OpenLayers.Layer.Grid.prototype.initialize.apply(this, newArguments); |
|
}, |
|
|
|
/** |
|
* APIMethod: clone |
|
* Create a clone of this layer |
|
* |
|
* Parameters: |
|
* obj - {Object} Is this ever used? |
|
* |
|
* Returns: |
|
* {<OpenLayers.Layer.XYZ>} An exact clone of this OpenLayers.Layer.XYZ |
|
*/ |
|
clone: function (obj) { |
|
|
|
if (obj == null) { |
|
obj = new OpenLayers.Layer.XYZ(this.name, |
|
this.url, |
|
this.getOptions()); |
|
} |
|
|
|
//get all additions from superclasses |
|
obj = OpenLayers.Layer.Grid.prototype.clone.apply(this, [obj]); |
|
|
|
return obj; |
|
}, |
|
|
|
/** |
|
* Method: getUrl |
|
* |
|
* Parameters: |
|
* bounds - {<OpenLayers.Bounds>} |
|
* |
|
* Returns: |
|
* {String} A string with the layer's url and parameters and also the |
|
* passed-in bounds and appropriate tile size specified as |
|
* parameters |
|
*/ |
|
getURL: function (bounds) { |
|
var res = this.map.getResolution(); |
|
var x = Math.round((bounds.left - this.maxExtent.left) |
|
/ (res * this.tileSize.w)); |
|
var y = Math.round((this.maxExtent.top - bounds.top) |
|
/ (res * this.tileSize.h)); |
|
var z = this.map.getZoom() + this.zoomOffset; |
|
|
|
var url = this.url; |
|
var s = '' + x + y + z; |
|
if (url instanceof Array) |
|
{ |
|
url = this.selectUrl(s, url); |
|
} |
|
|
|
var path = OpenLayers.String.format(url, {'x': x, 'y': y, 'z': z}); |
|
|
|
return path; |
|
}, |
|
|
|
/** |
|
* Method: addTile |
|
* addTile creates a tile, initializes it, and adds it to the layer div. |
|
* |
|
* Parameters: |
|
* bounds - {<OpenLayers.Bounds>} |
|
* position - {<OpenLayers.Pixel>} |
|
* |
|
* Returns: |
|
* {<OpenLayers.Tile.Image>} The added OpenLayers.Tile.Image |
|
*/ |
|
addTile:function(bounds,position) { |
|
return new OpenLayers.Tile.Image(this, position, bounds, |
|
null, this.tileSize); |
|
}, |
|
|
|
/* APIMethod: setMap |
|
* When the layer is added to a map, then we can fetch our origin |
|
* (if we don't have one.) |
|
* |
|
* Parameters: |
|
* map - {<OpenLayers.Map>} |
|
*/ |
|
setMap: function(map) { |
|
OpenLayers.Layer.Grid.prototype.setMap.apply(this, arguments); |
|
if (!this.tileOrigin) { |
|
this.tileOrigin = new OpenLayers.LonLat(this.maxExtent.left, |
|
this.maxExtent.bottom); |
|
} |
|
}, |
|
|
|
CLASS_NAME: "OpenLayers.Layer.XYZ" |
|
}); |
|
|
|
|
|
/** |
|
* Class: OpenLayers.Layer.OSM |
|
* A class to access OpenStreetMap tiles. By default, uses the OpenStreetMap |
|
* hosted tile.openstreetmap.org 'Mapnik' tileset. If you wish to use |
|
* tiles@home / osmarender layer instead, you can pass a layer like: |
|
* |
|
* (code) |
|
* new OpenLayers.Layer.OSM("t@h", |
|
* "http://tah.openstreetmap.org/Tiles/tile/${z}/${x}/${y}.png"); |
|
* (end) |
|
* |
|
* This layer defaults to Spherical Mercator. |
|
* |
|
* Inherits from: |
|
* - <OpenLayers.Layer.XYZ> |
|
*/ |
|
OpenLayers.Layer.OSM = OpenLayers.Class(OpenLayers.Layer.XYZ, { |
|
name: "OpenStreetMap", |
|
attribution: "Data CC-By-SA by <a href='http://openstreetmap.org/'>OpenStreetMap</a>", |
|
sphericalMercator: true, |
|
url: 'http://tile.openstreetmap.org/${z}/${x}/${y}.png', |
|
clone: function(obj) { |
|
if (obj == null) { |
|
obj = new OpenLayers.Layer.OSM( |
|
this.name, this.url, this.getOptions()); |
|
} |
|
obj = OpenLayers.Layer.XYZ.prototype.clone.apply(this, [obj]); |
|
return obj; |
|
}, |
|
CLASS_NAME: "OpenLayers.Layer.OSM" |
|
}); |
|
|