quad-hexer
Version: 
A library for converting between quad and hex representations of geocodes.
98 lines (97 loc) • 4.1 kB
JavaScript
const u = (t) => {
  if (typeof t != "string")
    throw new Error("Invalid quadkey type: " + typeof t);
  if (!/^[0-3]{1,32}$/.test(t))
    throw new Error("Invalid quadkey format: " + t);
  const r = t.split("").map((a) => parseInt(a, 4).toString(2).padStart(2, "0")).join(""), n = ["x"], i = Math.floor(r.length / 4);
  return r.length % 4 === 0 ? n.push(
    BigInt("0b" + r).toString(16).padStart(i, "0")
  ) : (r.length >= 4 && n.push(
    BigInt("0b" + r.slice(0, -2)).toString(16).padStart(i, "0")
  ), n.push("#"), n.push(BigInt("0b" + r.slice(-2)).toString(4))), n.join("");
}, S = (t) => {
  if (!t || typeof t != "string")
    throw new Error("Invalid hex quadkey type: " + typeof t);
  const e = /^x([0-9a-f]{0,16})(?:#([0-3]))?$/;
  if (!e.test(t))
    throw new Error("Invalid hex quadkey format: " + t);
  const r = t.match(e);
  if (!r[1] && !r[2])
    throw new Error("Invalid hex quadkey format: " + t);
  const n = [];
  if (r[1]) {
    const i = r[1].length * 2;
    n.push(
      BigInt("0x" + r[1]).toString(4).padStart(i, "0")
    );
  }
  return r[2] && n.push(r[2]), n.join("");
}, w = (t) => {
  if (typeof t != "string")
    throw new Error("Invalid S2 hilbert quadkey type: " + typeof t);
  const e = /^([0-5]{1})\/([0-3]{1,30})$/;
  if (!e.test(t))
    throw new Error("Invalid S2 hilbert quadkey format: " + t);
  const r = t.match(e), n = [];
  return n.push(r[1]), n.push(u(r[2])), n.join("");
}, I = (t) => {
  if (typeof t != "string")
    throw new Error("Invalid hex S2 hilbert quadkey type: " + typeof t);
  const e = /^([0-5]{1})(x[0-9a-f]{0,15}(?:#[0-3])?)$/;
  if (!e.test(t))
    throw new Error("Invalid hex S2 hilbert quadkey format: " + t);
  const r = t.match(e), n = [];
  if (n.push(r[1]), n.push("/"), r[2])
    try {
      n.push(S(r[2]));
    } catch (i) {
      throw i instanceof Error && i.message && i.message.includes("Invalid hex quadkey format") ? new Error("Invalid hex S2 hilbert quadkey format: " + t) : i;
    }
  return n.join("");
}, v = (t) => {
  if (typeof t != "string")
    throw new Error("Invalid spatial id tilehash type: " + typeof t);
  const e = /^(-?)([1-8]{1,30})$/;
  if (!e.test(t))
    throw new Error("Invalid spatial id tilehash format: " + t);
  const r = t.match(e), n = r[1] === "-", a = r[2].split("").map((s) => (parseInt(s) - 1).toString()).join(""), c = a.length, p = BigInt("0o" + a).toString(2).padStart(c * 3, "0"), l = [], g = [];
  for (let s = 0; s < c * 3; s += 3)
    l.push(p.slice(s, s + 1)), g.push(p.slice(s + 1, s + 3));
  const y = l.join(""), h = g.join(""), o = parseInt(y, 2), m = BigInt("0b" + h).toString(4).padStart(c, "0"), f = [];
  return f.push(u(m)), o !== 0 && (f.push(n ? "-" : "+"), f.push(o.toString(16))), f.join("");
}, x = (t) => {
  if (typeof t != "string")
    throw new Error("Invalid hex spatial id tilehash type: " + typeof t);
  const e = /^(x[0-9a-f]{0,15}(?:#[0-3])?)(?:([+-][0-9a-f]+))?$/;
  if (!e.test(t))
    throw new Error("Invalid hex spatial id tilehash format: " + t);
  const r = t.match(e);
  let n;
  try {
    n = S(r[1]);
  } catch (o) {
    throw o instanceof Error && o.message && o.message.includes("Invalid hex quadkey format") ? new Error("Invalid hex spatial id tilehash format: " + t) : o;
  }
  const i = r[2] ? parseInt(r[2], 16) : 0, a = n.length, c = Math.abs(i).toString(2).padStart(a, "0"), d = [];
  for (let o = 0; o < a; o++)
    d.push(c.slice(o, o + 1)), d.push(parseInt(n[o], 4).toString(2).padStart(2, "0"));
  const p = d.join(""), g = BigInt("0b" + p).toString(8).padStart(a, "0").split("").map((o) => (parseInt(o) + 1).toString()).join(""), y = i < 0, h = [];
  return y && h.push("-"), h.push(g), h.join("");
}, q = {
  encodeQuadkey: u,
  decodeHexQuadkey: S,
  encodeS2HilbertQuadkey: w,
  decodeHexS2HilbertQuadkey: I,
  encodeSpatialIdTilehash: v,
  decodeHexSpatialIdTilehash: x
};
export {
  S as decodeHexQuadkey,
  I as decodeHexS2HilbertQuadkey,
  x as decodeHexSpatialIdTilehash,
  u as encodeQuadkey,
  w as encodeS2HilbertQuadkey,
  v as encodeSpatialIdTilehash,
  q as quadHexer
};
//# sourceMappingURL=quad-hexer.mjs.map