Node.js examples for Math:Math Function
Geodesy representation conversion functions
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* Geodesy representation conversion functions (c) Chris Veness 2002-2014 */ /* - www.movable-type.co.uk/scripts/latlong.html */ /* */ /* Sample usage: */ /* var lat = Geo.parseDMS('51? 28' 40.12? N'); */ /* var lon = Geo.parseDMS('000? 00' 05.31? W'); */ /* var p1 = new LatLon(lat, lon); */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 'use strict';//from w w w. jav a 2 s. co m /** * Tools for converting between numeric degrees and degrees / minutes / seconds. * * @namespace */ var Geo = {}; // note Unicode Degree = U+00B0. Prime = U+2032, Double prime = U+2033 /** * Parses string representing degrees/minutes/seconds into numeric degrees. * * This is very flexible on formats, allowing signed decimal degrees, or deg-min-sec optionally * suffixed by compass direction (NSEW). A variety of separators are accepted (eg 3? 37' 09?W). * Seconds and minutes may be omitted. * * @param {string|number} dmsStr - Degrees or deg/min/sec in variety of formats. * @returns {number} Degrees as decimal number. */ Geo.parseDMS = function(dmsStr) { // check for signed decimal degrees without NSEW, if so return it directly if (typeof dmsStr == 'number' && isFinite(dmsStr)) return Number(dmsStr); // strip off any sign or compass dir'n & split out separate d/m/s var dms = String(dmsStr).trim().replace(/^-/,'').replace(/[NSEW]$/i,'').split(/[^0-9.,]+/); if (dms[dms.length-1]=='') dms.splice(dms.length-1); // from trailing symbol if (dms == '') return NaN; // and convert to decimal degrees... switch (dms.length) { case 3: // interpret 3-part result as d/m/s var deg = dms[0]/1 + dms[1]/60 + dms[2]/3600; break; case 2: // interpret 2-part result as d/m var deg = dms[0]/1 + dms[1]/60; break; case 1: // just d (possibly decimal) or non-separated dddmmss var deg = dms[0]; // check for fixed-width unseparated format eg 0033709W //if (/[NS]/i.test(dmsStr)) deg = '0' + deg; // - normalise N/S to 3-digit degrees //if (/[0-9]{7}/.test(deg)) deg = deg.slice(0,3)/1 + deg.slice(3,5)/60 + deg.slice(5)/3600; break; default: return NaN; } if (/^-|[WS]$/i.test(dmsStr.trim())) deg = -deg; // take '-', west and south as -ve return Number(deg); } /** * Converts decimal degrees to deg/min/sec format * - degree, prime, double-prime symbols are added, but sign is discarded, though no compass * direction is added. * * @private * @param {number} deg - Degrees to be formatted as specified. * @param {string} [format=dms] - Return value as 'd', 'dm', 'dms'. * @param {number} [dp=0|2|4] - Number of decimal places to use ? default 0 for dms, 2 for dm, 4 for d. * @returns {string} Degrees formatted as deg/min/secs according to specified format. */ Geo.toDMS = function(deg, format, dp) { if (isNaN(deg)) return null; // give up here if we can't make a number from deg // default values if (typeof format == 'undefined') format = 'dms'; if (typeof dp == 'undefined') { switch (format) { case 'd': dp = 4; break; case 'dm': dp = 2; break; case 'dms': dp = 0; break; default: format = 'dms'; dp = 0; // be forgiving on invalid format } } deg = Math.abs(deg); // (unsigned result ready for appending compass dir'n) switch (format) { case 'd': d = deg.toFixed(dp); // round degrees if (d<100) d = '0' + d; // pad with leading zeros if (d<10) d = '0' + d; var dms = d + '?'; break; case 'dm': var min = (deg*60).toFixed(dp); // convert degrees to minutes & round var d = Math.floor(min / 60); // get component deg/min var m = (min % 60).toFixed(dp); // pad with trailing zeros if (d<100) d = '0' + d; // pad with leading zeros if (d<10) d = '0' + d; if (m<10) m = '0' + m; var dms = d + '?' + m + '''; break; case 'dms': var sec = (deg*3600).toFixed(dp); // convert degrees to seconds & round var d = Math.floor(sec / 3600); // get component deg/min/sec var m = Math.floor(sec/60) % 60; var s = (sec % 60).toFixed(dp); // pad with trailing zeros if (d<100) d = '0' + d; // pad with leading zeros if (d<10) d = '0' + d; if (m<10) m = '0' + m; if (s<10) s = '0' + s; var dms = d + '?' + m + ''' + s + '?'; break; } return dms; } /** * Converts numeric degrees to deg/min/sec latitude (2-digit degrees, suffixed with N/S). * * @param {number} deg - Degrees to be formatted as specified. * @param {string} [format=dms] - Return value as 'd', 'dm', 'dms'. * @param {number} [dp=0|2|4] - Number of decimal places to use ? default 0 for dms, 2 for dm, 4 for d. * @returns {string} Degrees formatted as deg/min/secs according to specified format. */ Geo.toLat = function(deg, format, dp) { var lat = Geo.toDMS(deg, format, dp); return lat==null ? '?' : lat.slice(1) + (deg<0 ? 'S' : 'N'); // knock off initial '0' for lat! } /** * Convert numeric degrees to deg/min/sec longitude (3-digit degrees, suffixed with E/W) * * @param {number} deg - Degrees to be formatted as specified. * @param {string} [format=dms] - Return value as 'd', 'dm', 'dms'. * @param {number} [dp=0|2|4] - Number of decimal places to use ? default 0 for dms, 2 for dm, 4 for d. * @returns {string} Degrees formatted as deg/min/secs according to specified format. */ Geo.toLon = function(deg, format, dp) { var lon = Geo.toDMS(deg, format, dp); return lon==null ? '?' : lon + (deg<0 ? 'W' : 'E'); } /** * Converts numeric degrees to deg/min/sec as a bearing (0?..360?) * * @param {number} deg - Degrees to be formatted as specified. * @param {string} [format=dms] - Return value as 'd', 'dm', 'dms'. * @param {number} [dp=0|2|4] - Number of decimal places to use ? default 0 for dms, 2 for dm, 4 for d. * @returns {string} Degrees formatted as deg/min/secs according to specified format. */ Geo.toBrng = function(deg, format, dp) { deg = (Number(deg)+360) % 360; // normalise -ve values to 180?..360? var brng = Geo.toDMS(deg, format, dp); return brng==null ? '?' : brng.replace('360', '0'); // just in case rounding took us up to 360?! } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /** Extend Number object with method to trim whitespace from string * (q.v. blog.stevenlevithan.com/archives/faster-trim-javascript) */ if (typeof String.prototype.trim == 'undefined') { String.prototype.trim = function() { return String(this).replace(/^\s\s*/, '').replace(/\s\s*$/, ''); } } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ if (!window.console) window.console = { log: function() {} };