quad-hexer
Version:
A library for converting between quad and hex representations of geocodes.
1 lines • 13.3 kB
Source Map (JSON)
{"version":3,"file":"quad-hexer.mjs","sources":["../src/quadkey.ts","../src/s2-hilbert-quadkey.ts","../src/spatial-id-tilehash.ts","../src/index.ts"],"sourcesContent":["export const encodeQuadkey = (quadkey: string): string => {\n if (typeof quadkey !== 'string') {\n throw new Error('Invalid quadkey type: ' + typeof quadkey);\n }\n const quadkeyPattern = /^[0-3]{1,32}$/;\n if (!quadkeyPattern.test(quadkey)) {\n throw new Error('Invalid quadkey format: ' + quadkey);\n }\n const binaryString = quadkey\n .split('')\n .map((c) => parseInt(c, 4).toString(2).padStart(2, '0'))\n .join('');\n\n const hexStringArray = ['x'];\n const hexDigits = Math.floor(binaryString.length / 4);\n if (binaryString.length % 4 === 0) {\n hexStringArray.push(\n BigInt('0b' + binaryString)\n .toString(16)\n .padStart(hexDigits, '0')\n );\n } else {\n if (binaryString.length >= 4) {\n hexStringArray.push(\n BigInt('0b' + binaryString.slice(0, -2))\n .toString(16)\n .padStart(hexDigits, '0')\n );\n }\n hexStringArray.push('#');\n hexStringArray.push(BigInt('0b' + binaryString.slice(-2)).toString(4));\n }\n return hexStringArray.join('');\n};\n\nexport const decodeHexQuadkey = (hexQuadkey: string): string => {\n if (!hexQuadkey || typeof hexQuadkey !== 'string') {\n throw new Error('Invalid hex quadkey type: ' + typeof hexQuadkey);\n }\n const hexQuadkeyPattern = /^x([0-9a-f]{0,16})(?:#([0-3]))?$/;\n if (!hexQuadkeyPattern.test(hexQuadkey)) {\n throw new Error('Invalid hex quadkey format: ' + hexQuadkey);\n }\n const matches = hexQuadkey.match(hexQuadkeyPattern)!;\n if (!matches[1] && !matches[2]) {\n throw new Error('Invalid hex quadkey format: ' + hexQuadkey);\n }\n const quadStringArray = [];\n if (matches[1]) {\n const quadDigits = matches[1].length * 2;\n quadStringArray.push(\n BigInt('0x' + matches[1])\n .toString(4)\n .padStart(quadDigits, '0')\n );\n }\n if (matches[2]) {\n quadStringArray.push(matches[2]);\n }\n return quadStringArray.join('');\n};\n","import { encodeQuadkey, decodeHexQuadkey } from './quadkey';\n\nexport const encodeS2HilbertQuadkey = (s2HilbertQuadkey: string): string => {\n if (typeof s2HilbertQuadkey !== 'string') {\n throw new Error('Invalid S2 hilbert quadkey type: ' + typeof s2HilbertQuadkey);\n }\n const s2HilbertQuadkeyPattern = /^([0-5]{1})\\/([0-3]{1,30})$/;\n if (!s2HilbertQuadkeyPattern.test(s2HilbertQuadkey)) {\n throw new Error('Invalid S2 hilbert quadkey format: ' + s2HilbertQuadkey);\n }\n const matches = s2HilbertQuadkey.match(s2HilbertQuadkeyPattern)!;\n const hexStringArray = [];\n hexStringArray.push(matches[1]);\n hexStringArray.push(encodeQuadkey(matches[2]));\n return hexStringArray.join('');\n};\n\nexport const decodeHexS2HilbertQuadkey = (hexS2HilbertQuadkey: string): string => {\n if (typeof hexS2HilbertQuadkey !== 'string') {\n throw new Error('Invalid hex S2 hilbert quadkey type: ' + typeof hexS2HilbertQuadkey);\n }\n const hexS2HilbertQuadkeyPattern = /^([0-5]{1})(x[0-9a-f]{0,15}(?:#[0-3])?)$/;\n if (!hexS2HilbertQuadkeyPattern.test(hexS2HilbertQuadkey)) {\n throw new Error('Invalid hex S2 hilbert quadkey format: ' + hexS2HilbertQuadkey);\n }\n const matches = hexS2HilbertQuadkey.match(hexS2HilbertQuadkeyPattern)!;\n const quadStringArray = [];\n quadStringArray.push(matches[1]);\n quadStringArray.push('/');\n if (matches[2]) {\n try {\n quadStringArray.push(decodeHexQuadkey(matches[2]));\n } catch (error) {\n if (\n error instanceof Error &&\n error.message &&\n error.message.includes('Invalid hex quadkey format')\n ) {\n throw new Error('Invalid hex S2 hilbert quadkey format: ' + hexS2HilbertQuadkey);\n } else {\n throw error;\n }\n }\n }\n return quadStringArray.join('');\n};\n","import { encodeQuadkey, decodeHexQuadkey } from './quadkey';\n\nexport const encodeSpatialIdTilehash = (spatialIdTilehash: string): string => {\n if (typeof spatialIdTilehash !== 'string') {\n throw new Error('Invalid spatial id tilehash type: ' + typeof spatialIdTilehash);\n }\n const spatialIdTilehashPattern = /^(-?)([1-8]{1,30})$/;\n if (!spatialIdTilehashPattern.test(spatialIdTilehash)) {\n throw new Error('Invalid spatial id tilehash format: ' + spatialIdTilehash);\n }\n const matches = spatialIdTilehash.match(spatialIdTilehashPattern)!;\n const isNegative = matches[1] === '-';\n const tilehash = matches[2];\n const octalString = tilehash\n .split('')\n .map((c) => (parseInt(c) - 1).toString())\n .join('');\n const octalDigits = octalString.length;\n const tilehashNumber = BigInt('0o' + octalString);\n const binaryString = tilehashNumber.toString(2).padStart(octalDigits * 3, '0');\n const fBinaryArray = [];\n const yxBinaryArray = [];\n for (let i = 0; i < octalDigits * 3; i += 3) {\n fBinaryArray.push(binaryString.slice(i, i + 1));\n yxBinaryArray.push(binaryString.slice(i + 1, i + 3));\n }\n const fBinaryString = fBinaryArray.join('');\n const yxBinaryString = yxBinaryArray.join('');\n const floorNumber = parseInt(fBinaryString, 2);\n const yxNumber = BigInt('0b' + yxBinaryString);\n const quadkey = yxNumber.toString(4).padStart(octalDigits, '0');\n const hexStringArray = [];\n hexStringArray.push(encodeQuadkey(quadkey));\n if (floorNumber !== 0) {\n hexStringArray.push(isNegative ? '-' : '+');\n hexStringArray.push(floorNumber.toString(16));\n }\n return hexStringArray.join('');\n};\n\nexport const decodeHexSpatialIdTilehash = (hexSpatialIdTilehash: string): string => {\n if (typeof hexSpatialIdTilehash !== 'string') {\n throw new Error('Invalid hex spatial id tilehash type: ' + typeof hexSpatialIdTilehash);\n }\n const hexSpatialIdTilehashPattern = /^(x[0-9a-f]{0,15}(?:#[0-3])?)(?:([+-][0-9a-f]+))?$/;\n if (!hexSpatialIdTilehashPattern.test(hexSpatialIdTilehash)) {\n throw new Error('Invalid hex spatial id tilehash format: ' + hexSpatialIdTilehash);\n }\n const matches = hexSpatialIdTilehash.match(hexSpatialIdTilehashPattern)!;\n let quadString;\n try {\n quadString = decodeHexQuadkey(matches[1]);\n } catch (error) {\n if (\n error instanceof Error &&\n error.message &&\n error.message.includes('Invalid hex quadkey format')\n ) {\n throw new Error('Invalid hex spatial id tilehash format: ' + hexSpatialIdTilehash);\n } else {\n throw error;\n }\n }\n const floorNumber = matches[2] ? parseInt(matches[2], 16) : 0;\n const quadDigits = quadString.length;\n const fBinaryString = Math.abs(floorNumber).toString(2).padStart(quadDigits, '0');\n const binaryStringArray = [];\n for (let i = 0; i < quadDigits; i++) {\n binaryStringArray.push(fBinaryString.slice(i, i + 1));\n binaryStringArray.push(parseInt(quadString[i], 4).toString(2).padStart(2, '0'));\n }\n const binaryString = binaryStringArray.join('');\n const octalString = BigInt('0b' + binaryString)\n .toString(8)\n .padStart(quadDigits, '0');\n const incrementedOctalString = octalString\n .split('')\n .map((c) => (parseInt(c) + 1).toString())\n .join('');\n const isNegative = floorNumber < 0;\n const tilehashStringArray = [];\n if (isNegative) {\n tilehashStringArray.push('-');\n }\n tilehashStringArray.push(incrementedOctalString);\n return tilehashStringArray.join('');\n};\n","export { encodeQuadkey, decodeHexQuadkey } from './quadkey';\nexport { encodeS2HilbertQuadkey, decodeHexS2HilbertQuadkey } from './s2-hilbert-quadkey';\nexport { encodeSpatialIdTilehash, decodeHexSpatialIdTilehash } from './spatial-id-tilehash';\n\nimport { encodeQuadkey, decodeHexQuadkey } from './quadkey';\nimport { encodeS2HilbertQuadkey, decodeHexS2HilbertQuadkey } from './s2-hilbert-quadkey';\nimport { encodeSpatialIdTilehash, decodeHexSpatialIdTilehash } from './spatial-id-tilehash';\n\nexport const quadHexer = {\n encodeQuadkey: encodeQuadkey,\n decodeHexQuadkey: decodeHexQuadkey,\n encodeS2HilbertQuadkey: encodeS2HilbertQuadkey,\n decodeHexS2HilbertQuadkey: decodeHexS2HilbertQuadkey,\n encodeSpatialIdTilehash: encodeSpatialIdTilehash,\n decodeHexSpatialIdTilehash: decodeHexSpatialIdTilehash\n} as const;\n"],"names":["encodeQuadkey","quadkey","binaryString","c","hexStringArray","hexDigits","decodeHexQuadkey","hexQuadkey","hexQuadkeyPattern","matches","quadStringArray","quadDigits","encodeS2HilbertQuadkey","s2HilbertQuadkey","s2HilbertQuadkeyPattern","decodeHexS2HilbertQuadkey","hexS2HilbertQuadkey","hexS2HilbertQuadkeyPattern","error","encodeSpatialIdTilehash","spatialIdTilehash","spatialIdTilehashPattern","isNegative","octalString","octalDigits","fBinaryArray","yxBinaryArray","i","fBinaryString","yxBinaryString","floorNumber","decodeHexSpatialIdTilehash","hexSpatialIdTilehash","hexSpatialIdTilehashPattern","quadString","binaryStringArray","incrementedOctalString","tilehashStringArray","quadHexer"],"mappings":"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"}