UNPKG

@hamlog/maidenhead

Version:

For various amateur radio needs, we at [Hamlog.Online](https://hamlog.online) required a library to process [Maidenhead grid locators](https://en.wikipedia.org/wiki/Maidenhead_Locator_System) in Javascript.

75 lines (74 loc) 1.81 kB
function d(e) { if (e.length % 2 !== 0) return !1; const t = e.toLowerCase(); if (!/^[a-x0-9]+$/.test(t)) return !1; for (let r = 0; r < t.length; r += 2) { const n = `${t[r]}${t[r + 1]}`; if (r == 0) { if (!/[a-r]{2}/.test(n)) return !1; } else if (r % 4 != 0) { if (!/\d{2}/.test(n)) return !1; } else if (!/[a-x]{2}/.test(n)) return !1; } return !0; } const f = 65, h = 48; function u(e) { let t = e.charCodeAt(0); return t >= f ? t - f : t - h; } function c(e, t) { return String.fromCharCode(e + (t ? f : h)); } function p(e) { if (!d(e)) throw new SyntaxError(`"${e}" is not a valid Maidenhead locator`); const t = e.toUpperCase(), r = t.length / 2; let n = -90, a = -90, l = 10; for (let o = 0; o < r; o++) n += l * u(t[2 * o]), a += l * u(t[2 * o + 1]), o < r - 1 && (o % 2 > 0 ? l /= 24 : l /= 10); return n *= 2, [ { lat: a, lon: n }, { lat: a + l, lon: n + l * 2 } ]; } function x(e) { const t = p(e); return { lat: (t[0].lat + t[1].lat) / 2, lon: (t[0].lon + t[1].lon) / 2 }; } function C(e) { let t = ""; for (let r = 0; r < e.length; r++) t += [4, 5, 12, 13].includes(r) ? e[r].toLowerCase() : e[r].toUpperCase(); return t; } function v(e, t = 6, r = !1) { if (t % 2 != 0) throw SyntaxError( "Maidenhead grids are supposed to have an even number of characters." ); let n = "", a = e.lon / 2 + 90, l = e.lat + 90, o = 10; for (let i = 0; i <= 6; i++) { const s = i % 2 == 0; n += c(Math.floor(a / o), s), n += c(Math.floor(l / o), s), a %= o, l %= o, i % 2 > 0 ? o /= 24 : o /= 10; } return r && (n = C(n)), n.slice(0, t); } export { p as gridToBox, x as gridToPoint, v as pointToGrid, d as validateGrid };