src/util/proj4-src.js
function decode(mgrsString) {

        if (mgrsString && mgrsString.length === 0) {
            throw ("MGRSPoint coverting from nothing");
        }

        var length = mgrsString.length;

        var hunK = null;
        var sb = "";
        var testChar;
        var i = 0;

        // get Zone number
        while (!(/[A-Z]/).test(testChar = mgrsString.charAt(i))) {
            if (i >= 2) {
                throw ("MGRSPoint bad conversion from: " + mgrsString);
            }
            sb += testChar;
            i++;
        }

        var zoneNumber = parseInt(sb, 10);

        if (i === 0 || i + 3 > length) {
            // A good MGRS string has to be 4-5 digits long,
            // ##AAA/#AAA at least.
            throw ("MGRSPoint bad conversion from: " + mgrsString);
        }

        var zoneLetter = mgrsString.charAt(i++);

        // Should we check the zone letter here? Why not.
        if (zoneLetter <= 'A' || zoneLetter === 'B' || zoneLetter === 'Y' || zoneLetter >= 'Z' || zoneLetter === 'I' || zoneLetter === 'O') {
            throw ("MGRSPoint zone letter " + zoneLetter + " not handled: " + mgrsString);
        }

        hunK = mgrsString.substring(i, i += 2);

        var set = get100kSetForZone(zoneNumber);

        var east100k = getEastingFromChar(hunK.charAt(0), set);
        var north100k = getNorthingFromChar(hunK.charAt(1), set);

        // We have a bug where the northing may be 2000000 too low.
        // How
        // do we know when to roll over?

        while (north100k < getMinNorthing(zoneLetter)) {
            north100k += 2000000;
        }

        // calculate the char index for easting/northing separator
        var remainder = length - i;

        if (remainder % 2 !== 0) {
            throw ("MGRSPoint has to have an even number \nof digits after the zone letter and two 100km letters - front \nhalf for easting meters, second half for \nnorthing meters" + mgrsString);
        }

        var sep = remainder / 2;

        var sepEasting = 0.0;
        var sepNorthing = 0.0;
        var accuracyBonus, sepEastingString, sepNorthingString, easting, northing;
        if (sep > 0) {
            accuracyBonus = 100000.0 / Math.pow(10, sep);
            sepEastingString = mgrsString.substring(i, i + sep);
            sepEasting = parseFloat(sepEastingString) * accuracyBonus;
            sepNorthingString = mgrsString.substring(i + sep);
            sepNorthing = parseFloat(sepNorthingString) * accuracyBonus;
        }

        easting = sepEasting + east100k;
        northing = sepNorthing + north100k;

        return {
            easting: easting,
            northing: northing,
            zoneLetter: zoneLetter,
            zoneNumber: zoneNumber,
            accuracy: accuracyBonus
        };
    }
function decode(mgrsString) {

        if (mgrsString && mgrsString.length === 0) {
            throw ("MGRSPoint coverting from nothing");
        }

        var length = mgrsString.length;

        var hunK = null;
        var sb = "";
        var testChar;
        var i = 0;

        // get Zone number
        while (!(/[A-Z]/).test(testChar = mgrsString.charAt(i))) {
            if (i >= 2) {
                throw ("MGRSPoint bad conversion from: " + mgrsString);
            }
            sb += testChar;
            i++;
        }

        var zoneNumber = parseInt(sb, 10);

        if (i === 0 || i + 3 > length) {
            // A good MGRS string has to be 4-5 digits long,
            // ##AAA/#AAA at least.
            throw ("MGRSPoint bad conversion from: " + mgrsString);
        }

        var zoneLetter = mgrsString.charAt(i++);

        // Should we check the zone letter here? Why not.
        if (zoneLetter <= 'A' || zoneLetter === 'B' || zoneLetter === 'Y' || zoneLetter >= 'Z' || zoneLetter === 'I' || zoneLetter === 'O') {
            throw ("MGRSPoint zone letter " + zoneLetter + " not handled: " + mgrsString);
        }

        hunK = mgrsString.substring(i, i += 2);

        var set = get100kSetForZone(zoneNumber);

        var east100k = getEastingFromChar(hunK.charAt(0), set);
        var north100k = getNorthingFromChar(hunK.charAt(1), set);

        // We have a bug where the northing may be 2000000 too low.
        // How
        // do we know when to roll over?

        while (north100k < getMinNorthing(zoneLetter)) {
            north100k += 2000000;
        }

        // calculate the char index for easting/northing separator
        var remainder = length - i;

        if (remainder % 2 !== 0) {
            throw ("MGRSPoint has to have an even number \nof digits after the zone letter and two 100km letters - front \nhalf for easting meters, second half for \nnorthing meters" + mgrsString);
        }

        var sep = remainder / 2;

        var sepEasting = 0.0;
        var sepNorthing = 0.0;
        var accuracyBonus, sepEastingString, sepNorthingString, easting, northing;
        if (sep > 0) {
            accuracyBonus = 100000.0 / Math.pow(10, sep);
            sepEastingString = mgrsString.substring(i, i + sep);
            sepEasting = parseFloat(sepEastingString) * accuracyBonus;
            sepNorthingString = mgrsString.substring(i + sep);
            sepNorthing = parseFloat(sepNorthingString) * accuracyBonus;
        }

        easting = sepEasting + east100k;
        northing = sepNorthing + north100k;

        return {
            easting: easting,
            northing: northing,
            zoneLetter: zoneLetter,
            zoneNumber: zoneNumber,
            accuracy: accuracyBonus
        };
    }
