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
--- a/labs/openlayers/lib/OpenLayers/Layer/KaMapCache.js
+++ b/labs/openlayers/lib/OpenLayers/Layer/KaMapCache.js
@@ -1,1 +1,149 @@
+/* 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"
+});
+