| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- /* 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/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). Using <zoomOffset> is an alternative to
- * setting <serverResolutions> if you only want to expose a subset
- * of the server resolutions.
- */
- zoomOffset: 0,
-
- /**
- * APIProperty: serverResolutions
- * {Array} A list of all resolutions available on the server. Only set this
- * property if the map resolutions differs from the server.
- */
- serverResolutions: null,
- /**
- * 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.03390625,
- -128 * 156543.03390625,
- 128 * 156543.03390625,
- 128 * 156543.03390625
- ),
- maxResolution: 156543.03390625,
- 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 xyz = this.getXYZ(bounds);
- var url = this.url;
- if (OpenLayers.Util.isArray(url)) {
- var s = '' + xyz.x + xyz.y + xyz.z;
- url = this.selectUrl(s, url);
- }
-
- return OpenLayers.String.format(url, xyz);
- },
-
- /**
- * Method: getXYZ
- * Calculates x, y and z for the given bounds.
- *
- * Parameters:
- * bounds - {<OpenLayers.Bounds>}
- *
- * Returns:
- * {Object} - an object with x, y and z properties.
- */
- getXYZ: 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.serverResolutions != null ?
- OpenLayers.Util.indexOf(this.serverResolutions, res) :
- this.map.getZoom() + this.zoomOffset;
- var limit = Math.pow(2, z);
- if (this.wrapDateLine)
- {
- x = ((x % limit) + limit) % limit;
- }
- return {'x': x, 'y': y, 'z': z};
- },
-
- /* 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;
- },
- wrapDateLine: true,
- CLASS_NAME: "OpenLayers.Layer.OSM"
- });
|