// **********************************************************************
//
// <copyright>
//
// BBN Technologies
// 10 Moulton Street
// Cambridge, MA 02138
// (617) 873-8000
//
// Copyright (C) BBNT Solutions LLC. All rights reserved.
//
// </copyright>
// **********************************************************************
package com.jwetherell.openmap.common;
public class ZonedUTMPoint extends UTMPoint {
public ZonedUTMPoint() {
super();
}
public ZonedUTMPoint(LatLonPoint llpoint) {
super(llpoint);
zone_letter = getLetterDesignator(llpoint.getLatitude());
}
public ZonedUTMPoint(LatLonPoint llpoint, Ellipsoid ellip) {
super(llpoint, ellip);
zone_letter = getLetterDesignator(llpoint.getLatitude());
}
public ZonedUTMPoint(double northing, double easting, int zone_number, char zone_letter) {
super(northing, easting, zone_number, MGRSPoint.MGRSZoneToUTMZone(zone_letter));
this.zone_letter = zone_letter;
}
/**
* Converts UTM coords to lat/long given an ellipsoid.
* <p>
* Equations from USGS Bulletin 1532 <br>
* East Longitudes are positive, West longitudes are negative. <br>
* North latitudes are positive, South latitudes are negative. <br>
*
* @param ellip
* an ellipsoid definition.
* @param UTMNorthing
* A float value for the northing to be converted.
* @param UTMEasting
* A float value for the easting to be converted.
* @param ZoneNumber
* An int value specifiying the UTM zone number.
* @param ZoneLetter
* A char value specifying the ZoneLetter within the ZoneNumber,
* letter being MGRS zone.
* @param llpoint
* a LatLonPoint, if you want it to be filled in with the
* results. If null, a new LatLonPoint will be allocated.
* @return A LatLonPoint class instance containing the lat/long value, or
* <code>null</code> if conversion failed. If you pass in a
* LatLonPoint, it will be returned as well, if successful.
*/
public static LatLonPoint ZonedUTMtoLL(Ellipsoid ellip, double UTMNorthing, double UTMEasting, int ZoneNumber, char ZoneLetter, LatLonPoint llpoint) {
return UTMPoint.UTMtoLL(ellip, UTMNorthing, UTMEasting, ZoneNumber, MGRSPoint.MGRSZoneToUTMZone(ZoneLetter), llpoint);
}
/**
* Determines the correct MGRS letter designator for the given latitude
* returns 'Z' if latitude is outside the MGRS limits of 84N to 80S.
*
* @param lat
* The float value of the latitude.
*
* @return A char value which is the MGRS zone letter.
*/
protected char getLetterDesignator(double lat) {
// This is here as an error flag to show that the Latitude is
// outside MGRS limits
char LetterDesignator = 'Z';
if ((84 >= lat) && (lat >= 72)) LetterDesignator = 'X';
else if ((72 > lat) && (lat >= 64)) LetterDesignator = 'W';
else if ((64 > lat) && (lat >= 56)) LetterDesignator = 'V';
else if ((56 > lat) && (lat >= 48)) LetterDesignator = 'U';
else if ((48 > lat) && (lat >= 40)) LetterDesignator = 'T';
else if ((40 > lat) && (lat >= 32)) LetterDesignator = 'S';
else if ((32 > lat) && (lat >= 24)) LetterDesignator = 'R';
else if ((24 > lat) && (lat >= 16)) LetterDesignator = 'Q';
else if ((16 > lat) && (lat >= 8)) LetterDesignator = 'P';
else if ((8 > lat) && (lat >= 0)) LetterDesignator = 'N';
else if ((0 > lat) && (lat >= -8)) LetterDesignator = 'M';
else if ((-8 > lat) && (lat >= -16)) LetterDesignator = 'L';
else if ((-16 > lat) && (lat >= -24)) LetterDesignator = 'K';
else if ((-24 > lat) && (lat >= -32)) LetterDesignator = 'J';
else if ((-32 > lat) && (lat >= -40)) LetterDesignator = 'H';
else if ((-40 > lat) && (lat >= -48)) LetterDesignator = 'G';
else if ((-48 > lat) && (lat >= -56)) LetterDesignator = 'F';
else if ((-56 > lat) && (lat >= -64)) LetterDesignator = 'E';
else if ((-64 > lat) && (lat >= -72)) LetterDesignator = 'D';
else if ((-72 > lat) && (lat >= -80)) LetterDesignator = 'C';
return LetterDesignator;
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
return "Zone_number=" + zone_number + ", Hemisphere=" + zone_letter + ", Northing=" + northing + ", Easting=" + easting;
}
}