More trip planner testing with colors
[busui.git] / labs / openlayers / lib / OpenLayers / Projection.js
blob:a/labs/openlayers/lib/OpenLayers/Projection.js -> blob:b/labs/openlayers/lib/OpenLayers/Projection.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/Util.js
  */
   
  /**
  * Class: OpenLayers.Projection
  * Class for coordinate transforms between coordinate systems.
  * Depends on the proj4js library. If proj4js is not available,
  * then this is just an empty stub.
  */
  OpenLayers.Projection = OpenLayers.Class({
   
  /**
  * Property: proj
  * {Object} Proj4js.Proj instance.
  */
  proj: null,
   
  /**
  * Property: projCode
  * {String}
  */
  projCode: null,
   
  /**
  * Constructor: OpenLayers.Projection
  * This class offers several methods for interacting with a wrapped
  * pro4js projection object.
  *
  * Parameters:
  * projCode - {String} A string identifying the Well Known Identifier for
  * the projection.
  * options - {Object} An optional object to set additional properties
  * on the layer.
  *
  * Returns:
  * {<OpenLayers.Projection>} A projection object.
  */
  initialize: function(projCode, options) {
  OpenLayers.Util.extend(this, options);
  this.projCode = projCode;
  if (window.Proj4js) {
  this.proj = new Proj4js.Proj(projCode);
  }
  },
   
  /**
  * APIMethod: getCode
  * Get the string SRS code.
  *
  * Returns:
  * {String} The SRS code.
  */
  getCode: function() {
  return this.proj ? this.proj.srsCode : this.projCode;
  },
   
  /**
  * APIMethod: getUnits
  * Get the units string for the projection -- returns null if
  * proj4js is not available.
  *
  * Returns:
  * {String} The units abbreviation.
  */
  getUnits: function() {
  return this.proj ? this.proj.units : null;
  },
   
  /**
  * Method: toString
  * Convert projection to string (getCode wrapper).
  *
  * Returns:
  * {String} The projection code.
  */
  toString: function() {
  return this.getCode();
  },
   
  /**
  * Method: equals
  * Test equality of two projection instances. Determines equality based
  * soley on the projection code.
  *
  * Returns:
  * {Boolean} The two projections are equivalent.
  */
  equals: function(projection) {
  if (projection && projection.getCode) {
  return this.getCode() == projection.getCode();
  } else {
  return false;
  }
  },
   
  /* Method: destroy
  * Destroy projection object.
  */
  destroy: function() {
  delete this.proj;
  delete this.projCode;
  },
   
  CLASS_NAME: "OpenLayers.Projection"
  });
   
  /**
  * Property: transforms
  * Transforms is an object, with from properties, each of which may
  * have a to property. This allows you to define projections without
  * requiring support for proj4js to be included.
  *
  * This object has keys which correspond to a 'source' projection object. The
  * keys should be strings, corresponding to the projection.getCode() value.
  * Each source projection object should have a set of destination projection
  * keys included in the object.
  *
  * Each value in the destination object should be a transformation function,
  * where the function is expected to be passed an object with a .x and a .y
  * property. The function should return the object, with the .x and .y
  * transformed according to the transformation function.
  *
  * Note - Properties on this object should not be set directly. To add a
  * transform method to this object, use the <addTransform> method. For an
  * example of usage, see the OpenLayers.Layer.SphericalMercator file.
  */
  OpenLayers.Projection.transforms = {};
   
  /**
  * APIMethod: addTransform
  * Set a custom transform method between two projections. Use this method in
  * cases where the proj4js lib is not available or where custom projections
  * need to be handled.
  *
  * Parameters:
  * from - {String} The code for the source projection
  * to - {String} the code for the destination projection
  * method - {Function} A function that takes a point as an argument and
  * transforms that point from the source to the destination projection
  * in place. The original point should be modified.
  */
  OpenLayers.Projection.addTransform = function(from, to, method) {
  if(!OpenLayers.Projection.transforms[from]) {
  OpenLayers.Projection.transforms[from] = {};
  }
  OpenLayers.Projection.transforms[from][to] = method;
  };
   
  /**
  * APIMethod: transform
  * Transform a point coordinate from one projection to another. Note that
  * the input point is transformed in place.
  *
  * Parameters:
  * point - {{OpenLayers.Geometry.Point> | Object} An object with x and y
  * properties representing coordinates in those dimensions.
  * sourceProj - {OpenLayers.Projection} Source map coordinate system
  * destProj - {OpenLayers.Projection} Destination map coordinate system
  *
  * Returns:
  * point - {object} A transformed coordinate. The original point is modified.
  */
  OpenLayers.Projection.transform = function(point, source, dest) {
  if (source.proj && dest.proj) {
  point = Proj4js.transform(source.proj, dest.proj, point);
  } else if (source && dest &&
  OpenLayers.Projection.transforms[source.getCode()] &&
  OpenLayers.Projection.transforms[source.getCode()][dest.getCode()]) {
  OpenLayers.Projection.transforms[source.getCode()][dest.getCode()](point);
  }
  return point;
  };