package ca.bc.coordsys.impl;
import ca.bc.coordsys.Geographic;
import ca.bc.coordsys.Planar;
import ca.bc.coordsys.Projection;
import ca.bc.coordsys.Spheroid;
import com.vividsolutions.jts.util.Assert;
/**
* Implements the Universal Transverse Mercator Projection.
*/
public class UniversalTransverseMercator extends Projection {
private final static double SCALE_FACTOR = 0.9996;
private final static double FALSE_EASTING = 500000.0;
private final static double FALSE_NORTHING = 0.0;
private TransverseMercator transverseMercator = new TransverseMercator();
public UniversalTransverseMercator() { }
private int zone = -1;
/**
* @param utmZone must be between 7 and 11
*/
public void setParameters(int zone) {
Assert.isTrue(zone >= 7, "UTM zone " + zone + " not supported");
Assert.isTrue(zone <= 11, "UTM zone " + zone + " not supported");
switch (zone) {
case 7:
transverseMercator.setParameters(-141.0);
break;
case 8:
transverseMercator.setParameters(-135.0);
break;
case 9:
transverseMercator.setParameters(-129.0);
break;
case 10:
transverseMercator.setParameters(-123.0);
break;
case 11:
transverseMercator.setParameters(-117.0);
break;
case 12:
transverseMercator.setParameters(-111.0);
break;
default:
Assert.shouldNeverReachHere();
}
this.zone = zone;
}
public void setSpheroid(Spheroid s) {
transverseMercator.setSpheroid(s);
}
public Geographic asGeographic(Planar p, Geographic q) {
Assert.isTrue(zone != -1, "Call #setParameters first");
p.x = (p.x - FALSE_EASTING) / SCALE_FACTOR;
p.y = (p.y - FALSE_NORTHING) / SCALE_FACTOR;
transverseMercator.asGeographic(p, q);
return q;
}
public Planar asPlanar(Geographic q0, Planar p) {
Assert.isTrue(zone != -1, "Call #setParameters first");
transverseMercator.asPlanar(q0, p);
p.x = SCALE_FACTOR * p.x + FALSE_EASTING;
p.y = SCALE_FACTOR * p.y + FALSE_NORTHING;
return p;
}
}