001: /*
002: * Geotools2 - OpenSource mapping toolkit
003: * http://geotools.org
004: * (C) 2006, Geotools Project Managment Committee (PMC)
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation;
009: * version 2.1 of the License.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: */
017: package org.geotools.gce.geotiff.IIOMetadataAdpaters;
018:
019: /**
020: * This class is a placeholder for defining exact affine transformations between
021: * raster and model space.
022: *
023: * <p>
024: * Quoting the geotiff spec:
025: *
026: * <pre>
027: * ModelPixelScaleTag:
028: * Tag = 33550
029: * Type = DOUBLE (IEEE Double precision)
030: * N = 3
031: * Owner: SoftDesk
032: * </pre>
033: *
034: * This tag may be used to specify the size of raster pixel spacing in the model
035: * space units, when the raster space can be embedded in the model space
036: * coordinate system without rotation, and consists of the following 3 values:
037: *
038: * <pre>
039: * ModelPixelScaleTag = (ScaleX, ScaleY, ScaleZ)
040: * </pre>
041: *
042: * where ScaleX and ScaleY give the horizontal and vertical spacing of raster
043: * pixels. The ScaleZ is primarily used to map the pixel value of a digital
044: * elevation model into the correct Z-scale, and so for most other purposes this
045: * value should be zero (since most model spaces are 2-D, with Z=0).
046: *
047: * <p>
048: * A single tiepoint in the ModelTiepointTag, together with this tag, completely
049: * determine the relationship between raster and model space
050: *
051: * @author Simone Giannecchini
052: * @since 2.3
053: *
054: */
055: public final class PixelScale {
056:
057: private double scaleX;
058:
059: private double scaleY;
060:
061: private double scaleZ;
062:
063: public PixelScale(double scaleX, double scaleY, double scaleZ) {
064: this .scaleX = scaleX;
065: this .scaleY = scaleY;
066: this .scaleZ = scaleZ;
067: }
068:
069: public PixelScale() {
070: this .scaleX = 0;
071: this .scaleY = 0;
072: this .scaleZ = 0;
073: }
074:
075: public double getScaleX() {
076: return scaleX;
077: }
078:
079: public void setScaleX(double scaleX) {
080: this .scaleX = scaleX;
081: }
082:
083: public double getScaleY() {
084: return scaleY;
085: }
086:
087: public void setScaleY(double scaleY) {
088: this .scaleY = scaleY;
089: }
090:
091: public double getScaleZ() {
092: return scaleZ;
093: }
094:
095: public void setScaleZ(double scaleZ) {
096: this .scaleZ = scaleZ;
097: }
098:
099: public double[] getValues() {
100: return new double[] { scaleX, scaleY, scaleZ };
101: }
102:
103: public boolean isSet() {
104: return isComponentSet(scaleX) && isComponentSet(scaleY);
105: }
106:
107: public boolean isSetExtended() {
108: return isComponentSet(scaleX) && isComponentSet(scaleY)
109: && isComponentSet(scaleZ);
110: }
111:
112: /**
113: * Tells me if a component of this {@link PixelScale} is set.
114: *
115: * @param scale
116: * @return
117: */
118: protected boolean isComponentSet(double scale) {
119: return !Double.isInfinite(scale) && !Double.isNaN(scale)
120: && Math.abs(scale) > 1E-6;
121: }
122:
123: }
|