|
Community Map Builder 21 Aug 2007 | |||||||
PREV NEXT | FRAMES NO FRAMES |
No overview generated for 'MGRS.js'
Method Summary | |
static Object
|
AsciiToNum( ascii )
|
static Object
|
degToRad(deg)
|
static Object
|
formatMGRS()
|
static Object
|
get100kID( easting, northing, zone_number)
Get the two letter 100k designator for a given UTM easting, northing and zone number value. |
static Object
|
get100kSetForZone(i)
Given a UTM zone number, figure out the MGRS 100K set it is in. |
static Object
|
getLetter100kID( column, row, parm)
Get the two-letter MGRS 100k designator given information translated from the UTM northing, easting and zone number. |
static Object
|
getLetterDesignator(lat)
|
static Object
|
LLtoUTM()
Converts a set of Longitude and Latitude co-ordinates to UTM given an ellipsoid |
static Object
|
MGRS()
|
static Object
|
NumToAscii( num )
|
/* Author: Patrice G. Cappelaere (Got library from Geoserver) License: LGPL as per: http://www.gnu.org/copyleft/lesser.html $Id: MGRS.js 2546 2007-01-23 12:07:39Z gjvoosten $ */ function MGRS() { /** * UTM zones are grouped, and assigned to one of a group of 6 * sets. */ var NUM_100K_SETS = 6; /** * The column letters (for easting) of the lower left value, per * set. */ var SET_ORIGIN_COLUMN_LETTERS = new Array('A','J','S','A','J','S'); /** * The row letters (for northing) of the lower left value, per * set. */ var SET_ORIGIN_ROW_LETTERS = new Array('A','F','A','F','A','F'); /** * The column letters (for easting) of the lower left value, per * set,, for Bessel Ellipsoid. */ var BESSEL_SET_ORIGIN_COLUMN_LETTERS = new Array( 'A', 'J', 'S', 'A', 'J', 'S' ); /** * The row letters (for northing) of the lower left value, per * set, for Bessel Ellipsoid. */ var BESSEL_SET_ORIGIN_ROW_LETTERS = new Array( 'L', 'R', 'L', 'R', 'L', 'R' ); var SET_NORTHING_ROLLOVER = 20000000; /** * Use 5 digits for northing and easting values, for 1 meter * accuracy of coordinate. */ var ACCURACY_1_METER = 5; /** * Use 4 digits for northing and easting values, for 10 meter * accuracy of coordinate. */ var ACCURACY_10_METER = 4; /** * Use 3 digits for northing and easting values, for 100 meter * accuracy of coordinate. */ var ACCURACY_100_METER = 3; /** * Use 2 digits for northing and easting values, for 1000 meter * accuracy of coordinate. */ var ACCURACY_1000_METER = 2; /** * Use 1 digits for northing and easting values, for 10000 meter * accuracy of coordinate. */ var ACCURACY_10000_METER = 1; /** The set origin column letters to use. */ var originColumnLetters = SET_ORIGIN_COLUMN_LETTERS; /** The set origin row letters to use. */ var originRowLetters = SET_ORIGIN_ROW_LETTERS; var A = 65; //AsciiToNum('A'); var I = 73; //AsciiToNum('I'); var O = 79; //AsciiToNum('O'); var V = 86; //AsciiToNum('V'); var Z = 90; //AsciiToNum('Z'); var DEBUG = false; /** The String holding the MGRS coordinate value. */ var mgrs_; var lat_; var lon_; var radlat_ ; var radlon_ ; var northing_; var easting_; var zone_number_; var zone_letter_; /** * Conversion of lat/lon to MGRS */ this.convert = function(latitude, longitude) { lat_ = parseFloat(latitude); lon_ = parseFloat(longitude); radlat_ = degToRad(lat_); radlon_ = degToRad(lon_); LLtoUTM(); return formatMGRS(); } function degToRad(deg) { return (deg * (Math.PI / 180.0)); } /** * Converts a set of Longitude and Latitude co-ordinates to UTM * given an ellipsoid * * @param ellip an ellipsoid definition. * @param llpoint the coordinate to be converted * @param utmpoint A UTMPoint instance to put the results in. If * null, a new UTMPoint will be allocated. * @return A UTM class instance containing the value of * <code>null</code> if conversion failed. If you pass * in a UTMPoint, it will be returned as well if * successful. */ function LLtoUTM() { var Lat = lat_; var Long = lon_; var a = 6378137.0; //ellip.radius; var eccSquared = 0.00669438; //ellip.eccsq; var k0 = 0.9996; var LongOrigin; var eccPrimeSquared; var N, T, C, A, M; var LatRad = radlat_; var LongRad = radlon_; var LongOriginRad; var ZoneNumber; // (int) ZoneNumber = Math.floor((Long + 180) / 6) + 1; //Make sure the longitude 180.00 is in Zone 60 if (Long == 180) { ZoneNumber = 60; } // Special zone for Norway if (Lat >= 56.0 && Lat < 64.0 && Long >= 3.0 && Long < 12.0) { ZoneNumber = 32; } // Special zones for Svalbard if (Lat >= 72.0 && Lat < 84.0) { if (Long >= 0.0 && Long < 9.0) ZoneNumber = 31; else if (Long >= 9.0 && Long < 21.0) ZoneNumber = 33; else if (Long >= 21.0 && Long < 33.0) ZoneNumber = 35; else if (Long >= 33.0 && Long < 42.0) ZoneNumber = 37; } LongOrigin = (ZoneNumber - 1) * 6 - 180 + 3; //+3 puts origin // in middle of // zone LongOriginRad = degToRad(LongOrigin); eccPrimeSquared = (eccSquared) / (1 - eccSquared); N = a / Math.sqrt(1 - eccSquared * Math.sin(LatRad) * Math.sin(LatRad)); T = Math.tan(LatRad) * Math.tan(LatRad); C = eccPrimeSquared * Math.cos(LatRad) * Math.cos(LatRad); A = Math.cos(LatRad) * (LongRad - LongOriginRad); M = a * ((1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256) * LatRad - (3 * eccSquared / 8 + 3 * eccSquared * eccSquared / 32 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(2 * LatRad) + (15 * eccSquared * eccSquared / 256 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(4 * LatRad) - (35 * eccSquared * eccSquared * eccSquared / 3072) * Math.sin(6 * LatRad)); var UTMEasting = (k0 * N * (A + (1 - T + C) * A * A * A / 6.0 + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * A * A * A * A * A / 120.0) + 500000.0); var UTMNorthing = (k0 * (M + N * Math.tan(LatRad) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24.0 + (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared) * A * A * A * A * A * A / 720.0))); if (Lat < 0.0) { UTMNorthing += 10000000.0; //10000000 meter offset for // southern hemisphere } northing_ = Math.round(UTMNorthing); easting_ = Math.round(UTMEasting); zone_number_ = ZoneNumber; zone_letter_ = getLetterDesignator(Lat); } function getLetterDesignator(lat) { //This is here as an error flag to show that the Latitude is //outside MGRS limits var 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; } function formatMGRS() { var seasting = "" + easting_; var snorthing = ""+ northing_; while( snorthing.length > 6 ) snorthing = snorthing.substr(1,snorthing.length-1); var str= zone_number_ + "" + zone_letter_ + get100kID(easting_, northing_, zone_number_) + seasting.substr(1,4) + snorthing.substr(1,4); return str; } /** * Get the two letter 100k designator for a given UTM easting, * northing and zone number value. */ function get100kID( easting, northing, zone_number) { var setParm = get100kSetForZone(zone_number); var setColumn = Math.floor( easting / 100000); var setRow = Math.floor( northing / 100000) % 20; //trace("get100kID:"+setParm+" "+setColumn+" "+setRow); return getLetter100kID(setColumn, setRow, setParm); } /** * Given a UTM zone number, figure out the MGRS 100K set it is in. */ function get100kSetForZone(i) { var setParm = i % NUM_100K_SETS; if (setParm == 0) setParm = NUM_100K_SETS; return setParm; } /** * Get the two-letter MGRS 100k designator given information * translated from the UTM northing, easting and zone number. * * @param setColumn the column index as it relates to the MGRS * 100k set spreadsheet, created from the UTM easting. * Values are 1-8. * @param setRow the row index as it relates to the MGRS 100k set * spreadsheet, created from the UTM northing value. Values * are from 0-19. * @param setParm the set block, as it relates to the MGRS 100k set * spreadsheet, created from the UTM zone. Values are from * 1-60. * @return two letter MGRS 100k code. */ function getLetter100kID( column, row, parm) { // colOrigin and rowOrigin are the letters at the origin of the set var index = parm-1; var colOrigin = AsciiToNum(SET_ORIGIN_COLUMN_LETTERS[index]); var rowOrigin = AsciiToNum(SET_ORIGIN_ROW_LETTERS[index]); // colInt and rowInt are the letters to build to return var colInt = colOrigin + column - 1; var rowInt = rowOrigin + row; var rollover = false; if ( colInt > Z ) { colInt = colInt - Z + A - 1; rollover = true; } if (colInt == I || (colOrigin < I && colInt > I) || ((colInt > I || colOrigin < I) && rollover)) { colInt++; } if (colInt == O || (colOrigin < O && colInt > O) || ((colInt > O || colOrigin < O) && rollover)) { colInt++; if (colInt == I) { colInt++; } } if (colInt > Z) { colInt = colInt - Z + A - 1; } if (rowInt > V) { rowInt = rowInt - V + A - 1; rollover = true; } else { rollover = false; } if( ((rowInt == I) || ((rowOrigin < I) && (rowInt > I))) || (((rowInt > I)||(rowOrigin < I)) && rollover)) { rowInt++; } if( ((rowInt == O) || ((rowOrigin < O) && (rowInt > O))) || (((rowInt > O)|| (rowOrigin < O)) && rollover)) { rowInt++; if (rowInt == I) { rowInt++; } } if (rowInt > V) { rowInt = rowInt - V + A - 1; } var twoLetter = NumToAscii(colInt) + "" + NumToAscii(rowInt); return twoLetter; } function AsciiToNum( ascii ) { switch( ascii ) { case 'A': return 65; case 'B': return 66; case 'C': return 67; case 'D': return 68; case 'E': return 69; case 'F': return 70; case 'G': return 71; case 'H': return 72; case 'I': return 73; case 'J': return 74; case 'K': return 75; case 'L': return 76; case 'M': return 77; case 'N': return 78; case 'O': return 79; case 'P': return 80; case 'Q': return 81; case 'R': return 82; case 'S': return 83; case 'T': return 84; case 'U': return 85; case 'V': return 86; case 'W': return 87; case 'X': return 88; case 'Y': return 89; case 'Z': return 90; } } function NumToAscii( num ) { switch( num ) { case 65: return 'A'; case 66: return 'B'; case 67: return 'C'; case 68: return 'D'; case 69: return 'E'; case 70: return 'F'; case 71: return 'G'; case 72: return 'H'; case 73: return 'I'; case 74: return 'J'; case 75 : return 'K'; case 76: return 'L'; case 77: return 'M'; case 78: return 'N'; case 79: return 'O'; case 80: return 'P'; case 81: return 'Q'; case 82: return 'R'; case 83: return 'S'; case 84: return 'T'; case 85: return 'U'; case 86: return 'V'; case 87: return 'W'; case 88: return 'X'; case 89: return 'Y'; case 90: return 'Z'; } } }
|
Community Map Builder 21 Aug 2007 | |||||||
PREV NEXT | FRAMES NO FRAMES |