001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/crs/coordinatesystems/ProjectedCRS.java $ 002 /*---------------------------------------------------------------------------- 003 This file is part of deegree, http://deegree.org/ 004 Copyright (C) 2001-2009 by: 005 Department of Geography, University of Bonn 006 and 007 lat/lon GmbH 008 009 This library is free software; you can redistribute it and/or modify it under 010 the terms of the GNU Lesser General Public License as published by the Free 011 Software Foundation; either version 2.1 of the License, or (at your option) 012 any later version. 013 This library is distributed in the hope that it will be useful, but WITHOUT 014 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 015 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 016 details. 017 You should have received a copy of the GNU Lesser General Public License 018 along with this library; if not, write to the Free Software Foundation, Inc., 019 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 020 021 Contact information: 022 023 lat/lon GmbH 024 Aennchenstr. 19, 53177 Bonn 025 Germany 026 http://lat-lon.de/ 027 028 Department of Geography, University of Bonn 029 Prof. Dr. Klaus Greve 030 Postfach 1147, 53001 Bonn 031 Germany 032 http://www.geographie.uni-bonn.de/deegree/ 033 034 e-mail: info@deegree.org 035 ----------------------------------------------------------------------------*/ 036 037 package org.deegree.crs.coordinatesystems; 038 039 import java.util.List; 040 041 import org.deegree.crs.Identifiable; 042 import org.deegree.crs.components.Axis; 043 import org.deegree.crs.projections.Projection; 044 import org.deegree.crs.transformations.polynomial.PolynomialTransformation; 045 046 /** 047 * A <code>ProjectedCRS</code> is a coordinatesystem defined with a projection and a geographic crs. It allows for 048 * transformation between projected coordinates (mostly in meters) and the lat/lon coordinates of the geographic crs and 049 * vice versa. 050 * 051 * @author <a href="mailto:bezema@lat-lon.de">Rutger Bezema</a> 052 * 053 * @author last edited by: $Author: mschneider $ 054 * 055 * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18 Jun 2009) $ 056 * 057 */ 058 059 public class ProjectedCRS extends CoordinateSystem { 060 061 private static final long serialVersionUID = 9207748218599729508L; 062 063 private final GeographicCRS underlyingCRS; 064 065 private Projection projection; 066 067 /** 068 * @param projection 069 * the projection which converts coordinates from this ProjectedCRS into the underlying GeographicCRS and 070 * vice versa. 071 * @param axisOrder 072 * of this projection. 073 * @param identity 074 */ 075 public ProjectedCRS( Projection projection, Axis[] axisOrder, Identifiable identity ) { 076 this( null, projection, axisOrder, identity ); 077 } 078 079 /** 080 * @param projection 081 * the projection which converts coordinates from this ProjectedCRS into the underlying GeographicCRS and 082 * vice versa. 083 * @param axisOrder 084 * of this projection. 085 * @param identifiers 086 * @param names 087 * @param versions 088 * @param descriptions 089 * @param areasOfUse 090 */ 091 public ProjectedCRS( Projection projection, Axis[] axisOrder, String[] identifiers, String[] names, 092 String[] versions, String[] descriptions, String[] areasOfUse ) { 093 super( projection.getGeographicCRS().getGeodeticDatum(), axisOrder, identifiers, names, versions, descriptions, 094 areasOfUse ); 095 this.underlyingCRS = projection.getGeographicCRS(); 096 this.projection = projection; 097 } 098 099 /** 100 * 101 * @param projection 102 * the projection which converts coordinates from this ProjectedCRS into the underlying GeographicCRS and 103 * vice versa. 104 * @param axisOrder 105 * of this projection. 106 * @param identifiers 107 */ 108 public ProjectedCRS( Projection projection, Axis[] axisOrder, String[] identifiers ) { 109 this( projection, axisOrder, identifiers, null, null, null, null ); 110 } 111 112 /** 113 * @param projection 114 * the projection which converts coordinates from this ProjectedCRS into the underlying GeographicCRS and 115 * vice versa. 116 * @param axisOrder 117 * of this projection. 118 * @param identifier 119 * @param name 120 * @param version 121 * @param description 122 * @param areaOfUse 123 */ 124 public ProjectedCRS( Projection projection, Axis[] axisOrder, String identifier, String name, String version, 125 String description, String areaOfUse ) { 126 this( projection, axisOrder, new String[] { identifier }, new String[] { name }, new String[] { version }, 127 new String[] { description }, new String[] { areaOfUse } ); 128 } 129 130 /** 131 * 132 * @param projection 133 * the projection which converts coordinates from this ProjectedCRS into the underlying GeographicCRS and 134 * vice versa. 135 * @param axisOrder 136 * of this projection. 137 * @param identifier 138 */ 139 public ProjectedCRS( Projection projection, Axis[] axisOrder, String identifier ) { 140 this( projection, axisOrder, identifier, null, null, null, null ); 141 } 142 143 /** 144 * @param transformations 145 * to use instead of the helmert transformation. 146 * @param projection 147 * the projection which converts coordinates from this ProjectedCRS into the underlying GeographicCRS and 148 * vice versa. 149 * @param axisOrder 150 * of this projection. 151 * @param identity 152 */ 153 public ProjectedCRS( List<PolynomialTransformation> transformations, Projection projection, Axis[] axisOrder, 154 Identifiable identity ) { 155 super( transformations, projection.getGeographicCRS().getGeodeticDatum(), axisOrder, identity ); 156 this.underlyingCRS = projection.getGeographicCRS(); 157 this.projection = projection; 158 159 } 160 161 /* 162 * (non-Javadoc) 163 * 164 * @see org.deegree.crs.coordinatesystems.CoordinateSystem#getDimension() 165 */ 166 @Override 167 public int getDimension() { 168 return getAxis().length; 169 } 170 171 /** 172 * @return the underlyingCRS. 173 */ 174 public final GeographicCRS getGeographicCRS() { 175 return underlyingCRS; 176 } 177 178 @Override 179 public final int getType() { 180 return PROJECTED_CRS; 181 } 182 183 /** 184 * @return the projection. 185 */ 186 public final Projection getProjection() { 187 return projection; 188 } 189 190 @Override 191 public boolean equals( Object other ) { 192 if ( other != null && other instanceof ProjectedCRS ) { 193 final ProjectedCRS that = (ProjectedCRS) other; 194 return super.equals( that ) && this.projection.equals( that.projection ); 195 } 196 return false; 197 } 198 199 @Override 200 public String toString() { 201 StringBuilder sb = new StringBuilder( super.toString() ); 202 sb.append( "\n - Projection: " ).append( projection ); 203 return sb.toString(); 204 } 205 206 /** 207 * Implementation as proposed by Joshua Block in Effective Java (Addison-Wesley 2001), which supplies an even 208 * distribution and is relatively fast. It is created from field <b>f</b> as follows: 209 * <ul> 210 * <li>boolean -- code = (f ? 0 : 1)</li> 211 * <li>byte, char, short, int -- code = (int)f</li> 212 * <li>long -- code = (int)(f ^ (f >>>32))</li> 213 * <li>float -- code = Float.floatToIntBits(f);</li> 214 * <li>double -- long l = Double.doubleToLongBits(f); code = (int)(l ^ (l >>> 32))</li> 215 * <li>all Objects, (where equals( ) calls equals( ) for this field) -- code = f.hashCode( )</li> 216 * <li>Array -- Apply above rules to each element</li> 217 * </ul> 218 * <p> 219 * Combining the hash code(s) computed above: result = 37 * result + code; 220 * </p> 221 * 222 * @return (int) ( result >>> 32 ) ^ (int) result; 223 * 224 * @see java.lang.Object#hashCode() 225 */ 226 @Override 227 public int hashCode() { 228 // the 2nd millionth prime, :-) 229 long code = 32452843; 230 code = code * 37 + super.hashCode(); 231 if ( projection != null ) { 232 code = code * 37 + projection.hashCode(); 233 } 234 235 return (int) ( code >>> 32 ) ^ (int) code; 236 } 237 }