 		 * @return An IProjector object that reprojects from sourceSRS to destinationSRS.
 		 */
 		public function getProjector(sourceSRS:String, destinationSRS:String):IProjector
-		{
-			var source:ProjProjection = getProjection(sourceSRS);
-			var dest:ProjProjection = getProjection(destinationSRS);
-			return new Projector(source, dest);
+		{
+			var lookup:String = sourceSRS + ';' + destinationSRS;
+			var projector:IProjector = _projectorCache[lookup] as IProjector;
+			if (!projector)
+			{
+				var source:ProjProjection = getProjection(sourceSRS);
+				var dest:ProjProjection = getProjection(destinationSRS);
+				projector = new Projector(source, dest);
+				_projectorCache[lookup] = projector;
+			}
+			return projector;
 		}
 
 		/**


		/**
		 * This is a multi-dimensional lookup:   unprojectedColumn -> Object, destinationSRS -> ProxyColumn
		 * Example: cache[column][destinationSRS] is a ProxyColumn containing geometries reprojected to the given SRS.
		 */		
		private const cache:Dictionary = new Dictionary(true); // weak links to be gc-friendly
		
		/**
		 * This function will return the projected column if a reprojection should be performed or the original column if there is no projection.

				return unprojectedColumn;
			
			// check the cache
			var srsCache:Object = _reprojectedColumnCache[unprojectedColumn] as Object;
			if (srsCache == null)
			{
				srsCache = new Object(); // destinationSRS -> ProxyColumn
				_reprojectedColumnCache[unprojectedColumn] = srsCache;
			}
			var proxyColumn:ProxyColumn = srsCache[destinationProjectionSRS] as ProxyColumn;

