@mapbox/sexagesimal
Version:
parse coordinates in sexagesimal form
112 lines (86 loc) • 3.56 kB
JavaScript
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.sexagesimal = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
module.exports = element;
module.exports.pair = pair;
module.exports.format = format;
module.exports.formatPair = formatPair;
module.exports.coordToDMS = coordToDMS;
function element(input, dims) {
var result = search(input, dims);
return (result === null) ? null : result.val;
}
function formatPair(input) {
return format(input.lat, 'lat') + ' ' + format(input.lon, 'lon');
}
// Is 0 North or South?
function format(input, dim) {
var dms = coordToDMS(input, dim);
return dms.whole + '° ' +
(dms.minutes ? dms.minutes + '\' ' : '') +
(dms.seconds ? dms.seconds + '" ' : '') + dms.dir;
}
function coordToDMS(input, dim) {
var dirs = { lat: ['N', 'S'], lon: ['E', 'W'] }[dim] || '';
var dir = dirs[input >= 0 ? 0 : 1];
var abs = Math.abs(input);
var whole = Math.floor(abs);
var fraction = abs - whole;
var fractionMinutes = fraction * 60;
var minutes = Math.floor(fractionMinutes);
var seconds = Math.floor((fractionMinutes - minutes) * 60);
return {
whole: whole,
minutes: minutes,
seconds: seconds,
dir: dir
};
}
function search(input, dims) {
if (!dims) dims = 'NSEW';
if (typeof input !== 'string') return null;
input = input.toUpperCase();
var regex = /^[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)[°º˚]?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/;
var m = input.match(regex);
if (!m) return null; // no match
var matched = m[0];
// extract dimension.. m[1] = leading, m[5] = trailing
var dim;
if (m[1] && m[5]) { // if matched both..
dim = m[1]; // keep leading
matched = matched.slice(0, -1); // remove trailing dimension from match
} else {
dim = m[1] || m[5];
}
// if unrecognized dimension
if (dim && dims.indexOf(dim) === -1) return null;
// extract DMS
var deg = m[2] ? parseFloat(m[2]) : 0;
var min = m[3] ? parseFloat(m[3]) / 60 : 0;
var sec = m[4] ? parseFloat(m[4]) / 3600 : 0;
var sign = (deg < 0) ? -1 : 1;
if (dim === 'S' || dim === 'W') sign *= -1;
return {
val: (Math.abs(deg) + min + sec) * sign,
dim: dim,
matched: matched,
remain: input.slice(matched.length)
};
}
function pair(input, dims) {
input = input.trim();
var one = search(input, dims);
if (!one) return null;
input = one.remain.trim();
var two = search(input, dims);
if (!two || two.remain) return null;
if (one.dim) {
return swapdim(one.val, two.val, one.dim);
} else {
return [one.val, two.val];
}
}
function swapdim(a, b, dim) {
if (dim === 'N' || dim === 'S') return [a, b];
if (dim === 'W' || dim === 'E') return [b, a];
}
},{}]},{},[1])(1)
});