@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
JavaScript
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
};