function decode ( mgrsString ) { if ( mgrsString && mgrsString . length === 0 ) { throw ( "MGRSPoint coverting from nothing" ) ; } var length = mgrsString . length ; var hunK = null ; var sb = "" ; var testChar ; var i = 0 ; // get Zone number while ( ! ( / [A-Z] / ) . test ( testChar = mgrsString . charAt ( i ) ) ) { if ( i >= 2 ) { throw ( "MGRSPoint bad conversion from: " + mgrsString ) ; } sb += testChar ; i ++ ; } var zoneNumber = parseInt ( sb , 10 ) ; if ( i === 0 || i + 3 > length ) { // A good MGRS string has to be 4-5 digits long, // ##AAA/#AAA at least. throw ( "MGRSPoint bad conversion from: " + mgrsString ) ; } var zoneLetter = mgrsString . charAt ( i ++ ) ; // Should we check the zone letter here? Why not. if ( zoneLetter <= 'A' || zoneLetter === 'B' || zoneLetter === 'Y' || zoneLetter >= 'Z' || zoneLetter === 'I' || zoneLetter === 'O' ) { throw ( "MGRSPoint zone letter " + zoneLetter + " not handled: " + mgrsString ) ; } hunK = mgrsString . substring ( i , i += 2 ) ; var set = get100kSetForZone ( zoneNumber ) ; var east100k = getEastingFromChar ( hunK . charAt ( 0 ) , set ) ; var north100k = getNorthingFromChar ( hunK . charAt ( 1 ) , set ) ; // We have a bug where the northing may be 2000000 too low. // How // do we know when to roll over? while ( north100k < getMinNorthing ( zoneLetter ) ) { north100k += 2000000 ; } // calculate the char index for easting/northing separator var remainder = length - i ; if ( remainder % 2 !== 0 ) { throw ( "MGRSPoint has to have an even number \nof digits after the zone letter and two 100km letters - front \nhalf for easting meters, second half for \nnorthing meters" + mgrsString ) ; } var sep = remainder / 2 ; var sepEasting = 0.0 ; var sepNorthing = 0.0 ; var accuracyBonus , sepEastingString , sepNorthingString , easting , northing ; if ( sep > 0 ) { accuracyBonus = 100000.0 / Math . pow ( 10 , sep ) ; sepEastingString = mgrsString . substring ( i , i + sep ) ; sepEasting = parseFloat ( sepEastingString ) * accuracyBonus ; sepNorthingString = mgrsString . substring ( i + sep ) ; sepNorthing = parseFloat ( sepNorthingString ) * accuracyBonus ; } easting = sepEasting + east100k ; northing = sepNorthing + north100k ; return { easting : easting , northing : northing , zoneLetter : zoneLetter , zoneNumber : zoneNumber , accuracy : accuracyBonus } ; }
Decode the UTM parameters from a MGRS string.

@private
@param {string} mgrsString an UPPERCASE coordinate string is expected.
@return {object} An object literal with easting, northing, zoneLetter,
zoneNumber and accuracy (in meters) properties.
Decode the UTM parameters from a MGRS string .