//
// UTMCoordinate.java
//
/*
VisAD system for interactive analysis and visualization of numerical
data. Copyright (C) 1996 - 2017 Bill Hibbard, Curtis Rueden, Tom
Rink, Dave Glowacki, Steve Emmerson, Tom Whittaker, Don Murray, and
Tommy Jasmin.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA
*/
package visad.georef;
import visad.*;
import java.rmi.RemoteException;
/**
* RealTuple implementation of a Universal Transverse Mercator
* (UTM) coordinate
*/
public class UTMCoordinate extends RealTuple {
/**
* The <code>RealType</code> for the easting component of the UTM
* grid.
*/
public static RealType EASTING =
RealType.getRealType("UTM_Easting", CommonUnit.meter);
/**
* The <code>RealType</code> for the easting component of the UTM
* grid.
*/
public static RealType NORTHING =
RealType.getRealType("UTM_Northing", CommonUnit.meter);
/**
* The <code>RealType</code> for the zone component of the UTM
* grid.
*/
public static RealType ZONE = RealType.getRealType("UTM_Zone");
/**
* The <code>RealType</code> for the zone component of the UTM
* grid.
*/
public static RealType HEMISPHERE = RealType.getRealType("UTM_Hemisphere");
/**
* The hemisphere identifier for the northern hemisphere
*/
public static final int NORTH = 0;
/**
* The hemisphere identifier for the southern hemisphere
*/
public static final int SOUTH = 1;
private Real easting;
private Real northing;
private Real altitude;
private Real zone;
private Real hemisphere;
/**
* Construct a UTMCoordinate with missing values
*
* @throws VisADException couldn't create the necessary VisAD object
* @throws RemoteException couldn't create the necessary remote object
*/
public UTMCoordinate() throws VisADException, RemoteException
{
this(Double.NaN, Double.NaN);
}
/**
* Construct a UTMCoordinate from double values of easting and
* northing.
*
* @param east easting component (meters) in the zone
* @param north northing component (meters) in the zone
*
* @throws VisADException couldn't create the necessary VisAD object
* @throws RemoteException couldn't create the necessary remote object
*/
public UTMCoordinate(double east, double north)
throws VisADException, RemoteException
{
this(east, north, 0.);
}
/**
* Construct a UTMCoordinate from double values of easting and
* northing and an altitude.
*
* @param east easting component (meters) in the zone
* @param north northing component (meters) in the zone
* @param alt altitude of the point
*
* @throws VisADException couldn't create the necessary VisAD object
* @throws RemoteException couldn't create the necessary remote object
*/
public UTMCoordinate(double east, double north, double alt)
throws VisADException, RemoteException
{
this(east, north, Double.NaN, 0);
}
/**
* Construct a UTMCoordinate from double values of easting and
* northing. Unknown zone and northern hemisphere used
*
* @param east easting component (meters) in the zone
* @param north northing component (meters) in the zone
* @param alt altitude of the point
* @param zone UTM zone
*
* @throws VisADException couldn't create the necessary VisAD object
* @throws RemoteException couldn't create the necessary remote object
*/
public UTMCoordinate(double east, double north, double alt, int zone)
throws VisADException, RemoteException
{
this(east, north, alt, zone, NORTH);
}
/**
* Construct a UTMCoordinate from double values of easting and
* northing, the zone and the hemisphere.
*
* @param east easting component (meters) in the zone
* @param north northing component (meters) in the zone
* @param alt altitude of the point
* @param zone UTM zone
* @param hemi UTM hemisphere
*
* @throws VisADException couldn't create the necessary VisAD object
* @throws RemoteException couldn't create the necessary remote object
*/
public UTMCoordinate(double east, double north, double alt,
int zone, int hemi)
throws VisADException, RemoteException
{
this(new Real(EASTING, east),
new Real(NORTHING, north),
new Real(RealType.Altitude, alt),
(zone == 0) ? new Real(ZONE) :new Real(ZONE, zone),
new Real(HEMISPHERE, hemi));
}
/**
* Construct a UTMCoordinate from Reals representing the easting and
* northing.
*
* @param east Real representing easting (must have MathType EASTING)
* @param north Real representing northing (must have MathType NORTHING)
*
* @throws VisADException couldn't create the necessary VisAD object
* @throws RemoteException couldn't create the necessary remote object
*/
public UTMCoordinate(Real east, Real north)
throws VisADException, RemoteException
{
this(east, north, new Real(ZONE));
}
/**
* Construct a UTMCoordinate from Reals representing the easting and
* northing and the zone.
*
* @param east Real representing easting (must have MathType EASTING)
* @param north Real representing northing (must have MathType NORTHING)
*
* @throws VisADException couldn't create the necessary VisAD object
* @throws RemoteException couldn't create the necessary remote object
*/
public UTMCoordinate(Real east, Real north, Real alt)
throws VisADException, RemoteException
{
this(east, north, alt, new Real(ZONE, 0));
}
/**
* Construct a UTMCoordinate from Reals representing the easting and
* northing and the zone.
*
* @param east Real representing easting (must have MathType EASTING)
* @param north Real representing northing (must have MathType NORTHING)
*
* @throws VisADException couldn't create the necessary VisAD object
* @throws RemoteException couldn't create the necessary remote object
*/
public UTMCoordinate(Real east, Real north, Real alt, Real zone)
throws VisADException, RemoteException
{
this(east, north, alt, zone, new Real(HEMISPHERE, NORTH));
}
/**
* Construct a UTMCoordinate from Reals representing the easting and
* northing, the zone and the hemisphere.
*
* @param east Real representing easting (must have MathType EASTING)
* @param north Real representing northing (must have MathType NORTHING)
* @param zone Real representing UTM zone
* @param hemi Real representing hemisphere
*
* @throws VisADException couldn't create the necessary VisAD object
* @throws RemoteException couldn't create the necessary remote object
*/
public UTMCoordinate(Real east, Real north, Real alt, Real zone, Real hemi)
throws VisADException, RemoteException
{
this(east, north, alt, zone, hemi, null);
}
/**
* Construct a UTMCoordinate from Reals representing the easting and
* northing, the zone and the hemisphere. Use the CoordinateSystem
* supplied to do any transforms.
*
* @param east Real representing easting (must have MathType EASTING)
* @param north Real representing northing (must have MathType NORTHING)
* @param zone Real representing UTM zone
* @param hemi Real representing hemisphere
* @param cs CoordinateSystem
*
* @throws VisADException couldn't create the necessary VisAD object
* @throws RemoteException couldn't create the necessary remote object
*/
public UTMCoordinate(Real east, Real north, Real alt, Real zone, Real hemi,
CoordinateSystem cs)
throws VisADException, RemoteException
{
super (new RealTupleType(new RealType[] {EASTING, NORTHING,
RealType.Altitude, ZONE, HEMISPHERE}),
new Real[] {east, north, alt, zone, hemi}, (CoordinateSystem) cs);
this.easting = east;
this.northing = north;
this.altitude = alt;
this.zone = zone;
this.hemisphere = hemi;
}
/**
* Get the easting value of this point as a Real
*
* @return Real representing the easting
*/
public Real getEasting()
{
return easting;
}
/**
* Get the northing of this point as a Real
*
* @return Real representing the northing
*/
public Real getNorthing()
{
return northing;
}
/**
* Get the altitude of this point as a Real
*
* @return Real representing the altitude. May be missing.
*/
public Real getAltitude()
{
return altitude;
}
/**
* Get the UTM zone of this point as a Real
*
* @return Real representing the UTM zone
*/
public Real getZone()
{
return zone;
}
/**
* Get the UTM hemisphere of this point as a Real
*
* @return Real representing the UTM hemisphere
*/
public Real getHemisphere()
{
return zone;
}
/**
* Get the easting value of this point as a Real
*
* @return double representing the easting in meters
*/
public double getEastingValue()
{
try {
return easting.getValue(CommonUnit.meter);
} catch (VisADException ve) {
return easting.getValue();
}
}
/**
* Get the northing of this point
*
* @return double representing the northing
*/
public double getNorthingValue()
{
try {
return northing.getValue(CommonUnit.meter);
} catch (VisADException ve) {
return northing.getValue();
}
}
/**
* Get the altitude value of this point.
*
* @return double representing the altitude in meters
*/
public double getAltitudeValue()
{
try {
return altitude.getValue(CommonUnit.meter);
} catch (VisADException ve) {
return altitude.getValue();
}
}
/**
* Get the UTM zone of this point
*
* @return int representing the UTM zone
*/
public int getZoneValue()
{
return (int) zone.getValue();
}
/**
* Get the UTM zone of this point
*
* @return int representing the UTM zone
*/
public int getHemisphereValue()
{
return (int) hemisphere.getValue();
}
public String toString() {
StringBuffer buf = new StringBuffer();
buf.append("East: ");
try {
buf.append(
visad.browser.Convert.shortString(easting.getValue(CommonUnit.degree)));
} catch (VisADException ve) {
buf.append(
visad.browser.Convert.shortString(easting.getValue()));
}
buf.append(" North: ");
try {
buf.append(
visad.browser.Convert.shortString(northing.getValue(CommonUnit.degree)));
} catch (VisADException ve) {
buf.append(
visad.browser.Convert.shortString(northing.getValue()));
}
buf.append(" Zone: ");
buf.append(getZoneValue());
buf.append(" Hemisphere: ");
buf.append(
(getHemisphereValue() == NORTH)?"Northern":"Southern");
return buf.toString();
}
}