@xyo-network/quadkey 2.84.18 → 2.85.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index.cjs +27 -12
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +30 -21
- package/dist/browser/index.js.map +1 -1
- package/dist/node/index.cjs +32 -13
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +35 -22
- package/dist/node/index.js.map +1 -1
- package/package.json +1 -1
package/dist/browser/index.cjs
CHANGED
|
@@ -3,6 +3,7 @@ var __defProp = Object.defineProperty;
|
|
|
3
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
5
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
6
7
|
var __export = (target, all) => {
|
|
7
8
|
for (var name in all)
|
|
8
9
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -41,24 +42,29 @@ var RelativeDirectionConstantLookup = {
|
|
|
41
42
|
|
|
42
43
|
// src/Quadkey.ts
|
|
43
44
|
var MAX_ZOOM = 124;
|
|
44
|
-
var isQuadkey = (obj) => obj?.type === Quadkey.type;
|
|
45
|
+
var isQuadkey = /* @__PURE__ */ __name((obj) => obj?.type === Quadkey.type, "isQuadkey");
|
|
45
46
|
var FULL_MASK = 2n ** 256n - 1n;
|
|
46
47
|
var ZOOM_MASK = 0xffn << 248n;
|
|
47
48
|
var ID_MASK = ZOOM_MASK ^ FULL_MASK;
|
|
48
|
-
var assertMaxBitUint = (value, bits = 256n) => {
|
|
49
|
+
var assertMaxBitUint = /* @__PURE__ */ __name((value, bits = 256n) => {
|
|
49
50
|
(0, import_assert.assertEx)(value < 2n ** bits && value >= 0, "Not a 256 Bit Uint!");
|
|
50
|
-
};
|
|
51
|
+
}, "assertMaxBitUint");
|
|
51
52
|
var Quadkey = class _Quadkey {
|
|
52
|
-
|
|
53
|
-
this
|
|
54
|
-
assertMaxBitUint(key);
|
|
55
|
-
this.guessZoom();
|
|
53
|
+
static {
|
|
54
|
+
__name(this, "Quadkey");
|
|
56
55
|
}
|
|
56
|
+
key;
|
|
57
57
|
static Zero = _Quadkey.from(0, 0n);
|
|
58
58
|
static root = new _Quadkey();
|
|
59
59
|
static type = "Quadkey";
|
|
60
|
-
type
|
|
60
|
+
type;
|
|
61
61
|
_geoJson;
|
|
62
|
+
constructor(key = 0n) {
|
|
63
|
+
this.key = key;
|
|
64
|
+
this.type = _Quadkey.type;
|
|
65
|
+
assertMaxBitUint(key);
|
|
66
|
+
this.guessZoom();
|
|
67
|
+
}
|
|
62
68
|
get base16String() {
|
|
63
69
|
return this.id.toString(16).padStart(62, "0");
|
|
64
70
|
}
|
|
@@ -120,10 +126,14 @@ var Quadkey = class _Quadkey {
|
|
|
120
126
|
return new _Quadkey().setId(id).setZoom(zoom);
|
|
121
127
|
}
|
|
122
128
|
static fromArrayBuffer(zoom, id) {
|
|
123
|
-
return new _Quadkey().setId(BigInt((0, import_hex.hexFromArrayBuffer)(id, {
|
|
129
|
+
return new _Quadkey().setId(BigInt((0, import_hex.hexFromArrayBuffer)(id, {
|
|
130
|
+
prefix: true
|
|
131
|
+
}))).setZoom(zoom);
|
|
124
132
|
}
|
|
125
133
|
static fromBase16String(value) {
|
|
126
|
-
return new _Quadkey(BigInt((0, import_hex.hexFromHexString)(value, {
|
|
134
|
+
return new _Quadkey(BigInt((0, import_hex.hexFromHexString)(value, {
|
|
135
|
+
prefix: true
|
|
136
|
+
})));
|
|
127
137
|
}
|
|
128
138
|
static fromBase4String(value) {
|
|
129
139
|
if (value === "fhr" || value === "" || value === void 0) {
|
|
@@ -165,11 +175,16 @@ var Quadkey = class _Quadkey {
|
|
|
165
175
|
}
|
|
166
176
|
childrenByZoom(zoom) {
|
|
167
177
|
if (zoom && zoom === this.zoom) {
|
|
168
|
-
return [
|
|
178
|
+
return [
|
|
179
|
+
this
|
|
180
|
+
];
|
|
169
181
|
}
|
|
170
182
|
let deepResult = [];
|
|
171
183
|
for (const quadkey of this.children) {
|
|
172
|
-
deepResult = [
|
|
184
|
+
deepResult = [
|
|
185
|
+
...deepResult,
|
|
186
|
+
...quadkey.childrenByZoom(zoom)
|
|
187
|
+
];
|
|
173
188
|
}
|
|
174
189
|
return deepResult;
|
|
175
190
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/Quadkey.ts","../../src/RelativeDirectionConstantLookup.ts"],"sourcesContent":["export * from './Quadkey'\n","import { assertEx } from '@xylabs/assert'\nimport { hexFromArrayBuffer, hexFromHexString } from '@xylabs/hex'\nimport {\n boundingBoxToCenter,\n GeoJson,\n MercatorBoundingBox,\n MercatorTile,\n tileFromPoint,\n tileFromQuadkey,\n tilesFromBoundingBox,\n tileToBoundingBox,\n tileToQuadkey,\n} from '@xyo-network/sdk-geo'\nimport { LngLat, LngLatLike } from 'mapbox-gl'\n\nimport { RelativeDirectionConstantLookup } from './RelativeDirectionConstantLookup'\n\nconst MAX_ZOOM = 124\n\nexport const isQuadkey = (obj: { type: string }) => obj?.type === Quadkey.type\n\nconst FULL_MASK = 2n ** 256n - 1n\nconst ZOOM_MASK = 0xffn << 248n\nconst ID_MASK = ZOOM_MASK ^ FULL_MASK\n\nconst assertMaxBitUint = (value: bigint, bits = 256n) => {\n assertEx(value < 2n ** bits && value >= 0, 'Not a 256 Bit Uint!')\n}\n\nexport class Quadkey {\n static Zero = Quadkey.from(0, 0n)\n static root = new Quadkey()\n static type = 'Quadkey'\n\n type = Quadkey.type\n\n private _geoJson?: GeoJson\n\n constructor(private key = 0n) {\n assertMaxBitUint(key)\n this.guessZoom()\n }\n\n get base16String() {\n return this.id.toString(16).padStart(62, '0')\n }\n\n get base4Hash() {\n return this.id.toString(4).padStart(this.zoom, '0')\n }\n\n get base4HashLabel() {\n const hash = this.base4Hash\n return hash.length === 0 ? 'fhr' : hash\n }\n\n get boundingBox(): MercatorBoundingBox {\n return tileToBoundingBox(this.tile)\n }\n\n get center() {\n const result = boundingBoxToCenter(this.boundingBox)\n return new LngLat(result[0], result[1])\n }\n\n get children() {\n assertEx(this.zoom < MAX_ZOOM - 1, 'Can not get children of bottom tiles')\n const result: Quadkey[] = []\n const shiftedId = this.id << 2n\n for (let i = 0n; i < 4n; i++) {\n result.push(new Quadkey().setId(shiftedId | i).setZoom(this.zoom + 1))\n }\n return result\n }\n\n get gridLocation() {\n const tileData = tileFromQuadkey(this.base4Hash)\n\n return {\n col: 2 ** tileData[2] - tileData[1] - 1,\n row: tileData[0],\n zoom: tileData[2],\n }\n }\n\n get id() {\n return this.key & ID_MASK\n }\n\n get parent(): Quadkey | undefined {\n if (this.zoom > 0) {\n return new Quadkey().setId(this.id >> 2n).setZoom(this.zoom - 1)\n }\n }\n\n get siblings() {\n const siblings = assertEx(this.parent?.children, `siblings: parentChildren ${this.base4Hash}`)\n const filteredSiblings = siblings.filter((quadkey) => quadkey.key !== this.key)\n assertEx(filteredSiblings.length === 3, `siblings: expected 3 [${filteredSiblings.length}]`)\n return filteredSiblings\n }\n\n get tile(): MercatorTile {\n return tileFromQuadkey(this.base4Hash)\n }\n\n get valid() {\n //check for additional data outside zoom scope\n return this.id.toString(4) === this.base4Hash.padStart(64, '0')\n }\n\n get zoom() {\n //zoom is stored in top byte\n return Number((this.key & ZOOM_MASK) >> 248n)\n }\n\n static from(zoom: number, id: bigint) {\n return new Quadkey().setId(id).setZoom(zoom)\n }\n\n static fromArrayBuffer(zoom: number, id: ArrayBuffer) {\n return new Quadkey().setId(BigInt(hexFromArrayBuffer(id, { prefix: true }))).setZoom(zoom)\n }\n\n static fromBase16String(value: string) {\n return new Quadkey(BigInt(hexFromHexString(value, { prefix: true })))\n }\n\n static fromBase4String(value?: string) {\n if (value === 'fhr' || value === '' || value === undefined) {\n return Quadkey.root\n }\n let id = 0n\n for (let i = 0; i < value.length; i++) {\n const nibble = Number.parseInt(value[i])\n assertEx(nibble < 4 && nibble >= 0, `Invalid Base4 String: ${value}`)\n id = (id << 2n) | BigInt(nibble)\n }\n return new Quadkey().setId(id).setZoom(value.length)\n }\n\n static fromBoundingBox(boundingBox: MercatorBoundingBox, zoom: number) {\n const tiles = tilesFromBoundingBox(boundingBox, Math.floor(zoom))\n const result: Quadkey[] = []\n for (const tile of tiles) {\n result.push(assertEx(Quadkey.fromTile(tile), 'Bad Quadkey'))\n }\n\n return result\n }\n\n static fromLngLat(point: LngLatLike, zoom: number) {\n const tile = tileFromPoint(LngLat.convert(point), zoom)\n const quadkeyString = tileToQuadkey(tile)\n return Quadkey.fromBase4String(quadkeyString)\n }\n\n static fromString(zoom: number, id: string, base = 16) {\n switch (base) {\n case 16: {\n return Quadkey.fromBase16String(id).setZoom(zoom)\n }\n default: {\n throw new Error(`Invalid base [${base}]`)\n }\n }\n }\n\n static fromTile(tile: MercatorTile) {\n return Quadkey.fromBase4String(tileToQuadkey(tile))\n }\n\n childrenByZoom(zoom: number) {\n // if we are limiting by zoom, and we are already at that limit, just return this quadkey\n if (zoom && zoom === this.zoom) {\n return [this]\n }\n\n // recursively get children\n let deepResult: Quadkey[] = []\n for (const quadkey of this.children) {\n deepResult = [...deepResult, ...quadkey.childrenByZoom(zoom)]\n }\n return deepResult\n }\n\n clone() {\n return new Quadkey(this.key)\n }\n\n equals(obj: Quadkey): boolean {\n return obj.key == this.key\n }\n\n geoJson() {\n this._geoJson = this._geoJson ?? new GeoJson(this.base4Hash)\n return this._geoJson\n }\n\n getGridBoundingBox(size: number) {\n const hash = this.base4Hash\n let index = 0\n let left = 0\n let top = 0\n let blockSize = size\n while (index < hash.length) {\n blockSize >>= 1\n switch (hash[index]) {\n case '1': {\n left += blockSize\n break\n }\n case '2': {\n top += blockSize\n break\n }\n case '3': {\n left += blockSize\n top += blockSize\n break\n }\n }\n index++\n }\n if (blockSize < 2) {\n blockSize = 2\n }\n return {\n height: blockSize,\n left,\n top,\n width: blockSize,\n }\n }\n\n /** @deprecated use .gridLocation instead */\n getGridLocation() {\n return this.gridLocation\n }\n\n isInBoundingBox(boundingBox: MercatorBoundingBox) {\n const tileBoundingBox = tileToBoundingBox(this.tile)\n return (\n boundingBox.contains(tileBoundingBox.getNorthEast()) ||\n boundingBox.contains(tileBoundingBox.getNorthWest()) ||\n boundingBox.contains(tileBoundingBox.getSouthEast()) ||\n boundingBox.contains(tileBoundingBox.getSouthWest())\n )\n }\n\n relative(direction: string) {\n const directionConstant = assertEx(RelativeDirectionConstantLookup[direction], 'Invalid direction')\n let quadkey = this.base4Hash\n if (quadkey.length === 0) {\n return this\n }\n let index = quadkey.length - 1\n while (index >= 0) {\n let number = Number.parseInt(quadkey.charAt(index))\n number += directionConstant\n if (number > 3) {\n number -= 4\n quadkey = quadkey.slice(0, Math.max(0, index)) + number.toString() + quadkey.slice(Math.max(0, index + 1))\n index--\n } else if (number < 0) {\n number += 4\n quadkey = quadkey.slice(0, Math.max(0, index)) + number.toString() + quadkey.slice(Math.max(0, index + 1))\n index--\n } else {\n index = -1\n }\n }\n return Quadkey.fromBase4String(quadkey)\n }\n\n setId(id: bigint) {\n assertMaxBitUint(id, 248n)\n this.setKey(this.zoom, id)\n return this\n }\n\n setKey(zoom: number, key: bigint) {\n assertMaxBitUint(key)\n this.key = key\n this.setZoom(zoom)\n return this\n }\n\n setZoom(zoom: number) {\n assertEx(zoom < MAX_ZOOM, `Invalid zoom [${zoom}] max=${MAX_ZOOM}`)\n this.key = (this.key & ID_MASK) | (BigInt(zoom) << 248n)\n return this\n }\n\n toJSON(): string {\n return this.base4HashLabel\n }\n\n toString() {\n return this.base4Hash\n }\n\n protected guessZoom() {\n const quadkeySimple = this.id.toString(4)\n this.setZoom(quadkeySimple.length)\n }\n}\n","export const RelativeDirectionConstantLookup: Record<string, number> = {\n e: 1,\n n: -2,\n s: 2,\n w: -1,\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/Quadkey.ts","../../src/RelativeDirectionConstantLookup.ts"],"sourcesContent":["export * from './Quadkey'\n","import { assertEx } from '@xylabs/assert'\nimport { hexFromArrayBuffer, hexFromHexString } from '@xylabs/hex'\nimport {\n boundingBoxToCenter,\n GeoJson,\n MercatorBoundingBox,\n MercatorTile,\n tileFromPoint,\n tileFromQuadkey,\n tilesFromBoundingBox,\n tileToBoundingBox,\n tileToQuadkey,\n} from '@xyo-network/sdk-geo'\nimport { LngLat, LngLatLike } from 'mapbox-gl'\n\nimport { RelativeDirectionConstantLookup } from './RelativeDirectionConstantLookup'\n\nconst MAX_ZOOM = 124\n\nexport const isQuadkey = (obj: { type: string }) => obj?.type === Quadkey.type\n\nconst FULL_MASK = 2n ** 256n - 1n\nconst ZOOM_MASK = 0xffn << 248n\nconst ID_MASK = ZOOM_MASK ^ FULL_MASK\n\nconst assertMaxBitUint = (value: bigint, bits = 256n) => {\n assertEx(value < 2n ** bits && value >= 0, 'Not a 256 Bit Uint!')\n}\n\nexport class Quadkey {\n static Zero = Quadkey.from(0, 0n)\n static root = new Quadkey()\n static type = 'Quadkey'\n\n type = Quadkey.type\n\n private _geoJson?: GeoJson\n\n constructor(private key = 0n) {\n assertMaxBitUint(key)\n this.guessZoom()\n }\n\n get base16String() {\n return this.id.toString(16).padStart(62, '0')\n }\n\n get base4Hash() {\n return this.id.toString(4).padStart(this.zoom, '0')\n }\n\n get base4HashLabel() {\n const hash = this.base4Hash\n return hash.length === 0 ? 'fhr' : hash\n }\n\n get boundingBox(): MercatorBoundingBox {\n return tileToBoundingBox(this.tile)\n }\n\n get center() {\n const result = boundingBoxToCenter(this.boundingBox)\n return new LngLat(result[0], result[1])\n }\n\n get children() {\n assertEx(this.zoom < MAX_ZOOM - 1, 'Can not get children of bottom tiles')\n const result: Quadkey[] = []\n const shiftedId = this.id << 2n\n for (let i = 0n; i < 4n; i++) {\n result.push(new Quadkey().setId(shiftedId | i).setZoom(this.zoom + 1))\n }\n return result\n }\n\n get gridLocation() {\n const tileData = tileFromQuadkey(this.base4Hash)\n\n return {\n col: 2 ** tileData[2] - tileData[1] - 1,\n row: tileData[0],\n zoom: tileData[2],\n }\n }\n\n get id() {\n return this.key & ID_MASK\n }\n\n get parent(): Quadkey | undefined {\n if (this.zoom > 0) {\n return new Quadkey().setId(this.id >> 2n).setZoom(this.zoom - 1)\n }\n }\n\n get siblings() {\n const siblings = assertEx(this.parent?.children, `siblings: parentChildren ${this.base4Hash}`)\n const filteredSiblings = siblings.filter((quadkey) => quadkey.key !== this.key)\n assertEx(filteredSiblings.length === 3, `siblings: expected 3 [${filteredSiblings.length}]`)\n return filteredSiblings\n }\n\n get tile(): MercatorTile {\n return tileFromQuadkey(this.base4Hash)\n }\n\n get valid() {\n //check for additional data outside zoom scope\n return this.id.toString(4) === this.base4Hash.padStart(64, '0')\n }\n\n get zoom() {\n //zoom is stored in top byte\n return Number((this.key & ZOOM_MASK) >> 248n)\n }\n\n static from(zoom: number, id: bigint) {\n return new Quadkey().setId(id).setZoom(zoom)\n }\n\n static fromArrayBuffer(zoom: number, id: ArrayBuffer) {\n return new Quadkey().setId(BigInt(hexFromArrayBuffer(id, { prefix: true }))).setZoom(zoom)\n }\n\n static fromBase16String(value: string) {\n return new Quadkey(BigInt(hexFromHexString(value, { prefix: true })))\n }\n\n static fromBase4String(value?: string) {\n if (value === 'fhr' || value === '' || value === undefined) {\n return Quadkey.root\n }\n let id = 0n\n for (let i = 0; i < value.length; i++) {\n const nibble = Number.parseInt(value[i])\n assertEx(nibble < 4 && nibble >= 0, `Invalid Base4 String: ${value}`)\n id = (id << 2n) | BigInt(nibble)\n }\n return new Quadkey().setId(id).setZoom(value.length)\n }\n\n static fromBoundingBox(boundingBox: MercatorBoundingBox, zoom: number) {\n const tiles = tilesFromBoundingBox(boundingBox, Math.floor(zoom))\n const result: Quadkey[] = []\n for (const tile of tiles) {\n result.push(assertEx(Quadkey.fromTile(tile), 'Bad Quadkey'))\n }\n\n return result\n }\n\n static fromLngLat(point: LngLatLike, zoom: number) {\n const tile = tileFromPoint(LngLat.convert(point), zoom)\n const quadkeyString = tileToQuadkey(tile)\n return Quadkey.fromBase4String(quadkeyString)\n }\n\n static fromString(zoom: number, id: string, base = 16) {\n switch (base) {\n case 16: {\n return Quadkey.fromBase16String(id).setZoom(zoom)\n }\n default: {\n throw new Error(`Invalid base [${base}]`)\n }\n }\n }\n\n static fromTile(tile: MercatorTile) {\n return Quadkey.fromBase4String(tileToQuadkey(tile))\n }\n\n childrenByZoom(zoom: number) {\n // if we are limiting by zoom, and we are already at that limit, just return this quadkey\n if (zoom && zoom === this.zoom) {\n return [this]\n }\n\n // recursively get children\n let deepResult: Quadkey[] = []\n for (const quadkey of this.children) {\n deepResult = [...deepResult, ...quadkey.childrenByZoom(zoom)]\n }\n return deepResult\n }\n\n clone() {\n return new Quadkey(this.key)\n }\n\n equals(obj: Quadkey): boolean {\n return obj.key == this.key\n }\n\n geoJson() {\n this._geoJson = this._geoJson ?? new GeoJson(this.base4Hash)\n return this._geoJson\n }\n\n getGridBoundingBox(size: number) {\n const hash = this.base4Hash\n let index = 0\n let left = 0\n let top = 0\n let blockSize = size\n while (index < hash.length) {\n blockSize >>= 1\n switch (hash[index]) {\n case '1': {\n left += blockSize\n break\n }\n case '2': {\n top += blockSize\n break\n }\n case '3': {\n left += blockSize\n top += blockSize\n break\n }\n }\n index++\n }\n if (blockSize < 2) {\n blockSize = 2\n }\n return {\n height: blockSize,\n left,\n top,\n width: blockSize,\n }\n }\n\n /** @deprecated use .gridLocation instead */\n getGridLocation() {\n return this.gridLocation\n }\n\n isInBoundingBox(boundingBox: MercatorBoundingBox) {\n const tileBoundingBox = tileToBoundingBox(this.tile)\n return (\n boundingBox.contains(tileBoundingBox.getNorthEast()) ||\n boundingBox.contains(tileBoundingBox.getNorthWest()) ||\n boundingBox.contains(tileBoundingBox.getSouthEast()) ||\n boundingBox.contains(tileBoundingBox.getSouthWest())\n )\n }\n\n relative(direction: string) {\n const directionConstant = assertEx(RelativeDirectionConstantLookup[direction], 'Invalid direction')\n let quadkey = this.base4Hash\n if (quadkey.length === 0) {\n return this\n }\n let index = quadkey.length - 1\n while (index >= 0) {\n let number = Number.parseInt(quadkey.charAt(index))\n number += directionConstant\n if (number > 3) {\n number -= 4\n quadkey = quadkey.slice(0, Math.max(0, index)) + number.toString() + quadkey.slice(Math.max(0, index + 1))\n index--\n } else if (number < 0) {\n number += 4\n quadkey = quadkey.slice(0, Math.max(0, index)) + number.toString() + quadkey.slice(Math.max(0, index + 1))\n index--\n } else {\n index = -1\n }\n }\n return Quadkey.fromBase4String(quadkey)\n }\n\n setId(id: bigint) {\n assertMaxBitUint(id, 248n)\n this.setKey(this.zoom, id)\n return this\n }\n\n setKey(zoom: number, key: bigint) {\n assertMaxBitUint(key)\n this.key = key\n this.setZoom(zoom)\n return this\n }\n\n setZoom(zoom: number) {\n assertEx(zoom < MAX_ZOOM, `Invalid zoom [${zoom}] max=${MAX_ZOOM}`)\n this.key = (this.key & ID_MASK) | (BigInt(zoom) << 248n)\n return this\n }\n\n toJSON(): string {\n return this.base4HashLabel\n }\n\n toString() {\n return this.base4Hash\n }\n\n protected guessZoom() {\n const quadkeySimple = this.id.toString(4)\n this.setZoom(quadkeySimple.length)\n }\n}\n","export const RelativeDirectionConstantLookup: Record<string, number> = {\n e: 1,\n n: -2,\n s: 2,\n w: -1,\n}\n"],"mappings":"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","names":["RelativeDirectionConstantLookup","e","n","s","w","MAX_ZOOM","isQuadkey","obj","type","Quadkey","FULL_MASK","ZOOM_MASK","ID_MASK","assertMaxBitUint","value","bits","assertEx","Zero","from","root","_geoJson","constructor","key","guessZoom","base16String","id","toString","padStart","base4Hash","zoom","base4HashLabel","hash","length","boundingBox","tileToBoundingBox","tile","center","result","boundingBoxToCenter","LngLat","children","shiftedId","i","push","setId","setZoom","gridLocation","tileData","tileFromQuadkey","col","row","parent","siblings","filteredSiblings","filter","quadkey","valid","Number","fromArrayBuffer","BigInt","hexFromArrayBuffer","prefix","fromBase16String","hexFromHexString","fromBase4String","undefined","nibble","parseInt","fromBoundingBox","tiles","tilesFromBoundingBox","Math","floor","fromTile","fromLngLat","point","tileFromPoint","convert","quadkeyString","tileToQuadkey","fromString","base","Error","childrenByZoom","deepResult","clone","equals","geoJson","GeoJson","getGridBoundingBox","size","index","left","top","blockSize","height","width","getGridLocation","isInBoundingBox","tileBoundingBox","contains","getNorthEast","getNorthWest","getSouthEast","getSouthWest","relative","direction","directionConstant","RelativeDirectionConstantLookup","number","charAt","slice","max","setKey","toJSON","quadkeySimple"]}
|
package/dist/browser/index.js
CHANGED
|
@@ -1,15 +1,10 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
|
|
1
4
|
// src/Quadkey.ts
|
|
2
5
|
import { assertEx } from "@xylabs/assert";
|
|
3
6
|
import { hexFromArrayBuffer, hexFromHexString } from "@xylabs/hex";
|
|
4
|
-
import {
|
|
5
|
-
boundingBoxToCenter,
|
|
6
|
-
GeoJson,
|
|
7
|
-
tileFromPoint,
|
|
8
|
-
tileFromQuadkey,
|
|
9
|
-
tilesFromBoundingBox,
|
|
10
|
-
tileToBoundingBox,
|
|
11
|
-
tileToQuadkey
|
|
12
|
-
} from "@xyo-network/sdk-geo";
|
|
7
|
+
import { boundingBoxToCenter, GeoJson, tileFromPoint, tileFromQuadkey, tilesFromBoundingBox, tileToBoundingBox, tileToQuadkey } from "@xyo-network/sdk-geo";
|
|
13
8
|
import { LngLat } from "mapbox-gl";
|
|
14
9
|
|
|
15
10
|
// src/RelativeDirectionConstantLookup.ts
|
|
@@ -22,24 +17,29 @@ var RelativeDirectionConstantLookup = {
|
|
|
22
17
|
|
|
23
18
|
// src/Quadkey.ts
|
|
24
19
|
var MAX_ZOOM = 124;
|
|
25
|
-
var isQuadkey = (obj) => obj?.type === Quadkey.type;
|
|
20
|
+
var isQuadkey = /* @__PURE__ */ __name((obj) => obj?.type === Quadkey.type, "isQuadkey");
|
|
26
21
|
var FULL_MASK = 2n ** 256n - 1n;
|
|
27
22
|
var ZOOM_MASK = 0xffn << 248n;
|
|
28
23
|
var ID_MASK = ZOOM_MASK ^ FULL_MASK;
|
|
29
|
-
var assertMaxBitUint = (value, bits = 256n) => {
|
|
24
|
+
var assertMaxBitUint = /* @__PURE__ */ __name((value, bits = 256n) => {
|
|
30
25
|
assertEx(value < 2n ** bits && value >= 0, "Not a 256 Bit Uint!");
|
|
31
|
-
};
|
|
26
|
+
}, "assertMaxBitUint");
|
|
32
27
|
var Quadkey = class _Quadkey {
|
|
33
|
-
|
|
34
|
-
this
|
|
35
|
-
assertMaxBitUint(key);
|
|
36
|
-
this.guessZoom();
|
|
28
|
+
static {
|
|
29
|
+
__name(this, "Quadkey");
|
|
37
30
|
}
|
|
31
|
+
key;
|
|
38
32
|
static Zero = _Quadkey.from(0, 0n);
|
|
39
33
|
static root = new _Quadkey();
|
|
40
34
|
static type = "Quadkey";
|
|
41
|
-
type
|
|
35
|
+
type;
|
|
42
36
|
_geoJson;
|
|
37
|
+
constructor(key = 0n) {
|
|
38
|
+
this.key = key;
|
|
39
|
+
this.type = _Quadkey.type;
|
|
40
|
+
assertMaxBitUint(key);
|
|
41
|
+
this.guessZoom();
|
|
42
|
+
}
|
|
43
43
|
get base16String() {
|
|
44
44
|
return this.id.toString(16).padStart(62, "0");
|
|
45
45
|
}
|
|
@@ -101,10 +101,14 @@ var Quadkey = class _Quadkey {
|
|
|
101
101
|
return new _Quadkey().setId(id).setZoom(zoom);
|
|
102
102
|
}
|
|
103
103
|
static fromArrayBuffer(zoom, id) {
|
|
104
|
-
return new _Quadkey().setId(BigInt(hexFromArrayBuffer(id, {
|
|
104
|
+
return new _Quadkey().setId(BigInt(hexFromArrayBuffer(id, {
|
|
105
|
+
prefix: true
|
|
106
|
+
}))).setZoom(zoom);
|
|
105
107
|
}
|
|
106
108
|
static fromBase16String(value) {
|
|
107
|
-
return new _Quadkey(BigInt(hexFromHexString(value, {
|
|
109
|
+
return new _Quadkey(BigInt(hexFromHexString(value, {
|
|
110
|
+
prefix: true
|
|
111
|
+
})));
|
|
108
112
|
}
|
|
109
113
|
static fromBase4String(value) {
|
|
110
114
|
if (value === "fhr" || value === "" || value === void 0) {
|
|
@@ -146,11 +150,16 @@ var Quadkey = class _Quadkey {
|
|
|
146
150
|
}
|
|
147
151
|
childrenByZoom(zoom) {
|
|
148
152
|
if (zoom && zoom === this.zoom) {
|
|
149
|
-
return [
|
|
153
|
+
return [
|
|
154
|
+
this
|
|
155
|
+
];
|
|
150
156
|
}
|
|
151
157
|
let deepResult = [];
|
|
152
158
|
for (const quadkey of this.children) {
|
|
153
|
-
deepResult = [
|
|
159
|
+
deepResult = [
|
|
160
|
+
...deepResult,
|
|
161
|
+
...quadkey.childrenByZoom(zoom)
|
|
162
|
+
];
|
|
154
163
|
}
|
|
155
164
|
return deepResult;
|
|
156
165
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Quadkey.ts","../../src/RelativeDirectionConstantLookup.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { hexFromArrayBuffer, hexFromHexString } from '@xylabs/hex'\nimport {\n boundingBoxToCenter,\n GeoJson,\n MercatorBoundingBox,\n MercatorTile,\n tileFromPoint,\n tileFromQuadkey,\n tilesFromBoundingBox,\n tileToBoundingBox,\n tileToQuadkey,\n} from '@xyo-network/sdk-geo'\nimport { LngLat, LngLatLike } from 'mapbox-gl'\n\nimport { RelativeDirectionConstantLookup } from './RelativeDirectionConstantLookup'\n\nconst MAX_ZOOM = 124\n\nexport const isQuadkey = (obj: { type: string }) => obj?.type === Quadkey.type\n\nconst FULL_MASK = 2n ** 256n - 1n\nconst ZOOM_MASK = 0xffn << 248n\nconst ID_MASK = ZOOM_MASK ^ FULL_MASK\n\nconst assertMaxBitUint = (value: bigint, bits = 256n) => {\n assertEx(value < 2n ** bits && value >= 0, 'Not a 256 Bit Uint!')\n}\n\nexport class Quadkey {\n static Zero = Quadkey.from(0, 0n)\n static root = new Quadkey()\n static type = 'Quadkey'\n\n type = Quadkey.type\n\n private _geoJson?: GeoJson\n\n constructor(private key = 0n) {\n assertMaxBitUint(key)\n this.guessZoom()\n }\n\n get base16String() {\n return this.id.toString(16).padStart(62, '0')\n }\n\n get base4Hash() {\n return this.id.toString(4).padStart(this.zoom, '0')\n }\n\n get base4HashLabel() {\n const hash = this.base4Hash\n return hash.length === 0 ? 'fhr' : hash\n }\n\n get boundingBox(): MercatorBoundingBox {\n return tileToBoundingBox(this.tile)\n }\n\n get center() {\n const result = boundingBoxToCenter(this.boundingBox)\n return new LngLat(result[0], result[1])\n }\n\n get children() {\n assertEx(this.zoom < MAX_ZOOM - 1, 'Can not get children of bottom tiles')\n const result: Quadkey[] = []\n const shiftedId = this.id << 2n\n for (let i = 0n; i < 4n; i++) {\n result.push(new Quadkey().setId(shiftedId | i).setZoom(this.zoom + 1))\n }\n return result\n }\n\n get gridLocation() {\n const tileData = tileFromQuadkey(this.base4Hash)\n\n return {\n col: 2 ** tileData[2] - tileData[1] - 1,\n row: tileData[0],\n zoom: tileData[2],\n }\n }\n\n get id() {\n return this.key & ID_MASK\n }\n\n get parent(): Quadkey | undefined {\n if (this.zoom > 0) {\n return new Quadkey().setId(this.id >> 2n).setZoom(this.zoom - 1)\n }\n }\n\n get siblings() {\n const siblings = assertEx(this.parent?.children, `siblings: parentChildren ${this.base4Hash}`)\n const filteredSiblings = siblings.filter((quadkey) => quadkey.key !== this.key)\n assertEx(filteredSiblings.length === 3, `siblings: expected 3 [${filteredSiblings.length}]`)\n return filteredSiblings\n }\n\n get tile(): MercatorTile {\n return tileFromQuadkey(this.base4Hash)\n }\n\n get valid() {\n //check for additional data outside zoom scope\n return this.id.toString(4) === this.base4Hash.padStart(64, '0')\n }\n\n get zoom() {\n //zoom is stored in top byte\n return Number((this.key & ZOOM_MASK) >> 248n)\n }\n\n static from(zoom: number, id: bigint) {\n return new Quadkey().setId(id).setZoom(zoom)\n }\n\n static fromArrayBuffer(zoom: number, id: ArrayBuffer) {\n return new Quadkey().setId(BigInt(hexFromArrayBuffer(id, { prefix: true }))).setZoom(zoom)\n }\n\n static fromBase16String(value: string) {\n return new Quadkey(BigInt(hexFromHexString(value, { prefix: true })))\n }\n\n static fromBase4String(value?: string) {\n if (value === 'fhr' || value === '' || value === undefined) {\n return Quadkey.root\n }\n let id = 0n\n for (let i = 0; i < value.length; i++) {\n const nibble = Number.parseInt(value[i])\n assertEx(nibble < 4 && nibble >= 0, `Invalid Base4 String: ${value}`)\n id = (id << 2n) | BigInt(nibble)\n }\n return new Quadkey().setId(id).setZoom(value.length)\n }\n\n static fromBoundingBox(boundingBox: MercatorBoundingBox, zoom: number) {\n const tiles = tilesFromBoundingBox(boundingBox, Math.floor(zoom))\n const result: Quadkey[] = []\n for (const tile of tiles) {\n result.push(assertEx(Quadkey.fromTile(tile), 'Bad Quadkey'))\n }\n\n return result\n }\n\n static fromLngLat(point: LngLatLike, zoom: number) {\n const tile = tileFromPoint(LngLat.convert(point), zoom)\n const quadkeyString = tileToQuadkey(tile)\n return Quadkey.fromBase4String(quadkeyString)\n }\n\n static fromString(zoom: number, id: string, base = 16) {\n switch (base) {\n case 16: {\n return Quadkey.fromBase16String(id).setZoom(zoom)\n }\n default: {\n throw new Error(`Invalid base [${base}]`)\n }\n }\n }\n\n static fromTile(tile: MercatorTile) {\n return Quadkey.fromBase4String(tileToQuadkey(tile))\n }\n\n childrenByZoom(zoom: number) {\n // if we are limiting by zoom, and we are already at that limit, just return this quadkey\n if (zoom && zoom === this.zoom) {\n return [this]\n }\n\n // recursively get children\n let deepResult: Quadkey[] = []\n for (const quadkey of this.children) {\n deepResult = [...deepResult, ...quadkey.childrenByZoom(zoom)]\n }\n return deepResult\n }\n\n clone() {\n return new Quadkey(this.key)\n }\n\n equals(obj: Quadkey): boolean {\n return obj.key == this.key\n }\n\n geoJson() {\n this._geoJson = this._geoJson ?? new GeoJson(this.base4Hash)\n return this._geoJson\n }\n\n getGridBoundingBox(size: number) {\n const hash = this.base4Hash\n let index = 0\n let left = 0\n let top = 0\n let blockSize = size\n while (index < hash.length) {\n blockSize >>= 1\n switch (hash[index]) {\n case '1': {\n left += blockSize\n break\n }\n case '2': {\n top += blockSize\n break\n }\n case '3': {\n left += blockSize\n top += blockSize\n break\n }\n }\n index++\n }\n if (blockSize < 2) {\n blockSize = 2\n }\n return {\n height: blockSize,\n left,\n top,\n width: blockSize,\n }\n }\n\n /** @deprecated use .gridLocation instead */\n getGridLocation() {\n return this.gridLocation\n }\n\n isInBoundingBox(boundingBox: MercatorBoundingBox) {\n const tileBoundingBox = tileToBoundingBox(this.tile)\n return (\n boundingBox.contains(tileBoundingBox.getNorthEast()) ||\n boundingBox.contains(tileBoundingBox.getNorthWest()) ||\n boundingBox.contains(tileBoundingBox.getSouthEast()) ||\n boundingBox.contains(tileBoundingBox.getSouthWest())\n )\n }\n\n relative(direction: string) {\n const directionConstant = assertEx(RelativeDirectionConstantLookup[direction], 'Invalid direction')\n let quadkey = this.base4Hash\n if (quadkey.length === 0) {\n return this\n }\n let index = quadkey.length - 1\n while (index >= 0) {\n let number = Number.parseInt(quadkey.charAt(index))\n number += directionConstant\n if (number > 3) {\n number -= 4\n quadkey = quadkey.slice(0, Math.max(0, index)) + number.toString() + quadkey.slice(Math.max(0, index + 1))\n index--\n } else if (number < 0) {\n number += 4\n quadkey = quadkey.slice(0, Math.max(0, index)) + number.toString() + quadkey.slice(Math.max(0, index + 1))\n index--\n } else {\n index = -1\n }\n }\n return Quadkey.fromBase4String(quadkey)\n }\n\n setId(id: bigint) {\n assertMaxBitUint(id, 248n)\n this.setKey(this.zoom, id)\n return this\n }\n\n setKey(zoom: number, key: bigint) {\n assertMaxBitUint(key)\n this.key = key\n this.setZoom(zoom)\n return this\n }\n\n setZoom(zoom: number) {\n assertEx(zoom < MAX_ZOOM, `Invalid zoom [${zoom}] max=${MAX_ZOOM}`)\n this.key = (this.key & ID_MASK) | (BigInt(zoom) << 248n)\n return this\n }\n\n toJSON(): string {\n return this.base4HashLabel\n }\n\n toString() {\n return this.base4Hash\n }\n\n protected guessZoom() {\n const quadkeySimple = this.id.toString(4)\n this.setZoom(quadkeySimple.length)\n }\n}\n","export const RelativeDirectionConstantLookup: Record<string, number> = {\n e: 1,\n n: -2,\n s: 2,\n w: -1,\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/Quadkey.ts","../../src/RelativeDirectionConstantLookup.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { hexFromArrayBuffer, hexFromHexString } from '@xylabs/hex'\nimport {\n boundingBoxToCenter,\n GeoJson,\n MercatorBoundingBox,\n MercatorTile,\n tileFromPoint,\n tileFromQuadkey,\n tilesFromBoundingBox,\n tileToBoundingBox,\n tileToQuadkey,\n} from '@xyo-network/sdk-geo'\nimport { LngLat, LngLatLike } from 'mapbox-gl'\n\nimport { RelativeDirectionConstantLookup } from './RelativeDirectionConstantLookup'\n\nconst MAX_ZOOM = 124\n\nexport const isQuadkey = (obj: { type: string }) => obj?.type === Quadkey.type\n\nconst FULL_MASK = 2n ** 256n - 1n\nconst ZOOM_MASK = 0xffn << 248n\nconst ID_MASK = ZOOM_MASK ^ FULL_MASK\n\nconst assertMaxBitUint = (value: bigint, bits = 256n) => {\n assertEx(value < 2n ** bits && value >= 0, 'Not a 256 Bit Uint!')\n}\n\nexport class Quadkey {\n static Zero = Quadkey.from(0, 0n)\n static root = new Quadkey()\n static type = 'Quadkey'\n\n type = Quadkey.type\n\n private _geoJson?: GeoJson\n\n constructor(private key = 0n) {\n assertMaxBitUint(key)\n this.guessZoom()\n }\n\n get base16String() {\n return this.id.toString(16).padStart(62, '0')\n }\n\n get base4Hash() {\n return this.id.toString(4).padStart(this.zoom, '0')\n }\n\n get base4HashLabel() {\n const hash = this.base4Hash\n return hash.length === 0 ? 'fhr' : hash\n }\n\n get boundingBox(): MercatorBoundingBox {\n return tileToBoundingBox(this.tile)\n }\n\n get center() {\n const result = boundingBoxToCenter(this.boundingBox)\n return new LngLat(result[0], result[1])\n }\n\n get children() {\n assertEx(this.zoom < MAX_ZOOM - 1, 'Can not get children of bottom tiles')\n const result: Quadkey[] = []\n const shiftedId = this.id << 2n\n for (let i = 0n; i < 4n; i++) {\n result.push(new Quadkey().setId(shiftedId | i).setZoom(this.zoom + 1))\n }\n return result\n }\n\n get gridLocation() {\n const tileData = tileFromQuadkey(this.base4Hash)\n\n return {\n col: 2 ** tileData[2] - tileData[1] - 1,\n row: tileData[0],\n zoom: tileData[2],\n }\n }\n\n get id() {\n return this.key & ID_MASK\n }\n\n get parent(): Quadkey | undefined {\n if (this.zoom > 0) {\n return new Quadkey().setId(this.id >> 2n).setZoom(this.zoom - 1)\n }\n }\n\n get siblings() {\n const siblings = assertEx(this.parent?.children, `siblings: parentChildren ${this.base4Hash}`)\n const filteredSiblings = siblings.filter((quadkey) => quadkey.key !== this.key)\n assertEx(filteredSiblings.length === 3, `siblings: expected 3 [${filteredSiblings.length}]`)\n return filteredSiblings\n }\n\n get tile(): MercatorTile {\n return tileFromQuadkey(this.base4Hash)\n }\n\n get valid() {\n //check for additional data outside zoom scope\n return this.id.toString(4) === this.base4Hash.padStart(64, '0')\n }\n\n get zoom() {\n //zoom is stored in top byte\n return Number((this.key & ZOOM_MASK) >> 248n)\n }\n\n static from(zoom: number, id: bigint) {\n return new Quadkey().setId(id).setZoom(zoom)\n }\n\n static fromArrayBuffer(zoom: number, id: ArrayBuffer) {\n return new Quadkey().setId(BigInt(hexFromArrayBuffer(id, { prefix: true }))).setZoom(zoom)\n }\n\n static fromBase16String(value: string) {\n return new Quadkey(BigInt(hexFromHexString(value, { prefix: true })))\n }\n\n static fromBase4String(value?: string) {\n if (value === 'fhr' || value === '' || value === undefined) {\n return Quadkey.root\n }\n let id = 0n\n for (let i = 0; i < value.length; i++) {\n const nibble = Number.parseInt(value[i])\n assertEx(nibble < 4 && nibble >= 0, `Invalid Base4 String: ${value}`)\n id = (id << 2n) | BigInt(nibble)\n }\n return new Quadkey().setId(id).setZoom(value.length)\n }\n\n static fromBoundingBox(boundingBox: MercatorBoundingBox, zoom: number) {\n const tiles = tilesFromBoundingBox(boundingBox, Math.floor(zoom))\n const result: Quadkey[] = []\n for (const tile of tiles) {\n result.push(assertEx(Quadkey.fromTile(tile), 'Bad Quadkey'))\n }\n\n return result\n }\n\n static fromLngLat(point: LngLatLike, zoom: number) {\n const tile = tileFromPoint(LngLat.convert(point), zoom)\n const quadkeyString = tileToQuadkey(tile)\n return Quadkey.fromBase4String(quadkeyString)\n }\n\n static fromString(zoom: number, id: string, base = 16) {\n switch (base) {\n case 16: {\n return Quadkey.fromBase16String(id).setZoom(zoom)\n }\n default: {\n throw new Error(`Invalid base [${base}]`)\n }\n }\n }\n\n static fromTile(tile: MercatorTile) {\n return Quadkey.fromBase4String(tileToQuadkey(tile))\n }\n\n childrenByZoom(zoom: number) {\n // if we are limiting by zoom, and we are already at that limit, just return this quadkey\n if (zoom && zoom === this.zoom) {\n return [this]\n }\n\n // recursively get children\n let deepResult: Quadkey[] = []\n for (const quadkey of this.children) {\n deepResult = [...deepResult, ...quadkey.childrenByZoom(zoom)]\n }\n return deepResult\n }\n\n clone() {\n return new Quadkey(this.key)\n }\n\n equals(obj: Quadkey): boolean {\n return obj.key == this.key\n }\n\n geoJson() {\n this._geoJson = this._geoJson ?? new GeoJson(this.base4Hash)\n return this._geoJson\n }\n\n getGridBoundingBox(size: number) {\n const hash = this.base4Hash\n let index = 0\n let left = 0\n let top = 0\n let blockSize = size\n while (index < hash.length) {\n blockSize >>= 1\n switch (hash[index]) {\n case '1': {\n left += blockSize\n break\n }\n case '2': {\n top += blockSize\n break\n }\n case '3': {\n left += blockSize\n top += blockSize\n break\n }\n }\n index++\n }\n if (blockSize < 2) {\n blockSize = 2\n }\n return {\n height: blockSize,\n left,\n top,\n width: blockSize,\n }\n }\n\n /** @deprecated use .gridLocation instead */\n getGridLocation() {\n return this.gridLocation\n }\n\n isInBoundingBox(boundingBox: MercatorBoundingBox) {\n const tileBoundingBox = tileToBoundingBox(this.tile)\n return (\n boundingBox.contains(tileBoundingBox.getNorthEast()) ||\n boundingBox.contains(tileBoundingBox.getNorthWest()) ||\n boundingBox.contains(tileBoundingBox.getSouthEast()) ||\n boundingBox.contains(tileBoundingBox.getSouthWest())\n )\n }\n\n relative(direction: string) {\n const directionConstant = assertEx(RelativeDirectionConstantLookup[direction], 'Invalid direction')\n let quadkey = this.base4Hash\n if (quadkey.length === 0) {\n return this\n }\n let index = quadkey.length - 1\n while (index >= 0) {\n let number = Number.parseInt(quadkey.charAt(index))\n number += directionConstant\n if (number > 3) {\n number -= 4\n quadkey = quadkey.slice(0, Math.max(0, index)) + number.toString() + quadkey.slice(Math.max(0, index + 1))\n index--\n } else if (number < 0) {\n number += 4\n quadkey = quadkey.slice(0, Math.max(0, index)) + number.toString() + quadkey.slice(Math.max(0, index + 1))\n index--\n } else {\n index = -1\n }\n }\n return Quadkey.fromBase4String(quadkey)\n }\n\n setId(id: bigint) {\n assertMaxBitUint(id, 248n)\n this.setKey(this.zoom, id)\n return this\n }\n\n setKey(zoom: number, key: bigint) {\n assertMaxBitUint(key)\n this.key = key\n this.setZoom(zoom)\n return this\n }\n\n setZoom(zoom: number) {\n assertEx(zoom < MAX_ZOOM, `Invalid zoom [${zoom}] max=${MAX_ZOOM}`)\n this.key = (this.key & ID_MASK) | (BigInt(zoom) << 248n)\n return this\n }\n\n toJSON(): string {\n return this.base4HashLabel\n }\n\n toString() {\n return this.base4Hash\n }\n\n protected guessZoom() {\n const quadkeySimple = this.id.toString(4)\n this.setZoom(quadkeySimple.length)\n }\n}\n","export const RelativeDirectionConstantLookup: Record<string, number> = {\n e: 1,\n n: -2,\n s: 2,\n w: -1,\n}\n"],"mappings":"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","names":["assertEx","hexFromArrayBuffer","hexFromHexString","boundingBoxToCenter","GeoJson","tileFromPoint","tileFromQuadkey","tilesFromBoundingBox","tileToBoundingBox","tileToQuadkey","LngLat","RelativeDirectionConstantLookup","e","n","s","w","MAX_ZOOM","isQuadkey","obj","type","Quadkey","FULL_MASK","ZOOM_MASK","ID_MASK","assertMaxBitUint","value","bits","assertEx","Zero","from","root","_geoJson","constructor","key","guessZoom","base16String","id","toString","padStart","base4Hash","zoom","base4HashLabel","hash","length","boundingBox","tileToBoundingBox","tile","center","result","boundingBoxToCenter","LngLat","children","shiftedId","i","push","setId","setZoom","gridLocation","tileData","tileFromQuadkey","col","row","parent","siblings","filteredSiblings","filter","quadkey","valid","Number","fromArrayBuffer","BigInt","hexFromArrayBuffer","prefix","fromBase16String","hexFromHexString","fromBase4String","undefined","nibble","parseInt","fromBoundingBox","tiles","tilesFromBoundingBox","Math","floor","fromTile","fromLngLat","point","tileFromPoint","convert","quadkeyString","tileToQuadkey","fromString","base","Error","childrenByZoom","deepResult","clone","equals","geoJson","GeoJson","getGridBoundingBox","size","index","left","top","blockSize","height","width","getGridLocation","isInBoundingBox","tileBoundingBox","contains","getNorthEast","getNorthWest","getSouthEast","getSouthWest","relative","direction","directionConstant","RelativeDirectionConstantLookup","number","charAt","slice","max","setKey","toJSON","quadkeySimple"]}
|
package/dist/node/index.cjs
CHANGED
|
@@ -3,6 +3,8 @@ var __defProp = Object.defineProperty;
|
|
|
3
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
5
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
7
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
6
8
|
var __export = (target, all) => {
|
|
7
9
|
for (var name in all)
|
|
8
10
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -16,6 +18,10 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
18
|
return to;
|
|
17
19
|
};
|
|
18
20
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
21
|
+
var __publicField = (obj, key, value) => {
|
|
22
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
23
|
+
return value;
|
|
24
|
+
};
|
|
19
25
|
|
|
20
26
|
// src/index.ts
|
|
21
27
|
var src_exports = {};
|
|
@@ -41,24 +47,23 @@ var RelativeDirectionConstantLookup = {
|
|
|
41
47
|
|
|
42
48
|
// src/Quadkey.ts
|
|
43
49
|
var MAX_ZOOM = 124;
|
|
44
|
-
var isQuadkey = (obj) => (obj == null ? void 0 : obj.type) === Quadkey.type;
|
|
50
|
+
var isQuadkey = /* @__PURE__ */ __name((obj) => (obj == null ? void 0 : obj.type) === Quadkey.type, "isQuadkey");
|
|
45
51
|
var FULL_MASK = 2n ** 256n - 1n;
|
|
46
52
|
var ZOOM_MASK = 0xffn << 248n;
|
|
47
53
|
var ID_MASK = ZOOM_MASK ^ FULL_MASK;
|
|
48
|
-
var assertMaxBitUint = (value, bits = 256n) => {
|
|
54
|
+
var assertMaxBitUint = /* @__PURE__ */ __name((value, bits = 256n) => {
|
|
49
55
|
(0, import_assert.assertEx)(value < 2n ** bits && value >= 0, "Not a 256 Bit Uint!");
|
|
50
|
-
};
|
|
51
|
-
var
|
|
56
|
+
}, "assertMaxBitUint");
|
|
57
|
+
var _Quadkey = class _Quadkey {
|
|
58
|
+
key;
|
|
59
|
+
type;
|
|
60
|
+
_geoJson;
|
|
52
61
|
constructor(key = 0n) {
|
|
53
62
|
this.key = key;
|
|
63
|
+
this.type = _Quadkey.type;
|
|
54
64
|
assertMaxBitUint(key);
|
|
55
65
|
this.guessZoom();
|
|
56
66
|
}
|
|
57
|
-
static Zero = _Quadkey.from(0, 0n);
|
|
58
|
-
static root = new _Quadkey();
|
|
59
|
-
static type = "Quadkey";
|
|
60
|
-
type = _Quadkey.type;
|
|
61
|
-
_geoJson;
|
|
62
67
|
get base16String() {
|
|
63
68
|
return this.id.toString(16).padStart(62, "0");
|
|
64
69
|
}
|
|
@@ -121,10 +126,14 @@ var Quadkey = class _Quadkey {
|
|
|
121
126
|
return new _Quadkey().setId(id).setZoom(zoom);
|
|
122
127
|
}
|
|
123
128
|
static fromArrayBuffer(zoom, id) {
|
|
124
|
-
return new _Quadkey().setId(BigInt((0, import_hex.hexFromArrayBuffer)(id, {
|
|
129
|
+
return new _Quadkey().setId(BigInt((0, import_hex.hexFromArrayBuffer)(id, {
|
|
130
|
+
prefix: true
|
|
131
|
+
}))).setZoom(zoom);
|
|
125
132
|
}
|
|
126
133
|
static fromBase16String(value) {
|
|
127
|
-
return new _Quadkey(BigInt((0, import_hex.hexFromHexString)(value, {
|
|
134
|
+
return new _Quadkey(BigInt((0, import_hex.hexFromHexString)(value, {
|
|
135
|
+
prefix: true
|
|
136
|
+
})));
|
|
128
137
|
}
|
|
129
138
|
static fromBase4String(value) {
|
|
130
139
|
if (value === "fhr" || value === "" || value === void 0) {
|
|
@@ -166,11 +175,16 @@ var Quadkey = class _Quadkey {
|
|
|
166
175
|
}
|
|
167
176
|
childrenByZoom(zoom) {
|
|
168
177
|
if (zoom && zoom === this.zoom) {
|
|
169
|
-
return [
|
|
178
|
+
return [
|
|
179
|
+
this
|
|
180
|
+
];
|
|
170
181
|
}
|
|
171
182
|
let deepResult = [];
|
|
172
183
|
for (const quadkey of this.children) {
|
|
173
|
-
deepResult = [
|
|
184
|
+
deepResult = [
|
|
185
|
+
...deepResult,
|
|
186
|
+
...quadkey.childrenByZoom(zoom)
|
|
187
|
+
];
|
|
174
188
|
}
|
|
175
189
|
return deepResult;
|
|
176
190
|
}
|
|
@@ -278,6 +292,11 @@ var Quadkey = class _Quadkey {
|
|
|
278
292
|
this.setZoom(quadkeySimple.length);
|
|
279
293
|
}
|
|
280
294
|
};
|
|
295
|
+
__name(_Quadkey, "Quadkey");
|
|
296
|
+
__publicField(_Quadkey, "Zero", _Quadkey.from(0, 0n));
|
|
297
|
+
__publicField(_Quadkey, "root", new _Quadkey());
|
|
298
|
+
__publicField(_Quadkey, "type", "Quadkey");
|
|
299
|
+
var Quadkey = _Quadkey;
|
|
281
300
|
// Annotate the CommonJS export names for ESM import in node:
|
|
282
301
|
0 && (module.exports = {
|
|
283
302
|
Quadkey,
|
package/dist/node/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/Quadkey.ts","../../src/RelativeDirectionConstantLookup.ts"],"sourcesContent":["export * from './Quadkey'\n","import { assertEx } from '@xylabs/assert'\nimport { hexFromArrayBuffer, hexFromHexString } from '@xylabs/hex'\nimport {\n boundingBoxToCenter,\n GeoJson,\n MercatorBoundingBox,\n MercatorTile,\n tileFromPoint,\n tileFromQuadkey,\n tilesFromBoundingBox,\n tileToBoundingBox,\n tileToQuadkey,\n} from '@xyo-network/sdk-geo'\nimport { LngLat, LngLatLike } from 'mapbox-gl'\n\nimport { RelativeDirectionConstantLookup } from './RelativeDirectionConstantLookup'\n\nconst MAX_ZOOM = 124\n\nexport const isQuadkey = (obj: { type: string }) => obj?.type === Quadkey.type\n\nconst FULL_MASK = 2n ** 256n - 1n\nconst ZOOM_MASK = 0xffn << 248n\nconst ID_MASK = ZOOM_MASK ^ FULL_MASK\n\nconst assertMaxBitUint = (value: bigint, bits = 256n) => {\n assertEx(value < 2n ** bits && value >= 0, 'Not a 256 Bit Uint!')\n}\n\nexport class Quadkey {\n static Zero = Quadkey.from(0, 0n)\n static root = new Quadkey()\n static type = 'Quadkey'\n\n type = Quadkey.type\n\n private _geoJson?: GeoJson\n\n constructor(private key = 0n) {\n assertMaxBitUint(key)\n this.guessZoom()\n }\n\n get base16String() {\n return this.id.toString(16).padStart(62, '0')\n }\n\n get base4Hash() {\n return this.id.toString(4).padStart(this.zoom, '0')\n }\n\n get base4HashLabel() {\n const hash = this.base4Hash\n return hash.length === 0 ? 'fhr' : hash\n }\n\n get boundingBox(): MercatorBoundingBox {\n return tileToBoundingBox(this.tile)\n }\n\n get center() {\n const result = boundingBoxToCenter(this.boundingBox)\n return new LngLat(result[0], result[1])\n }\n\n get children() {\n assertEx(this.zoom < MAX_ZOOM - 1, 'Can not get children of bottom tiles')\n const result: Quadkey[] = []\n const shiftedId = this.id << 2n\n for (let i = 0n; i < 4n; i++) {\n result.push(new Quadkey().setId(shiftedId | i).setZoom(this.zoom + 1))\n }\n return result\n }\n\n get gridLocation() {\n const tileData = tileFromQuadkey(this.base4Hash)\n\n return {\n col: 2 ** tileData[2] - tileData[1] - 1,\n row: tileData[0],\n zoom: tileData[2],\n }\n }\n\n get id() {\n return this.key & ID_MASK\n }\n\n get parent(): Quadkey | undefined {\n if (this.zoom > 0) {\n return new Quadkey().setId(this.id >> 2n).setZoom(this.zoom - 1)\n }\n }\n\n get siblings() {\n const siblings = assertEx(this.parent?.children, `siblings: parentChildren ${this.base4Hash}`)\n const filteredSiblings = siblings.filter((quadkey) => quadkey.key !== this.key)\n assertEx(filteredSiblings.length === 3, `siblings: expected 3 [${filteredSiblings.length}]`)\n return filteredSiblings\n }\n\n get tile(): MercatorTile {\n return tileFromQuadkey(this.base4Hash)\n }\n\n get valid() {\n //check for additional data outside zoom scope\n return this.id.toString(4) === this.base4Hash.padStart(64, '0')\n }\n\n get zoom() {\n //zoom is stored in top byte\n return Number((this.key & ZOOM_MASK) >> 248n)\n }\n\n static from(zoom: number, id: bigint) {\n return new Quadkey().setId(id).setZoom(zoom)\n }\n\n static fromArrayBuffer(zoom: number, id: ArrayBuffer) {\n return new Quadkey().setId(BigInt(hexFromArrayBuffer(id, { prefix: true }))).setZoom(zoom)\n }\n\n static fromBase16String(value: string) {\n return new Quadkey(BigInt(hexFromHexString(value, { prefix: true })))\n }\n\n static fromBase4String(value?: string) {\n if (value === 'fhr' || value === '' || value === undefined) {\n return Quadkey.root\n }\n let id = 0n\n for (let i = 0; i < value.length; i++) {\n const nibble = Number.parseInt(value[i])\n assertEx(nibble < 4 && nibble >= 0, `Invalid Base4 String: ${value}`)\n id = (id << 2n) | BigInt(nibble)\n }\n return new Quadkey().setId(id).setZoom(value.length)\n }\n\n static fromBoundingBox(boundingBox: MercatorBoundingBox, zoom: number) {\n const tiles = tilesFromBoundingBox(boundingBox, Math.floor(zoom))\n const result: Quadkey[] = []\n for (const tile of tiles) {\n result.push(assertEx(Quadkey.fromTile(tile), 'Bad Quadkey'))\n }\n\n return result\n }\n\n static fromLngLat(point: LngLatLike, zoom: number) {\n const tile = tileFromPoint(LngLat.convert(point), zoom)\n const quadkeyString = tileToQuadkey(tile)\n return Quadkey.fromBase4String(quadkeyString)\n }\n\n static fromString(zoom: number, id: string, base = 16) {\n switch (base) {\n case 16: {\n return Quadkey.fromBase16String(id).setZoom(zoom)\n }\n default: {\n throw new Error(`Invalid base [${base}]`)\n }\n }\n }\n\n static fromTile(tile: MercatorTile) {\n return Quadkey.fromBase4String(tileToQuadkey(tile))\n }\n\n childrenByZoom(zoom: number) {\n // if we are limiting by zoom, and we are already at that limit, just return this quadkey\n if (zoom && zoom === this.zoom) {\n return [this]\n }\n\n // recursively get children\n let deepResult: Quadkey[] = []\n for (const quadkey of this.children) {\n deepResult = [...deepResult, ...quadkey.childrenByZoom(zoom)]\n }\n return deepResult\n }\n\n clone() {\n return new Quadkey(this.key)\n }\n\n equals(obj: Quadkey): boolean {\n return obj.key == this.key\n }\n\n geoJson() {\n this._geoJson = this._geoJson ?? new GeoJson(this.base4Hash)\n return this._geoJson\n }\n\n getGridBoundingBox(size: number) {\n const hash = this.base4Hash\n let index = 0\n let left = 0\n let top = 0\n let blockSize = size\n while (index < hash.length) {\n blockSize >>= 1\n switch (hash[index]) {\n case '1': {\n left += blockSize\n break\n }\n case '2': {\n top += blockSize\n break\n }\n case '3': {\n left += blockSize\n top += blockSize\n break\n }\n }\n index++\n }\n if (blockSize < 2) {\n blockSize = 2\n }\n return {\n height: blockSize,\n left,\n top,\n width: blockSize,\n }\n }\n\n /** @deprecated use .gridLocation instead */\n getGridLocation() {\n return this.gridLocation\n }\n\n isInBoundingBox(boundingBox: MercatorBoundingBox) {\n const tileBoundingBox = tileToBoundingBox(this.tile)\n return (\n boundingBox.contains(tileBoundingBox.getNorthEast()) ||\n boundingBox.contains(tileBoundingBox.getNorthWest()) ||\n boundingBox.contains(tileBoundingBox.getSouthEast()) ||\n boundingBox.contains(tileBoundingBox.getSouthWest())\n )\n }\n\n relative(direction: string) {\n const directionConstant = assertEx(RelativeDirectionConstantLookup[direction], 'Invalid direction')\n let quadkey = this.base4Hash\n if (quadkey.length === 0) {\n return this\n }\n let index = quadkey.length - 1\n while (index >= 0) {\n let number = Number.parseInt(quadkey.charAt(index))\n number += directionConstant\n if (number > 3) {\n number -= 4\n quadkey = quadkey.slice(0, Math.max(0, index)) + number.toString() + quadkey.slice(Math.max(0, index + 1))\n index--\n } else if (number < 0) {\n number += 4\n quadkey = quadkey.slice(0, Math.max(0, index)) + number.toString() + quadkey.slice(Math.max(0, index + 1))\n index--\n } else {\n index = -1\n }\n }\n return Quadkey.fromBase4String(quadkey)\n }\n\n setId(id: bigint) {\n assertMaxBitUint(id, 248n)\n this.setKey(this.zoom, id)\n return this\n }\n\n setKey(zoom: number, key: bigint) {\n assertMaxBitUint(key)\n this.key = key\n this.setZoom(zoom)\n return this\n }\n\n setZoom(zoom: number) {\n assertEx(zoom < MAX_ZOOM, `Invalid zoom [${zoom}] max=${MAX_ZOOM}`)\n this.key = (this.key & ID_MASK) | (BigInt(zoom) << 248n)\n return this\n }\n\n toJSON(): string {\n return this.base4HashLabel\n }\n\n toString() {\n return this.base4Hash\n }\n\n protected guessZoom() {\n const quadkeySimple = this.id.toString(4)\n this.setZoom(quadkeySimple.length)\n }\n}\n","export const RelativeDirectionConstantLookup: Record<string, number> = {\n e: 1,\n n: -2,\n s: 2,\n w: -1,\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/Quadkey.ts","../../src/RelativeDirectionConstantLookup.ts"],"sourcesContent":["export * from './Quadkey'\n","import { assertEx } from '@xylabs/assert'\nimport { hexFromArrayBuffer, hexFromHexString } from '@xylabs/hex'\nimport {\n boundingBoxToCenter,\n GeoJson,\n MercatorBoundingBox,\n MercatorTile,\n tileFromPoint,\n tileFromQuadkey,\n tilesFromBoundingBox,\n tileToBoundingBox,\n tileToQuadkey,\n} from '@xyo-network/sdk-geo'\nimport { LngLat, LngLatLike } from 'mapbox-gl'\n\nimport { RelativeDirectionConstantLookup } from './RelativeDirectionConstantLookup'\n\nconst MAX_ZOOM = 124\n\nexport const isQuadkey = (obj: { type: string }) => obj?.type === Quadkey.type\n\nconst FULL_MASK = 2n ** 256n - 1n\nconst ZOOM_MASK = 0xffn << 248n\nconst ID_MASK = ZOOM_MASK ^ FULL_MASK\n\nconst assertMaxBitUint = (value: bigint, bits = 256n) => {\n assertEx(value < 2n ** bits && value >= 0, 'Not a 256 Bit Uint!')\n}\n\nexport class Quadkey {\n static Zero = Quadkey.from(0, 0n)\n static root = new Quadkey()\n static type = 'Quadkey'\n\n type = Quadkey.type\n\n private _geoJson?: GeoJson\n\n constructor(private key = 0n) {\n assertMaxBitUint(key)\n this.guessZoom()\n }\n\n get base16String() {\n return this.id.toString(16).padStart(62, '0')\n }\n\n get base4Hash() {\n return this.id.toString(4).padStart(this.zoom, '0')\n }\n\n get base4HashLabel() {\n const hash = this.base4Hash\n return hash.length === 0 ? 'fhr' : hash\n }\n\n get boundingBox(): MercatorBoundingBox {\n return tileToBoundingBox(this.tile)\n }\n\n get center() {\n const result = boundingBoxToCenter(this.boundingBox)\n return new LngLat(result[0], result[1])\n }\n\n get children() {\n assertEx(this.zoom < MAX_ZOOM - 1, 'Can not get children of bottom tiles')\n const result: Quadkey[] = []\n const shiftedId = this.id << 2n\n for (let i = 0n; i < 4n; i++) {\n result.push(new Quadkey().setId(shiftedId | i).setZoom(this.zoom + 1))\n }\n return result\n }\n\n get gridLocation() {\n const tileData = tileFromQuadkey(this.base4Hash)\n\n return {\n col: 2 ** tileData[2] - tileData[1] - 1,\n row: tileData[0],\n zoom: tileData[2],\n }\n }\n\n get id() {\n return this.key & ID_MASK\n }\n\n get parent(): Quadkey | undefined {\n if (this.zoom > 0) {\n return new Quadkey().setId(this.id >> 2n).setZoom(this.zoom - 1)\n }\n }\n\n get siblings() {\n const siblings = assertEx(this.parent?.children, `siblings: parentChildren ${this.base4Hash}`)\n const filteredSiblings = siblings.filter((quadkey) => quadkey.key !== this.key)\n assertEx(filteredSiblings.length === 3, `siblings: expected 3 [${filteredSiblings.length}]`)\n return filteredSiblings\n }\n\n get tile(): MercatorTile {\n return tileFromQuadkey(this.base4Hash)\n }\n\n get valid() {\n //check for additional data outside zoom scope\n return this.id.toString(4) === this.base4Hash.padStart(64, '0')\n }\n\n get zoom() {\n //zoom is stored in top byte\n return Number((this.key & ZOOM_MASK) >> 248n)\n }\n\n static from(zoom: number, id: bigint) {\n return new Quadkey().setId(id).setZoom(zoom)\n }\n\n static fromArrayBuffer(zoom: number, id: ArrayBuffer) {\n return new Quadkey().setId(BigInt(hexFromArrayBuffer(id, { prefix: true }))).setZoom(zoom)\n }\n\n static fromBase16String(value: string) {\n return new Quadkey(BigInt(hexFromHexString(value, { prefix: true })))\n }\n\n static fromBase4String(value?: string) {\n if (value === 'fhr' || value === '' || value === undefined) {\n return Quadkey.root\n }\n let id = 0n\n for (let i = 0; i < value.length; i++) {\n const nibble = Number.parseInt(value[i])\n assertEx(nibble < 4 && nibble >= 0, `Invalid Base4 String: ${value}`)\n id = (id << 2n) | BigInt(nibble)\n }\n return new Quadkey().setId(id).setZoom(value.length)\n }\n\n static fromBoundingBox(boundingBox: MercatorBoundingBox, zoom: number) {\n const tiles = tilesFromBoundingBox(boundingBox, Math.floor(zoom))\n const result: Quadkey[] = []\n for (const tile of tiles) {\n result.push(assertEx(Quadkey.fromTile(tile), 'Bad Quadkey'))\n }\n\n return result\n }\n\n static fromLngLat(point: LngLatLike, zoom: number) {\n const tile = tileFromPoint(LngLat.convert(point), zoom)\n const quadkeyString = tileToQuadkey(tile)\n return Quadkey.fromBase4String(quadkeyString)\n }\n\n static fromString(zoom: number, id: string, base = 16) {\n switch (base) {\n case 16: {\n return Quadkey.fromBase16String(id).setZoom(zoom)\n }\n default: {\n throw new Error(`Invalid base [${base}]`)\n }\n }\n }\n\n static fromTile(tile: MercatorTile) {\n return Quadkey.fromBase4String(tileToQuadkey(tile))\n }\n\n childrenByZoom(zoom: number) {\n // if we are limiting by zoom, and we are already at that limit, just return this quadkey\n if (zoom && zoom === this.zoom) {\n return [this]\n }\n\n // recursively get children\n let deepResult: Quadkey[] = []\n for (const quadkey of this.children) {\n deepResult = [...deepResult, ...quadkey.childrenByZoom(zoom)]\n }\n return deepResult\n }\n\n clone() {\n return new Quadkey(this.key)\n }\n\n equals(obj: Quadkey): boolean {\n return obj.key == this.key\n }\n\n geoJson() {\n this._geoJson = this._geoJson ?? new GeoJson(this.base4Hash)\n return this._geoJson\n }\n\n getGridBoundingBox(size: number) {\n const hash = this.base4Hash\n let index = 0\n let left = 0\n let top = 0\n let blockSize = size\n while (index < hash.length) {\n blockSize >>= 1\n switch (hash[index]) {\n case '1': {\n left += blockSize\n break\n }\n case '2': {\n top += blockSize\n break\n }\n case '3': {\n left += blockSize\n top += blockSize\n break\n }\n }\n index++\n }\n if (blockSize < 2) {\n blockSize = 2\n }\n return {\n height: blockSize,\n left,\n top,\n width: blockSize,\n }\n }\n\n /** @deprecated use .gridLocation instead */\n getGridLocation() {\n return this.gridLocation\n }\n\n isInBoundingBox(boundingBox: MercatorBoundingBox) {\n const tileBoundingBox = tileToBoundingBox(this.tile)\n return (\n boundingBox.contains(tileBoundingBox.getNorthEast()) ||\n boundingBox.contains(tileBoundingBox.getNorthWest()) ||\n boundingBox.contains(tileBoundingBox.getSouthEast()) ||\n boundingBox.contains(tileBoundingBox.getSouthWest())\n )\n }\n\n relative(direction: string) {\n const directionConstant = assertEx(RelativeDirectionConstantLookup[direction], 'Invalid direction')\n let quadkey = this.base4Hash\n if (quadkey.length === 0) {\n return this\n }\n let index = quadkey.length - 1\n while (index >= 0) {\n let number = Number.parseInt(quadkey.charAt(index))\n number += directionConstant\n if (number > 3) {\n number -= 4\n quadkey = quadkey.slice(0, Math.max(0, index)) + number.toString() + quadkey.slice(Math.max(0, index + 1))\n index--\n } else if (number < 0) {\n number += 4\n quadkey = quadkey.slice(0, Math.max(0, index)) + number.toString() + quadkey.slice(Math.max(0, index + 1))\n index--\n } else {\n index = -1\n }\n }\n return Quadkey.fromBase4String(quadkey)\n }\n\n setId(id: bigint) {\n assertMaxBitUint(id, 248n)\n this.setKey(this.zoom, id)\n return this\n }\n\n setKey(zoom: number, key: bigint) {\n assertMaxBitUint(key)\n this.key = key\n this.setZoom(zoom)\n return this\n }\n\n setZoom(zoom: number) {\n assertEx(zoom < MAX_ZOOM, `Invalid zoom [${zoom}] max=${MAX_ZOOM}`)\n this.key = (this.key & ID_MASK) | (BigInt(zoom) << 248n)\n return this\n }\n\n toJSON(): string {\n return this.base4HashLabel\n }\n\n toString() {\n return this.base4Hash\n }\n\n protected guessZoom() {\n const quadkeySimple = this.id.toString(4)\n this.setZoom(quadkeySimple.length)\n }\n}\n","export const RelativeDirectionConstantLookup: Record<string, number> = {\n e: 1,\n n: -2,\n s: 2,\n w: -1,\n}\n"],"mappings":"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","names":["RelativeDirectionConstantLookup","e","n","s","w","MAX_ZOOM","isQuadkey","obj","type","Quadkey","FULL_MASK","ZOOM_MASK","ID_MASK","assertMaxBitUint","value","bits","assertEx","_geoJson","constructor","key","guessZoom","base16String","id","toString","padStart","base4Hash","zoom","base4HashLabel","hash","length","boundingBox","tileToBoundingBox","tile","center","result","boundingBoxToCenter","LngLat","children","shiftedId","i","push","setId","setZoom","gridLocation","tileData","tileFromQuadkey","col","row","parent","siblings","filteredSiblings","filter","quadkey","valid","Number","from","fromArrayBuffer","BigInt","hexFromArrayBuffer","prefix","fromBase16String","hexFromHexString","fromBase4String","undefined","root","nibble","parseInt","fromBoundingBox","tiles","tilesFromBoundingBox","Math","floor","fromTile","fromLngLat","point","tileFromPoint","convert","quadkeyString","tileToQuadkey","fromString","base","Error","childrenByZoom","deepResult","clone","equals","geoJson","GeoJson","getGridBoundingBox","size","index","left","top","blockSize","height","width","getGridLocation","isInBoundingBox","tileBoundingBox","contains","getNorthEast","getNorthWest","getSouthEast","getSouthWest","relative","direction","directionConstant","RelativeDirectionConstantLookup","number","charAt","slice","max","setKey","toJSON","quadkeySimple","Zero"]}
|
package/dist/node/index.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
4
|
+
var __publicField = (obj, key, value) => {
|
|
5
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
6
|
+
return value;
|
|
7
|
+
};
|
|
8
|
+
|
|
1
9
|
// src/Quadkey.ts
|
|
2
10
|
import { assertEx } from "@xylabs/assert";
|
|
3
11
|
import { hexFromArrayBuffer, hexFromHexString } from "@xylabs/hex";
|
|
4
|
-
import {
|
|
5
|
-
boundingBoxToCenter,
|
|
6
|
-
GeoJson,
|
|
7
|
-
tileFromPoint,
|
|
8
|
-
tileFromQuadkey,
|
|
9
|
-
tilesFromBoundingBox,
|
|
10
|
-
tileToBoundingBox,
|
|
11
|
-
tileToQuadkey
|
|
12
|
-
} from "@xyo-network/sdk-geo";
|
|
12
|
+
import { boundingBoxToCenter, GeoJson, tileFromPoint, tileFromQuadkey, tilesFromBoundingBox, tileToBoundingBox, tileToQuadkey } from "@xyo-network/sdk-geo";
|
|
13
13
|
import { LngLat } from "mapbox-gl";
|
|
14
14
|
|
|
15
15
|
// src/RelativeDirectionConstantLookup.ts
|
|
@@ -22,24 +22,23 @@ var RelativeDirectionConstantLookup = {
|
|
|
22
22
|
|
|
23
23
|
// src/Quadkey.ts
|
|
24
24
|
var MAX_ZOOM = 124;
|
|
25
|
-
var isQuadkey = (obj) => (obj == null ? void 0 : obj.type) === Quadkey.type;
|
|
25
|
+
var isQuadkey = /* @__PURE__ */ __name((obj) => (obj == null ? void 0 : obj.type) === Quadkey.type, "isQuadkey");
|
|
26
26
|
var FULL_MASK = 2n ** 256n - 1n;
|
|
27
27
|
var ZOOM_MASK = 0xffn << 248n;
|
|
28
28
|
var ID_MASK = ZOOM_MASK ^ FULL_MASK;
|
|
29
|
-
var assertMaxBitUint = (value, bits = 256n) => {
|
|
29
|
+
var assertMaxBitUint = /* @__PURE__ */ __name((value, bits = 256n) => {
|
|
30
30
|
assertEx(value < 2n ** bits && value >= 0, "Not a 256 Bit Uint!");
|
|
31
|
-
};
|
|
32
|
-
var
|
|
31
|
+
}, "assertMaxBitUint");
|
|
32
|
+
var _Quadkey = class _Quadkey {
|
|
33
|
+
key;
|
|
34
|
+
type;
|
|
35
|
+
_geoJson;
|
|
33
36
|
constructor(key = 0n) {
|
|
34
37
|
this.key = key;
|
|
38
|
+
this.type = _Quadkey.type;
|
|
35
39
|
assertMaxBitUint(key);
|
|
36
40
|
this.guessZoom();
|
|
37
41
|
}
|
|
38
|
-
static Zero = _Quadkey.from(0, 0n);
|
|
39
|
-
static root = new _Quadkey();
|
|
40
|
-
static type = "Quadkey";
|
|
41
|
-
type = _Quadkey.type;
|
|
42
|
-
_geoJson;
|
|
43
42
|
get base16String() {
|
|
44
43
|
return this.id.toString(16).padStart(62, "0");
|
|
45
44
|
}
|
|
@@ -102,10 +101,14 @@ var Quadkey = class _Quadkey {
|
|
|
102
101
|
return new _Quadkey().setId(id).setZoom(zoom);
|
|
103
102
|
}
|
|
104
103
|
static fromArrayBuffer(zoom, id) {
|
|
105
|
-
return new _Quadkey().setId(BigInt(hexFromArrayBuffer(id, {
|
|
104
|
+
return new _Quadkey().setId(BigInt(hexFromArrayBuffer(id, {
|
|
105
|
+
prefix: true
|
|
106
|
+
}))).setZoom(zoom);
|
|
106
107
|
}
|
|
107
108
|
static fromBase16String(value) {
|
|
108
|
-
return new _Quadkey(BigInt(hexFromHexString(value, {
|
|
109
|
+
return new _Quadkey(BigInt(hexFromHexString(value, {
|
|
110
|
+
prefix: true
|
|
111
|
+
})));
|
|
109
112
|
}
|
|
110
113
|
static fromBase4String(value) {
|
|
111
114
|
if (value === "fhr" || value === "" || value === void 0) {
|
|
@@ -147,11 +150,16 @@ var Quadkey = class _Quadkey {
|
|
|
147
150
|
}
|
|
148
151
|
childrenByZoom(zoom) {
|
|
149
152
|
if (zoom && zoom === this.zoom) {
|
|
150
|
-
return [
|
|
153
|
+
return [
|
|
154
|
+
this
|
|
155
|
+
];
|
|
151
156
|
}
|
|
152
157
|
let deepResult = [];
|
|
153
158
|
for (const quadkey of this.children) {
|
|
154
|
-
deepResult = [
|
|
159
|
+
deepResult = [
|
|
160
|
+
...deepResult,
|
|
161
|
+
...quadkey.childrenByZoom(zoom)
|
|
162
|
+
];
|
|
155
163
|
}
|
|
156
164
|
return deepResult;
|
|
157
165
|
}
|
|
@@ -259,6 +267,11 @@ var Quadkey = class _Quadkey {
|
|
|
259
267
|
this.setZoom(quadkeySimple.length);
|
|
260
268
|
}
|
|
261
269
|
};
|
|
270
|
+
__name(_Quadkey, "Quadkey");
|
|
271
|
+
__publicField(_Quadkey, "Zero", _Quadkey.from(0, 0n));
|
|
272
|
+
__publicField(_Quadkey, "root", new _Quadkey());
|
|
273
|
+
__publicField(_Quadkey, "type", "Quadkey");
|
|
274
|
+
var Quadkey = _Quadkey;
|
|
262
275
|
export {
|
|
263
276
|
Quadkey,
|
|
264
277
|
isQuadkey
|
package/dist/node/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Quadkey.ts","../../src/RelativeDirectionConstantLookup.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { hexFromArrayBuffer, hexFromHexString } from '@xylabs/hex'\nimport {\n boundingBoxToCenter,\n GeoJson,\n MercatorBoundingBox,\n MercatorTile,\n tileFromPoint,\n tileFromQuadkey,\n tilesFromBoundingBox,\n tileToBoundingBox,\n tileToQuadkey,\n} from '@xyo-network/sdk-geo'\nimport { LngLat, LngLatLike } from 'mapbox-gl'\n\nimport { RelativeDirectionConstantLookup } from './RelativeDirectionConstantLookup'\n\nconst MAX_ZOOM = 124\n\nexport const isQuadkey = (obj: { type: string }) => obj?.type === Quadkey.type\n\nconst FULL_MASK = 2n ** 256n - 1n\nconst ZOOM_MASK = 0xffn << 248n\nconst ID_MASK = ZOOM_MASK ^ FULL_MASK\n\nconst assertMaxBitUint = (value: bigint, bits = 256n) => {\n assertEx(value < 2n ** bits && value >= 0, 'Not a 256 Bit Uint!')\n}\n\nexport class Quadkey {\n static Zero = Quadkey.from(0, 0n)\n static root = new Quadkey()\n static type = 'Quadkey'\n\n type = Quadkey.type\n\n private _geoJson?: GeoJson\n\n constructor(private key = 0n) {\n assertMaxBitUint(key)\n this.guessZoom()\n }\n\n get base16String() {\n return this.id.toString(16).padStart(62, '0')\n }\n\n get base4Hash() {\n return this.id.toString(4).padStart(this.zoom, '0')\n }\n\n get base4HashLabel() {\n const hash = this.base4Hash\n return hash.length === 0 ? 'fhr' : hash\n }\n\n get boundingBox(): MercatorBoundingBox {\n return tileToBoundingBox(this.tile)\n }\n\n get center() {\n const result = boundingBoxToCenter(this.boundingBox)\n return new LngLat(result[0], result[1])\n }\n\n get children() {\n assertEx(this.zoom < MAX_ZOOM - 1, 'Can not get children of bottom tiles')\n const result: Quadkey[] = []\n const shiftedId = this.id << 2n\n for (let i = 0n; i < 4n; i++) {\n result.push(new Quadkey().setId(shiftedId | i).setZoom(this.zoom + 1))\n }\n return result\n }\n\n get gridLocation() {\n const tileData = tileFromQuadkey(this.base4Hash)\n\n return {\n col: 2 ** tileData[2] - tileData[1] - 1,\n row: tileData[0],\n zoom: tileData[2],\n }\n }\n\n get id() {\n return this.key & ID_MASK\n }\n\n get parent(): Quadkey | undefined {\n if (this.zoom > 0) {\n return new Quadkey().setId(this.id >> 2n).setZoom(this.zoom - 1)\n }\n }\n\n get siblings() {\n const siblings = assertEx(this.parent?.children, `siblings: parentChildren ${this.base4Hash}`)\n const filteredSiblings = siblings.filter((quadkey) => quadkey.key !== this.key)\n assertEx(filteredSiblings.length === 3, `siblings: expected 3 [${filteredSiblings.length}]`)\n return filteredSiblings\n }\n\n get tile(): MercatorTile {\n return tileFromQuadkey(this.base4Hash)\n }\n\n get valid() {\n //check for additional data outside zoom scope\n return this.id.toString(4) === this.base4Hash.padStart(64, '0')\n }\n\n get zoom() {\n //zoom is stored in top byte\n return Number((this.key & ZOOM_MASK) >> 248n)\n }\n\n static from(zoom: number, id: bigint) {\n return new Quadkey().setId(id).setZoom(zoom)\n }\n\n static fromArrayBuffer(zoom: number, id: ArrayBuffer) {\n return new Quadkey().setId(BigInt(hexFromArrayBuffer(id, { prefix: true }))).setZoom(zoom)\n }\n\n static fromBase16String(value: string) {\n return new Quadkey(BigInt(hexFromHexString(value, { prefix: true })))\n }\n\n static fromBase4String(value?: string) {\n if (value === 'fhr' || value === '' || value === undefined) {\n return Quadkey.root\n }\n let id = 0n\n for (let i = 0; i < value.length; i++) {\n const nibble = Number.parseInt(value[i])\n assertEx(nibble < 4 && nibble >= 0, `Invalid Base4 String: ${value}`)\n id = (id << 2n) | BigInt(nibble)\n }\n return new Quadkey().setId(id).setZoom(value.length)\n }\n\n static fromBoundingBox(boundingBox: MercatorBoundingBox, zoom: number) {\n const tiles = tilesFromBoundingBox(boundingBox, Math.floor(zoom))\n const result: Quadkey[] = []\n for (const tile of tiles) {\n result.push(assertEx(Quadkey.fromTile(tile), 'Bad Quadkey'))\n }\n\n return result\n }\n\n static fromLngLat(point: LngLatLike, zoom: number) {\n const tile = tileFromPoint(LngLat.convert(point), zoom)\n const quadkeyString = tileToQuadkey(tile)\n return Quadkey.fromBase4String(quadkeyString)\n }\n\n static fromString(zoom: number, id: string, base = 16) {\n switch (base) {\n case 16: {\n return Quadkey.fromBase16String(id).setZoom(zoom)\n }\n default: {\n throw new Error(`Invalid base [${base}]`)\n }\n }\n }\n\n static fromTile(tile: MercatorTile) {\n return Quadkey.fromBase4String(tileToQuadkey(tile))\n }\n\n childrenByZoom(zoom: number) {\n // if we are limiting by zoom, and we are already at that limit, just return this quadkey\n if (zoom && zoom === this.zoom) {\n return [this]\n }\n\n // recursively get children\n let deepResult: Quadkey[] = []\n for (const quadkey of this.children) {\n deepResult = [...deepResult, ...quadkey.childrenByZoom(zoom)]\n }\n return deepResult\n }\n\n clone() {\n return new Quadkey(this.key)\n }\n\n equals(obj: Quadkey): boolean {\n return obj.key == this.key\n }\n\n geoJson() {\n this._geoJson = this._geoJson ?? new GeoJson(this.base4Hash)\n return this._geoJson\n }\n\n getGridBoundingBox(size: number) {\n const hash = this.base4Hash\n let index = 0\n let left = 0\n let top = 0\n let blockSize = size\n while (index < hash.length) {\n blockSize >>= 1\n switch (hash[index]) {\n case '1': {\n left += blockSize\n break\n }\n case '2': {\n top += blockSize\n break\n }\n case '3': {\n left += blockSize\n top += blockSize\n break\n }\n }\n index++\n }\n if (blockSize < 2) {\n blockSize = 2\n }\n return {\n height: blockSize,\n left,\n top,\n width: blockSize,\n }\n }\n\n /** @deprecated use .gridLocation instead */\n getGridLocation() {\n return this.gridLocation\n }\n\n isInBoundingBox(boundingBox: MercatorBoundingBox) {\n const tileBoundingBox = tileToBoundingBox(this.tile)\n return (\n boundingBox.contains(tileBoundingBox.getNorthEast()) ||\n boundingBox.contains(tileBoundingBox.getNorthWest()) ||\n boundingBox.contains(tileBoundingBox.getSouthEast()) ||\n boundingBox.contains(tileBoundingBox.getSouthWest())\n )\n }\n\n relative(direction: string) {\n const directionConstant = assertEx(RelativeDirectionConstantLookup[direction], 'Invalid direction')\n let quadkey = this.base4Hash\n if (quadkey.length === 0) {\n return this\n }\n let index = quadkey.length - 1\n while (index >= 0) {\n let number = Number.parseInt(quadkey.charAt(index))\n number += directionConstant\n if (number > 3) {\n number -= 4\n quadkey = quadkey.slice(0, Math.max(0, index)) + number.toString() + quadkey.slice(Math.max(0, index + 1))\n index--\n } else if (number < 0) {\n number += 4\n quadkey = quadkey.slice(0, Math.max(0, index)) + number.toString() + quadkey.slice(Math.max(0, index + 1))\n index--\n } else {\n index = -1\n }\n }\n return Quadkey.fromBase4String(quadkey)\n }\n\n setId(id: bigint) {\n assertMaxBitUint(id, 248n)\n this.setKey(this.zoom, id)\n return this\n }\n\n setKey(zoom: number, key: bigint) {\n assertMaxBitUint(key)\n this.key = key\n this.setZoom(zoom)\n return this\n }\n\n setZoom(zoom: number) {\n assertEx(zoom < MAX_ZOOM, `Invalid zoom [${zoom}] max=${MAX_ZOOM}`)\n this.key = (this.key & ID_MASK) | (BigInt(zoom) << 248n)\n return this\n }\n\n toJSON(): string {\n return this.base4HashLabel\n }\n\n toString() {\n return this.base4Hash\n }\n\n protected guessZoom() {\n const quadkeySimple = this.id.toString(4)\n this.setZoom(quadkeySimple.length)\n }\n}\n","export const RelativeDirectionConstantLookup: Record<string, number> = {\n e: 1,\n n: -2,\n s: 2,\n w: -1,\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/Quadkey.ts","../../src/RelativeDirectionConstantLookup.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { hexFromArrayBuffer, hexFromHexString } from '@xylabs/hex'\nimport {\n boundingBoxToCenter,\n GeoJson,\n MercatorBoundingBox,\n MercatorTile,\n tileFromPoint,\n tileFromQuadkey,\n tilesFromBoundingBox,\n tileToBoundingBox,\n tileToQuadkey,\n} from '@xyo-network/sdk-geo'\nimport { LngLat, LngLatLike } from 'mapbox-gl'\n\nimport { RelativeDirectionConstantLookup } from './RelativeDirectionConstantLookup'\n\nconst MAX_ZOOM = 124\n\nexport const isQuadkey = (obj: { type: string }) => obj?.type === Quadkey.type\n\nconst FULL_MASK = 2n ** 256n - 1n\nconst ZOOM_MASK = 0xffn << 248n\nconst ID_MASK = ZOOM_MASK ^ FULL_MASK\n\nconst assertMaxBitUint = (value: bigint, bits = 256n) => {\n assertEx(value < 2n ** bits && value >= 0, 'Not a 256 Bit Uint!')\n}\n\nexport class Quadkey {\n static Zero = Quadkey.from(0, 0n)\n static root = new Quadkey()\n static type = 'Quadkey'\n\n type = Quadkey.type\n\n private _geoJson?: GeoJson\n\n constructor(private key = 0n) {\n assertMaxBitUint(key)\n this.guessZoom()\n }\n\n get base16String() {\n return this.id.toString(16).padStart(62, '0')\n }\n\n get base4Hash() {\n return this.id.toString(4).padStart(this.zoom, '0')\n }\n\n get base4HashLabel() {\n const hash = this.base4Hash\n return hash.length === 0 ? 'fhr' : hash\n }\n\n get boundingBox(): MercatorBoundingBox {\n return tileToBoundingBox(this.tile)\n }\n\n get center() {\n const result = boundingBoxToCenter(this.boundingBox)\n return new LngLat(result[0], result[1])\n }\n\n get children() {\n assertEx(this.zoom < MAX_ZOOM - 1, 'Can not get children of bottom tiles')\n const result: Quadkey[] = []\n const shiftedId = this.id << 2n\n for (let i = 0n; i < 4n; i++) {\n result.push(new Quadkey().setId(shiftedId | i).setZoom(this.zoom + 1))\n }\n return result\n }\n\n get gridLocation() {\n const tileData = tileFromQuadkey(this.base4Hash)\n\n return {\n col: 2 ** tileData[2] - tileData[1] - 1,\n row: tileData[0],\n zoom: tileData[2],\n }\n }\n\n get id() {\n return this.key & ID_MASK\n }\n\n get parent(): Quadkey | undefined {\n if (this.zoom > 0) {\n return new Quadkey().setId(this.id >> 2n).setZoom(this.zoom - 1)\n }\n }\n\n get siblings() {\n const siblings = assertEx(this.parent?.children, `siblings: parentChildren ${this.base4Hash}`)\n const filteredSiblings = siblings.filter((quadkey) => quadkey.key !== this.key)\n assertEx(filteredSiblings.length === 3, `siblings: expected 3 [${filteredSiblings.length}]`)\n return filteredSiblings\n }\n\n get tile(): MercatorTile {\n return tileFromQuadkey(this.base4Hash)\n }\n\n get valid() {\n //check for additional data outside zoom scope\n return this.id.toString(4) === this.base4Hash.padStart(64, '0')\n }\n\n get zoom() {\n //zoom is stored in top byte\n return Number((this.key & ZOOM_MASK) >> 248n)\n }\n\n static from(zoom: number, id: bigint) {\n return new Quadkey().setId(id).setZoom(zoom)\n }\n\n static fromArrayBuffer(zoom: number, id: ArrayBuffer) {\n return new Quadkey().setId(BigInt(hexFromArrayBuffer(id, { prefix: true }))).setZoom(zoom)\n }\n\n static fromBase16String(value: string) {\n return new Quadkey(BigInt(hexFromHexString(value, { prefix: true })))\n }\n\n static fromBase4String(value?: string) {\n if (value === 'fhr' || value === '' || value === undefined) {\n return Quadkey.root\n }\n let id = 0n\n for (let i = 0; i < value.length; i++) {\n const nibble = Number.parseInt(value[i])\n assertEx(nibble < 4 && nibble >= 0, `Invalid Base4 String: ${value}`)\n id = (id << 2n) | BigInt(nibble)\n }\n return new Quadkey().setId(id).setZoom(value.length)\n }\n\n static fromBoundingBox(boundingBox: MercatorBoundingBox, zoom: number) {\n const tiles = tilesFromBoundingBox(boundingBox, Math.floor(zoom))\n const result: Quadkey[] = []\n for (const tile of tiles) {\n result.push(assertEx(Quadkey.fromTile(tile), 'Bad Quadkey'))\n }\n\n return result\n }\n\n static fromLngLat(point: LngLatLike, zoom: number) {\n const tile = tileFromPoint(LngLat.convert(point), zoom)\n const quadkeyString = tileToQuadkey(tile)\n return Quadkey.fromBase4String(quadkeyString)\n }\n\n static fromString(zoom: number, id: string, base = 16) {\n switch (base) {\n case 16: {\n return Quadkey.fromBase16String(id).setZoom(zoom)\n }\n default: {\n throw new Error(`Invalid base [${base}]`)\n }\n }\n }\n\n static fromTile(tile: MercatorTile) {\n return Quadkey.fromBase4String(tileToQuadkey(tile))\n }\n\n childrenByZoom(zoom: number) {\n // if we are limiting by zoom, and we are already at that limit, just return this quadkey\n if (zoom && zoom === this.zoom) {\n return [this]\n }\n\n // recursively get children\n let deepResult: Quadkey[] = []\n for (const quadkey of this.children) {\n deepResult = [...deepResult, ...quadkey.childrenByZoom(zoom)]\n }\n return deepResult\n }\n\n clone() {\n return new Quadkey(this.key)\n }\n\n equals(obj: Quadkey): boolean {\n return obj.key == this.key\n }\n\n geoJson() {\n this._geoJson = this._geoJson ?? new GeoJson(this.base4Hash)\n return this._geoJson\n }\n\n getGridBoundingBox(size: number) {\n const hash = this.base4Hash\n let index = 0\n let left = 0\n let top = 0\n let blockSize = size\n while (index < hash.length) {\n blockSize >>= 1\n switch (hash[index]) {\n case '1': {\n left += blockSize\n break\n }\n case '2': {\n top += blockSize\n break\n }\n case '3': {\n left += blockSize\n top += blockSize\n break\n }\n }\n index++\n }\n if (blockSize < 2) {\n blockSize = 2\n }\n return {\n height: blockSize,\n left,\n top,\n width: blockSize,\n }\n }\n\n /** @deprecated use .gridLocation instead */\n getGridLocation() {\n return this.gridLocation\n }\n\n isInBoundingBox(boundingBox: MercatorBoundingBox) {\n const tileBoundingBox = tileToBoundingBox(this.tile)\n return (\n boundingBox.contains(tileBoundingBox.getNorthEast()) ||\n boundingBox.contains(tileBoundingBox.getNorthWest()) ||\n boundingBox.contains(tileBoundingBox.getSouthEast()) ||\n boundingBox.contains(tileBoundingBox.getSouthWest())\n )\n }\n\n relative(direction: string) {\n const directionConstant = assertEx(RelativeDirectionConstantLookup[direction], 'Invalid direction')\n let quadkey = this.base4Hash\n if (quadkey.length === 0) {\n return this\n }\n let index = quadkey.length - 1\n while (index >= 0) {\n let number = Number.parseInt(quadkey.charAt(index))\n number += directionConstant\n if (number > 3) {\n number -= 4\n quadkey = quadkey.slice(0, Math.max(0, index)) + number.toString() + quadkey.slice(Math.max(0, index + 1))\n index--\n } else if (number < 0) {\n number += 4\n quadkey = quadkey.slice(0, Math.max(0, index)) + number.toString() + quadkey.slice(Math.max(0, index + 1))\n index--\n } else {\n index = -1\n }\n }\n return Quadkey.fromBase4String(quadkey)\n }\n\n setId(id: bigint) {\n assertMaxBitUint(id, 248n)\n this.setKey(this.zoom, id)\n return this\n }\n\n setKey(zoom: number, key: bigint) {\n assertMaxBitUint(key)\n this.key = key\n this.setZoom(zoom)\n return this\n }\n\n setZoom(zoom: number) {\n assertEx(zoom < MAX_ZOOM, `Invalid zoom [${zoom}] max=${MAX_ZOOM}`)\n this.key = (this.key & ID_MASK) | (BigInt(zoom) << 248n)\n return this\n }\n\n toJSON(): string {\n return this.base4HashLabel\n }\n\n toString() {\n return this.base4Hash\n }\n\n protected guessZoom() {\n const quadkeySimple = this.id.toString(4)\n this.setZoom(quadkeySimple.length)\n }\n}\n","export const RelativeDirectionConstantLookup: Record<string, number> = {\n e: 1,\n n: -2,\n s: 2,\n w: -1,\n}\n"],"mappings":"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","names":["assertEx","hexFromArrayBuffer","hexFromHexString","boundingBoxToCenter","GeoJson","tileFromPoint","tileFromQuadkey","tilesFromBoundingBox","tileToBoundingBox","tileToQuadkey","LngLat","RelativeDirectionConstantLookup","e","n","s","w","MAX_ZOOM","isQuadkey","obj","type","Quadkey","FULL_MASK","ZOOM_MASK","ID_MASK","assertMaxBitUint","value","bits","assertEx","_geoJson","constructor","key","guessZoom","base16String","id","toString","padStart","base4Hash","zoom","base4HashLabel","hash","length","boundingBox","tileToBoundingBox","tile","center","result","boundingBoxToCenter","LngLat","children","shiftedId","i","push","setId","setZoom","gridLocation","tileData","tileFromQuadkey","col","row","parent","siblings","filteredSiblings","filter","quadkey","valid","Number","from","fromArrayBuffer","BigInt","hexFromArrayBuffer","prefix","fromBase16String","hexFromHexString","fromBase4String","undefined","root","nibble","parseInt","fromBoundingBox","tiles","tilesFromBoundingBox","Math","floor","fromTile","fromLngLat","point","tileFromPoint","convert","quadkeyString","tileToQuadkey","fromString","base","Error","childrenByZoom","deepResult","clone","equals","geoJson","GeoJson","getGridBoundingBox","size","index","left","top","blockSize","height","width","getGridLocation","isInBoundingBox","tileBoundingBox","contains","getNorthEast","getNorthWest","getSouthEast","getSouthWest","relative","direction","directionConstant","RelativeDirectionConstantLookup","number","charAt","slice","max","setKey","toJSON","quadkeySimple","Zero"]}
|