--- a/labs/openlayers/lib/OpenLayers/Layer/KaMap.js +++ b/labs/openlayers/lib/OpenLayers/Layer/KaMap.js @@ -1,1 +1,207 @@ - +/* 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 + */ + +/** + * Class: OpenLayers.Layer.KaMap + * + * Inherits from: + * - + */ +OpenLayers.Layer.KaMap = OpenLayers.Class(OpenLayers.Layer.Grid, { + + /** + * APIProperty: isBaseLayer + * {Boolean} KaMap Layer is always a base layer + */ + isBaseLayer: true, + + /** + * APIProperty: units + * {?} + */ + units: null, + + /** + * APIProperty: resolution + * {Float} + */ + resolution: OpenLayers.DOTS_PER_INCH, + + /** + * Constant: DEFAULT_PARAMS + * {Object} parameters set by default. The default parameters set + * the format via the 'i' parameter to 'jpeg'. + */ + DEFAULT_PARAMS: { + i: 'jpeg', + map: '' + }, + + /** + * Constructor: OpenLayers.Layer.KaMap + * + * 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) { + var newArguments = []; + newArguments.push(name, url, params, options); + OpenLayers.Layer.Grid.prototype.initialize.apply(this, newArguments); + this.params = OpenLayers.Util.applyDefaults( + this.params, this.DEFAULT_PARAMS + ); + }, + + /** + * Method: getURL + * + * Parameters: + * 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); + return this.getFullRequestString( + { t: pY, + l: pX, + s: scale + }); + }, + + /** + * Method: addTile + * + * Parameters: + * bounds - {} + * position - {} + * + * Returns: + * {} + */ + addTile:function(bounds,position) { + var url = this.getURL(bounds); + return new OpenLayers.Tile.Image(this, position, bounds, + url, this.tileSize); + }, + + /** + * Method: calculateGridLayout + * ka-Map uses the center point of the map as an origin for + * its tiles. Override calculateGridLayout to center tiles + * correctly for this case. + * + * Parameters: + * bounds - {} + * extent - {} + * resolution - {Number} + * + * Returns: + * Object containing properties tilelon, tilelat, tileoffsetlat, + * tileoffsetlat, tileoffsetx, tileoffsety + */ + calculateGridLayout: function(bounds, extent, resolution) { + var tilelon = resolution*this.tileSize.w; + var tilelat = resolution*this.tileSize.h; + + var offsetlon = bounds.left; + var tilecol = Math.floor(offsetlon/tilelon) - this.buffer; + var tilecolremain = offsetlon/tilelon - tilecol; + var tileoffsetx = -tilecolremain * this.tileSize.w; + var tileoffsetlon = tilecol * tilelon; + + var offsetlat = bounds.top; + var tilerow = Math.ceil(offsetlat/tilelat) + this.buffer; + var tilerowremain = tilerow - offsetlat/tilelat; + var tileoffsety = -(tilerowremain+1) * this.tileSize.h; + var tileoffsetlat = tilerow * tilelat; + + return { + tilelon: tilelon, tilelat: tilelat, + tileoffsetlon: tileoffsetlon, tileoffsetlat: tileoffsetlat, + tileoffsetx: tileoffsetx, tileoffsety: tileoffsety + }; + }, + + /** + * APIMethod: clone + * + * Parameters: + * obj - {Object} + * + * Returns: + * {} An exact clone of this OpenLayers.Layer.KaMap + */ + clone: function (obj) { + + if (obj == null) { + obj = new OpenLayers.Layer.KaMap(this.name, + this.url, + this.params, + this.getOptions()); + } + + //get all additions from superclasses + obj = OpenLayers.Layer.Grid.prototype.clone.apply(this, [obj]); + + // copy/set any non-init, non-simple values here + if (this.tileSize != null) { + obj.tileSize = this.tileSize.clone(); + } + + // we do not want to copy reference to grid, so we make a new array + obj.grid = []; + + return obj; + }, + + /** + * APIMethod: getTileBounds + * Returns The tile bounds for a layer given a pixel location. + * + * Parameters: + * viewPortPx - {} The location in the viewport. + * + * Returns: + * {} Bounds of the tile at the given pixel location. + */ + getTileBounds: function(viewPortPx) { + var resolution = this.getResolution(); + var tileMapWidth = resolution * this.tileSize.w; + var tileMapHeight = resolution * this.tileSize.h; + var mapPoint = this.getLonLatFromViewPortPx(viewPortPx); + var tileLeft = tileMapWidth * Math.floor(mapPoint.lon / tileMapWidth); + var tileBottom = tileMapHeight * Math.floor(mapPoint.lat / tileMapHeight); + return new OpenLayers.Bounds(tileLeft, tileBottom, + tileLeft + tileMapWidth, + tileBottom + tileMapHeight); + }, + + CLASS_NAME: "OpenLayers.Layer.KaMap" +}); +