More trip planner testing with colors
[busui.git] / labs / openlayers / lib / OpenLayers / Layer / KaMapCache.js
blob:a/labs/openlayers/lib/OpenLayers/Layer/KaMapCache.js -> blob:b/labs/openlayers/lib/OpenLayers/Layer/KaMapCache.js
  /* 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/Layer/KaMap.js
  */
   
  /**
  * Class: OpenLayers.Layer.KaMapCache
  *
  * This class is designed to talk directly to a web-accessible ka-Map
  * cache generated by the precache2.php script.
  *
  * To create a a new KaMapCache layer, you must indicate also the "i" parameter
  * (that will be used to calculate the file extension), and another special
  * parameter, object names "metaTileSize", with "h" (height) and "w" (width)
  * properties.
  *
  * // Create a new kaMapCache layer.
  * var kamap_base = new OpenLayers.Layer.KaMapCache(
  * "Satellite",
  * "http://www.example.org/web/acessible/cache",
  * {g: "satellite", map: "world", i: 'png24', metaTileSize: {w: 5, h: 5} }
  * );
  *
  * // Create an kaMapCache overlay layer (using "isBaseLayer: false").
  * // Forces the output to be a "gif", using the "i" parameter.
  * var kamap_overlay = new OpenLayers.Layer.KaMapCache(
  * "Streets",
  * "http://www.example.org/web/acessible/cache",
  * {g: "streets", map: "world", i: "gif", metaTileSize: {w: 5, h: 5} },
  * {isBaseLayer: false}
  * );
  *
  * The cache URLs must look like:
  * var/cache/World/50000/Group_Name/def/t-440320/l20480
  *
  * This means that the cache generated via tile.php will *not* work with
  * this class, and should instead use the KaMap layer.
  *
  * More information is available in Ticket #1518.
  *
  * Inherits from:
  * - <OpenLayers.Layer.KaMap>
  * - <OpenLayers.Layer.Grid>
  */
  OpenLayers.Layer.KaMapCache = OpenLayers.Class(OpenLayers.Layer.KaMap, {
   
  /**
  * Constant: IMAGE_EXTENSIONS
  * {Object} Simple hash map to convert format to extension.
  */
  IMAGE_EXTENSIONS: {
  'jpeg': 'jpg',
  'gif' : 'gif',
  'png' : 'png',
  'png8' : 'png',
  'png24' : 'png',
  'dithered' : 'png'
  },
   
  /**
  * Constant: DEFAULT_FORMAT
  * {Object} Simple hash map to convert format to extension.
  */
  DEFAULT_FORMAT: 'jpeg',
   
  /**
  * Constructor: OpenLayers.Layer.KaMapCache
  *
  * Parameters:
  * name - {String}
  * url - {String}
  * params - {Object} Parameters to be sent to the HTTP server in the
  * query string for the tile. The format can be set via the 'i'
  * parameter (defaults to jpg) , and the map should be set via
  * the 'map' parameter. It has been reported that ka-Map may behave
  * inconsistently if your format parameter does not match the format
  * parameter configured in your config.php. (See ticket #327 for more
  * information.)
  * options - {Object} Additional options for the layer. Any of the
  * APIProperties listed on this layer, and any layer types it
  * extends, can be overridden through the options parameter.
  */
  initialize: function(name, url, params, options) {
  OpenLayers.Layer.KaMap.prototype.initialize.apply(this, arguments);
  this.extension = this.IMAGE_EXTENSIONS[this.params.i.toLowerCase() || DEFAULT_FORMAT];
  },
   
  /**
  * 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) {
  bounds = this.adjustBounds(bounds);
  var mapRes = this.map.getResolution();
  var scale = Math.round((this.map.getScale() * 10000)) / 10000;
  var pX = Math.round(bounds.left / mapRes);
  var pY = -Math.round(bounds.top / mapRes);
   
  var metaX = Math.floor(pX / this.tileSize.w / this.params.metaTileSize.w) * this.tileSize.w * this.params.metaTileSize.w;
  var metaY = Math.floor(pY / this.tileSize.h / this.params.metaTileSize.h) * this.tileSize.h * this.params.metaTileSize.h;
   
  // if url is not a string, it should be an array of strings,
  // in which case we will deterministically select one of them in
  // order to evenly distribute requests to different urls.
  //
  var url = this.url;
  if (url instanceof Array) {
  url = this.selectUrl(paramsString, url);
  }
   
  var components = [
  url,
  "/",
  this.params.map,
  "/",
  scale,
  "/",
  this.params.g.replace(/\s/g, '_'),
  "/def/t",
  metaY,
  "/l",
  metaX,
  "/t",
  pY,
  "l",
  pX,
  ".",
  this.extension
  ];
   
  return components.join("");
  },
   
  CLASS_NAME: "OpenLayers.Layer.KaMapCache"
  });