@xyo-network/quadkey 2.110.10 → 2.110.12

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.
@@ -3,7 +3,6 @@ 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 });
7
6
  var __export = (target, all) => {
8
7
  for (var name in all)
9
8
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -42,29 +41,24 @@ var RelativeDirectionConstantLookup = {
42
41
 
43
42
  // src/Quadkey.ts
44
43
  var MAX_ZOOM = 124;
45
- var isQuadkey = /* @__PURE__ */ __name((obj) => obj?.type === Quadkey.type, "isQuadkey");
44
+ var isQuadkey = (obj) => obj?.type === Quadkey.type;
46
45
  var FULL_MASK = 2n ** 256n - 1n;
47
46
  var ZOOM_MASK = 0xffn << 248n;
48
47
  var ID_MASK = ZOOM_MASK ^ FULL_MASK;
49
- var assertMaxBitUint = /* @__PURE__ */ __name((value, bits = 256n) => {
48
+ var assertMaxBitUint = (value, bits = 256n) => {
50
49
  (0, import_assert.assertEx)(value < 2n ** bits && value >= 0, () => "Not a 256 Bit Uint!");
51
- }, "assertMaxBitUint");
50
+ };
52
51
  var Quadkey = class _Quadkey {
53
- static {
54
- __name(this, "Quadkey");
55
- }
56
- key;
57
- static Zero = _Quadkey.from(0, 0n);
58
- static root = new _Quadkey();
59
- static type = "Quadkey";
60
- type;
61
- _geoJson;
62
52
  constructor(key = 0n) {
63
53
  this.key = key;
64
- this.type = _Quadkey.type;
65
54
  assertMaxBitUint(key);
66
55
  this.guessZoom();
67
56
  }
57
+ static Zero = _Quadkey.from(0, 0n);
58
+ static root = new _Quadkey();
59
+ static type = "Quadkey";
60
+ type = _Quadkey.type;
61
+ _geoJson;
68
62
  get base10String() {
69
63
  return this.id.toString(10);
70
64
  }
@@ -129,14 +123,10 @@ var Quadkey = class _Quadkey {
129
123
  return new _Quadkey().setId(id).setZoom(zoom);
130
124
  }
131
125
  static fromArrayBuffer(zoom, id) {
132
- return new _Quadkey().setId(BigInt((0, import_hex.hexFromArrayBuffer)(id, {
133
- prefix: true
134
- }))).setZoom(zoom);
126
+ return new _Quadkey().setId(BigInt((0, import_hex.hexFromArrayBuffer)(id, { prefix: true }))).setZoom(zoom);
135
127
  }
136
128
  static fromBase16String(value) {
137
- return new _Quadkey(BigInt((0, import_hex.hexFromHexString)(value, {
138
- prefix: true
139
- })));
129
+ return new _Quadkey(BigInt((0, import_hex.hexFromHexString)(value, { prefix: true })));
140
130
  }
141
131
  static fromBase4String(value) {
142
132
  if (value === "fhr" || value === "" || value === void 0) {
@@ -178,16 +168,11 @@ var Quadkey = class _Quadkey {
178
168
  }
179
169
  childrenByZoom(zoom) {
180
170
  if (zoom && zoom === this.zoom) {
181
- return [
182
- this
183
- ];
171
+ return [this];
184
172
  }
185
173
  let deepResult = [];
186
174
  for (const quadkey of this.children) {
187
- deepResult = [
188
- ...deepResult,
189
- ...quadkey.childrenByZoom(zoom)
190
- ];
175
+ deepResult = [...deepResult, ...quadkey.childrenByZoom(zoom)];
191
176
  }
192
177
  return deepResult;
193
178
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/Quadkey.ts","../../src/RelativeDirectionConstantLookup.ts"],"sourcesContent":["export * from './Quadkey.js'\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.js'\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(public key = 0n) {\n assertMaxBitUint(key)\n this.guessZoom()\n }\n\n get base10String() {\n return this.id.toString(10)\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(): { col: number; row: number; zoom: number } {\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","base10String","id","toString","base16String","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"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/Quadkey.ts","../../src/RelativeDirectionConstantLookup.ts"],"sourcesContent":["export * from './Quadkey.js'\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.js'\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(public key = 0n) {\n assertMaxBitUint(key)\n this.guessZoom()\n }\n\n get base10String() {\n return this.id.toString(10)\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(): { col: number; row: number; zoom: number } {\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,10 +1,15 @@
1
- var __defProp = Object.defineProperty;
2
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
-
4
1
  // src/Quadkey.ts
5
2
  import { assertEx } from "@xylabs/assert";
6
3
  import { hexFromArrayBuffer, hexFromHexString } from "@xylabs/hex";
7
- import { boundingBoxToCenter, GeoJson, tileFromPoint, tileFromQuadkey, tilesFromBoundingBox, tileToBoundingBox, tileToQuadkey } from "@xyo-network/sdk-geo";
4
+ import {
5
+ boundingBoxToCenter,
6
+ GeoJson,
7
+ tileFromPoint,
8
+ tileFromQuadkey,
9
+ tilesFromBoundingBox,
10
+ tileToBoundingBox,
11
+ tileToQuadkey
12
+ } from "@xyo-network/sdk-geo";
8
13
  import { LngLat } from "mapbox-gl";
9
14
 
10
15
  // src/RelativeDirectionConstantLookup.ts
@@ -17,29 +22,24 @@ var RelativeDirectionConstantLookup = {
17
22
 
18
23
  // src/Quadkey.ts
19
24
  var MAX_ZOOM = 124;
20
- var isQuadkey = /* @__PURE__ */ __name((obj) => obj?.type === Quadkey.type, "isQuadkey");
25
+ var isQuadkey = (obj) => obj?.type === Quadkey.type;
21
26
  var FULL_MASK = 2n ** 256n - 1n;
22
27
  var ZOOM_MASK = 0xffn << 248n;
23
28
  var ID_MASK = ZOOM_MASK ^ FULL_MASK;
24
- var assertMaxBitUint = /* @__PURE__ */ __name((value, bits = 256n) => {
29
+ var assertMaxBitUint = (value, bits = 256n) => {
25
30
  assertEx(value < 2n ** bits && value >= 0, () => "Not a 256 Bit Uint!");
26
- }, "assertMaxBitUint");
31
+ };
27
32
  var Quadkey = class _Quadkey {
28
- static {
29
- __name(this, "Quadkey");
30
- }
31
- key;
32
- static Zero = _Quadkey.from(0, 0n);
33
- static root = new _Quadkey();
34
- static type = "Quadkey";
35
- type;
36
- _geoJson;
37
33
  constructor(key = 0n) {
38
34
  this.key = key;
39
- this.type = _Quadkey.type;
40
35
  assertMaxBitUint(key);
41
36
  this.guessZoom();
42
37
  }
38
+ static Zero = _Quadkey.from(0, 0n);
39
+ static root = new _Quadkey();
40
+ static type = "Quadkey";
41
+ type = _Quadkey.type;
42
+ _geoJson;
43
43
  get base10String() {
44
44
  return this.id.toString(10);
45
45
  }
@@ -104,14 +104,10 @@ var Quadkey = class _Quadkey {
104
104
  return new _Quadkey().setId(id).setZoom(zoom);
105
105
  }
106
106
  static fromArrayBuffer(zoom, id) {
107
- return new _Quadkey().setId(BigInt(hexFromArrayBuffer(id, {
108
- prefix: true
109
- }))).setZoom(zoom);
107
+ return new _Quadkey().setId(BigInt(hexFromArrayBuffer(id, { prefix: true }))).setZoom(zoom);
110
108
  }
111
109
  static fromBase16String(value) {
112
- return new _Quadkey(BigInt(hexFromHexString(value, {
113
- prefix: true
114
- })));
110
+ return new _Quadkey(BigInt(hexFromHexString(value, { prefix: true })));
115
111
  }
116
112
  static fromBase4String(value) {
117
113
  if (value === "fhr" || value === "" || value === void 0) {
@@ -153,16 +149,11 @@ var Quadkey = class _Quadkey {
153
149
  }
154
150
  childrenByZoom(zoom) {
155
151
  if (zoom && zoom === this.zoom) {
156
- return [
157
- this
158
- ];
152
+ return [this];
159
153
  }
160
154
  let deepResult = [];
161
155
  for (const quadkey of this.children) {
162
- deepResult = [
163
- ...deepResult,
164
- ...quadkey.childrenByZoom(zoom)
165
- ];
156
+ deepResult = [...deepResult, ...quadkey.childrenByZoom(zoom)];
166
157
  }
167
158
  return deepResult;
168
159
  }
@@ -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.js'\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(public key = 0n) {\n assertMaxBitUint(key)\n this.guessZoom()\n }\n\n get base10String() {\n return this.id.toString(10)\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(): { col: number; row: number; zoom: number } {\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","base10String","id","toString","base16String","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"]}
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.js'\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(public key = 0n) {\n assertMaxBitUint(key)\n this.guessZoom()\n }\n\n get base10String() {\n return this.id.toString(10)\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(): { col: number; row: number; zoom: number } {\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":";AAAA,SAAS,gBAAgB;AACzB,SAAS,oBAAoB,wBAAwB;AACrD;AAAA,EACE;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAA0B;;;ACb5B,IAAM,kCAA0D;AAAA,EACrE,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;;;ADYA,IAAM,WAAW;AAEV,IAAM,YAAY,CAAC,QAA0B,KAAK,SAAS,QAAQ;AAE1E,IAAM,YAAY,MAAM,OAAO;AAC/B,IAAM,YAAY,SAAS;AAC3B,IAAM,UAAU,YAAY;AAE5B,IAAM,mBAAmB,CAAC,OAAe,OAAO,SAAS;AACvD,WAAS,QAAQ,MAAM,QAAQ,SAAS,GAAG,MAAM,qBAAqB;AACxE;AAEO,IAAM,UAAN,MAAM,SAAQ;AAAA,EASnB,YAAmB,MAAM,IAAI;AAAV;AACjB,qBAAiB,GAAG;AACpB,SAAK,UAAU;AAAA,EACjB;AAAA,EAXA,OAAO,OAAO,SAAQ,KAAK,GAAG,EAAE;AAAA,EAChC,OAAO,OAAO,IAAI,SAAQ;AAAA,EAC1B,OAAO,OAAO;AAAA,EAEd,OAAO,SAAQ;AAAA,EAEP;AAAA,EAOR,IAAI,eAAe;AACjB,WAAO,KAAK,GAAG,SAAS,EAAE;AAAA,EAC5B;AAAA,EAEA,IAAI,eAAe;AACjB,WAAO,KAAK,GAAG,SAAS,EAAE,EAAE,SAAS,IAAI,GAAG;AAAA,EAC9C;AAAA,EAEA,IAAI,YAAY;AACd,WAAO,KAAK,GAAG,SAAS,CAAC,EAAE,SAAS,KAAK,MAAM,GAAG;AAAA,EACpD;AAAA,EAEA,IAAI,iBAAiB;AACnB,UAAM,OAAO,KAAK;AAClB,WAAO,KAAK,WAAW,IAAI,QAAQ;AAAA,EACrC;AAAA,EAEA,IAAI,cAAmC;AACrC,WAAO,kBAAkB,KAAK,IAAI;AAAA,EACpC;AAAA,EAEA,IAAI,SAAS;AACX,UAAM,SAAS,oBAAoB,KAAK,WAAW;AACnD,WAAO,IAAI,OAAO,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AAAA,EACxC;AAAA,EAEA,IAAI,WAAW;AACb,aAAS,KAAK,OAAO,WAAW,GAAG,MAAM,sCAAsC;AAC/E,UAAM,SAAoB,CAAC;AAC3B,UAAM,YAAY,KAAK,MAAM;AAC7B,aAAS,IAAI,IAAI,IAAI,IAAI,KAAK;AAC5B,aAAO,KAAK,IAAI,SAAQ,EAAE,MAAM,YAAY,CAAC,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC;AAAA,IACvE;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,eAA2D;AAC7D,UAAM,WAAW,gBAAgB,KAAK,SAAS;AAE/C,WAAO;AAAA,MACL,KAAK,KAAK,SAAS,CAAC,IAAI,SAAS,CAAC,IAAI;AAAA,MACtC,KAAK,SAAS,CAAC;AAAA,MACf,MAAM,SAAS,CAAC;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,IAAI,KAAK;AACP,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,IAAI,SAA8B;AAChC,QAAI,KAAK,OAAO,GAAG;AACjB,aAAO,IAAI,SAAQ,EAAE,MAAM,KAAK,MAAM,EAAE,EAAE,QAAQ,KAAK,OAAO,CAAC;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,IAAI,WAAW;AACb,UAAM,WAAW,SAAS,KAAK,QAAQ,UAAU,MAAM,4BAA4B,KAAK,SAAS,EAAE;AACnG,UAAM,mBAAmB,SAAS,OAAO,CAAC,YAAY,QAAQ,QAAQ,KAAK,GAAG;AAC9E,aAAS,iBAAiB,WAAW,GAAG,MAAM,yBAAyB,iBAAiB,MAAM,GAAG;AACjG,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,OAAqB;AACvB,WAAO,gBAAgB,KAAK,SAAS;AAAA,EACvC;AAAA,EAEA,IAAI,QAAQ;AAEV,WAAO,KAAK,GAAG,SAAS,CAAC,MAAM,KAAK,UAAU,SAAS,IAAI,GAAG;AAAA,EAChE;AAAA,EAEA,IAAI,OAAO;AAET,WAAO,QAAQ,KAAK,MAAM,cAAc,IAAI;AAAA,EAC9C;AAAA,EAEA,OAAO,KAAK,MAAc,IAAY;AACpC,WAAO,IAAI,SAAQ,EAAE,MAAM,EAAE,EAAE,QAAQ,IAAI;AAAA,EAC7C;AAAA,EAEA,OAAO,gBAAgB,MAAc,IAAiB;AACpD,WAAO,IAAI,SAAQ,EAAE,MAAM,OAAO,mBAAmB,IAAI,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI;AAAA,EAC3F;AAAA,EAEA,OAAO,iBAAiB,OAAe;AACrC,WAAO,IAAI,SAAQ,OAAO,iBAAiB,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC;AAAA,EACtE;AAAA,EAEA,OAAO,gBAAgB,OAAgB;AACrC,QAAI,UAAU,SAAS,UAAU,MAAM,UAAU,QAAW;AAC1D,aAAO,SAAQ;AAAA,IACjB;AACA,QAAI,KAAK;AACT,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,SAAS,OAAO,SAAS,MAAM,CAAC,CAAC;AACvC,eAAS,SAAS,KAAK,UAAU,GAAG,MAAM,yBAAyB,KAAK,EAAE;AAC1E,WAAM,MAAM,KAAM,OAAO,MAAM;AAAA,IACjC;AACA,WAAO,IAAI,SAAQ,EAAE,MAAM,EAAE,EAAE,QAAQ,MAAM,MAAM;AAAA,EACrD;AAAA,EAEA,OAAO,gBAAgB,aAAkC,MAAc;AACrE,UAAM,QAAQ,qBAAqB,aAAa,KAAK,MAAM,IAAI,CAAC;AAChE,UAAM,SAAoB,CAAC;AAC3B,eAAW,QAAQ,OAAO;AACxB,aAAO,KAAK,SAAS,SAAQ,SAAS,IAAI,GAAG,MAAM,aAAa,CAAC;AAAA,IACnE;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,WAAW,OAAmB,MAAc;AACjD,UAAM,OAAO,cAAc,OAAO,QAAQ,KAAK,GAAG,IAAI;AACtD,UAAM,gBAAgB,cAAc,IAAI;AACxC,WAAO,SAAQ,gBAAgB,aAAa;AAAA,EAC9C;AAAA,EAEA,OAAO,WAAW,MAAc,IAAY,OAAO,IAAI;AACrD,YAAQ,MAAM;AAAA,MACZ,KAAK,IAAI;AACP,eAAO,SAAQ,iBAAiB,EAAE,EAAE,QAAQ,IAAI;AAAA,MAClD;AAAA,MACA,SAAS;AACP,cAAM,IAAI,MAAM,iBAAiB,IAAI,GAAG;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,SAAS,MAAoB;AAClC,WAAO,SAAQ,gBAAgB,cAAc,IAAI,CAAC;AAAA,EACpD;AAAA,EAEA,eAAe,MAAc;AAE3B,QAAI,QAAQ,SAAS,KAAK,MAAM;AAC9B,aAAO,CAAC,IAAI;AAAA,IACd;AAGA,QAAI,aAAwB,CAAC;AAC7B,eAAW,WAAW,KAAK,UAAU;AACnC,mBAAa,CAAC,GAAG,YAAY,GAAG,QAAQ,eAAe,IAAI,CAAC;AAAA,IAC9D;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ;AACN,WAAO,IAAI,SAAQ,KAAK,GAAG;AAAA,EAC7B;AAAA,EAEA,OAAO,KAAuB;AAC5B,WAAO,IAAI,OAAO,KAAK;AAAA,EACzB;AAAA,EAEA,UAAU;AACR,SAAK,WAAW,KAAK,YAAY,IAAI,QAAQ,KAAK,SAAS;AAC3D,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,mBAAmB,MAAc;AAC/B,UAAM,OAAO,KAAK;AAClB,QAAI,QAAQ;AACZ,QAAI,OAAO;AACX,QAAI,MAAM;AACV,QAAI,YAAY;AAChB,WAAO,QAAQ,KAAK,QAAQ;AAC1B,oBAAc;AACd,cAAQ,KAAK,KAAK,GAAG;AAAA,QACnB,KAAK,KAAK;AACR,kBAAQ;AACR;AAAA,QACF;AAAA,QACA,KAAK,KAAK;AACR,iBAAO;AACP;AAAA,QACF;AAAA,QACA,KAAK,KAAK;AACR,kBAAQ;AACR,iBAAO;AACP;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AACA,QAAI,YAAY,GAAG;AACjB,kBAAY;AAAA,IACd;AACA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,kBAAkB;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,gBAAgB,aAAkC;AAChD,UAAM,kBAAkB,kBAAkB,KAAK,IAAI;AACnD,WACE,YAAY,SAAS,gBAAgB,aAAa,CAAC,KACnD,YAAY,SAAS,gBAAgB,aAAa,CAAC,KACnD,YAAY,SAAS,gBAAgB,aAAa,CAAC,KACnD,YAAY,SAAS,gBAAgB,aAAa,CAAC;AAAA,EAEvD;AAAA,EAEA,SAAS,WAAmB;AAC1B,UAAM,oBAAoB,SAAS,gCAAgC,SAAS,GAAG,MAAM,mBAAmB;AACxG,QAAI,UAAU,KAAK;AACnB,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,QAAQ,SAAS;AAC7B,WAAO,SAAS,GAAG;AACjB,UAAI,SAAS,OAAO,SAAS,QAAQ,OAAO,KAAK,CAAC;AAClD,gBAAU;AACV,UAAI,SAAS,GAAG;AACd,kBAAU;AACV,kBAAU,QAAQ,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC,IAAI,OAAO,SAAS,IAAI,QAAQ,MAAM,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC;AACzG;AAAA,MACF,WAAW,SAAS,GAAG;AACrB,kBAAU;AACV,kBAAU,QAAQ,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC,IAAI,OAAO,SAAS,IAAI,QAAQ,MAAM,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC;AACzG;AAAA,MACF,OAAO;AACL,gBAAQ;AAAA,MACV;AAAA,IACF;AACA,WAAO,SAAQ,gBAAgB,OAAO;AAAA,EACxC;AAAA,EAEA,MAAM,IAAY;AAChB,qBAAiB,IAAI,IAAI;AACzB,SAAK,OAAO,KAAK,MAAM,EAAE;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,MAAc,KAAa;AAChC,qBAAiB,GAAG;AACpB,SAAK,MAAM;AACX,SAAK,QAAQ,IAAI;AACjB,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,MAAc;AACpB,aAAS,OAAO,UAAU,MAAM,iBAAiB,IAAI,SAAS,QAAQ,EAAE;AACxE,SAAK,MAAO,KAAK,MAAM,UAAY,OAAO,IAAI,KAAK;AACnD,WAAO;AAAA,EACT;AAAA,EAEA,SAAiB;AACf,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,WAAW;AACT,WAAO,KAAK;AAAA,EACd;AAAA,EAEU,YAAY;AACpB,UAAM,gBAAgB,KAAK,GAAG,SAAS,CAAC;AACxC,SAAK,QAAQ,cAAc,MAAM;AAAA,EACnC;AACF;","names":[]}
@@ -3,7 +3,6 @@ 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 });
7
6
  var __export = (target, all) => {
8
7
  for (var name in all)
9
8
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -42,29 +41,24 @@ var RelativeDirectionConstantLookup = {
42
41
 
43
42
  // src/Quadkey.ts
44
43
  var MAX_ZOOM = 124;
45
- var isQuadkey = /* @__PURE__ */ __name((obj) => obj?.type === Quadkey.type, "isQuadkey");
44
+ var isQuadkey = (obj) => obj?.type === Quadkey.type;
46
45
  var FULL_MASK = 2n ** 256n - 1n;
47
46
  var ZOOM_MASK = 0xffn << 248n;
48
47
  var ID_MASK = ZOOM_MASK ^ FULL_MASK;
49
- var assertMaxBitUint = /* @__PURE__ */ __name((value, bits = 256n) => {
48
+ var assertMaxBitUint = (value, bits = 256n) => {
50
49
  (0, import_assert.assertEx)(value < 2n ** bits && value >= 0, () => "Not a 256 Bit Uint!");
51
- }, "assertMaxBitUint");
50
+ };
52
51
  var Quadkey = class _Quadkey {
53
- static {
54
- __name(this, "Quadkey");
55
- }
56
- key;
57
- static Zero = _Quadkey.from(0, 0n);
58
- static root = new _Quadkey();
59
- static type = "Quadkey";
60
- type;
61
- _geoJson;
62
52
  constructor(key = 0n) {
63
53
  this.key = key;
64
- this.type = _Quadkey.type;
65
54
  assertMaxBitUint(key);
66
55
  this.guessZoom();
67
56
  }
57
+ static Zero = _Quadkey.from(0, 0n);
58
+ static root = new _Quadkey();
59
+ static type = "Quadkey";
60
+ type = _Quadkey.type;
61
+ _geoJson;
68
62
  get base10String() {
69
63
  return this.id.toString(10);
70
64
  }
@@ -129,14 +123,10 @@ var Quadkey = class _Quadkey {
129
123
  return new _Quadkey().setId(id).setZoom(zoom);
130
124
  }
131
125
  static fromArrayBuffer(zoom, id) {
132
- return new _Quadkey().setId(BigInt((0, import_hex.hexFromArrayBuffer)(id, {
133
- prefix: true
134
- }))).setZoom(zoom);
126
+ return new _Quadkey().setId(BigInt((0, import_hex.hexFromArrayBuffer)(id, { prefix: true }))).setZoom(zoom);
135
127
  }
136
128
  static fromBase16String(value) {
137
- return new _Quadkey(BigInt((0, import_hex.hexFromHexString)(value, {
138
- prefix: true
139
- })));
129
+ return new _Quadkey(BigInt((0, import_hex.hexFromHexString)(value, { prefix: true })));
140
130
  }
141
131
  static fromBase4String(value) {
142
132
  if (value === "fhr" || value === "" || value === void 0) {
@@ -178,16 +168,11 @@ var Quadkey = class _Quadkey {
178
168
  }
179
169
  childrenByZoom(zoom) {
180
170
  if (zoom && zoom === this.zoom) {
181
- return [
182
- this
183
- ];
171
+ return [this];
184
172
  }
185
173
  let deepResult = [];
186
174
  for (const quadkey of this.children) {
187
- deepResult = [
188
- ...deepResult,
189
- ...quadkey.childrenByZoom(zoom)
190
- ];
175
+ deepResult = [...deepResult, ...quadkey.childrenByZoom(zoom)];
191
176
  }
192
177
  return deepResult;
193
178
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/Quadkey.ts","../../src/RelativeDirectionConstantLookup.ts"],"sourcesContent":["export * from './Quadkey.js'\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.js'\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(public key = 0n) {\n assertMaxBitUint(key)\n this.guessZoom()\n }\n\n get base10String() {\n return this.id.toString(10)\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(): { col: number; row: number; zoom: number } {\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","base10String","id","toString","base16String","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"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/Quadkey.ts","../../src/RelativeDirectionConstantLookup.ts"],"sourcesContent":["export * from './Quadkey.js'\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.js'\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(public key = 0n) {\n assertMaxBitUint(key)\n this.guessZoom()\n }\n\n get base10String() {\n return this.id.toString(10)\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(): { col: number; row: number; zoom: number } {\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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,oBAAyB;AACzB,iBAAqD;AACrD,qBAUO;AACP,uBAAmC;;;ACb5B,IAAM,kCAA0D;AAAA,EACrE,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;;;ADYA,IAAM,WAAW;AAEV,IAAM,YAAY,CAAC,QAA0B,KAAK,SAAS,QAAQ;AAE1E,IAAM,YAAY,MAAM,OAAO;AAC/B,IAAM,YAAY,SAAS;AAC3B,IAAM,UAAU,YAAY;AAE5B,IAAM,mBAAmB,CAAC,OAAe,OAAO,SAAS;AACvD,8BAAS,QAAQ,MAAM,QAAQ,SAAS,GAAG,MAAM,qBAAqB;AACxE;AAEO,IAAM,UAAN,MAAM,SAAQ;AAAA,EASnB,YAAmB,MAAM,IAAI;AAAV;AACjB,qBAAiB,GAAG;AACpB,SAAK,UAAU;AAAA,EACjB;AAAA,EAXA,OAAO,OAAO,SAAQ,KAAK,GAAG,EAAE;AAAA,EAChC,OAAO,OAAO,IAAI,SAAQ;AAAA,EAC1B,OAAO,OAAO;AAAA,EAEd,OAAO,SAAQ;AAAA,EAEP;AAAA,EAOR,IAAI,eAAe;AACjB,WAAO,KAAK,GAAG,SAAS,EAAE;AAAA,EAC5B;AAAA,EAEA,IAAI,eAAe;AACjB,WAAO,KAAK,GAAG,SAAS,EAAE,EAAE,SAAS,IAAI,GAAG;AAAA,EAC9C;AAAA,EAEA,IAAI,YAAY;AACd,WAAO,KAAK,GAAG,SAAS,CAAC,EAAE,SAAS,KAAK,MAAM,GAAG;AAAA,EACpD;AAAA,EAEA,IAAI,iBAAiB;AACnB,UAAM,OAAO,KAAK;AAClB,WAAO,KAAK,WAAW,IAAI,QAAQ;AAAA,EACrC;AAAA,EAEA,IAAI,cAAmC;AACrC,eAAO,kCAAkB,KAAK,IAAI;AAAA,EACpC;AAAA,EAEA,IAAI,SAAS;AACX,UAAM,aAAS,oCAAoB,KAAK,WAAW;AACnD,WAAO,IAAI,wBAAO,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AAAA,EACxC;AAAA,EAEA,IAAI,WAAW;AACb,gCAAS,KAAK,OAAO,WAAW,GAAG,MAAM,sCAAsC;AAC/E,UAAM,SAAoB,CAAC;AAC3B,UAAM,YAAY,KAAK,MAAM;AAC7B,aAAS,IAAI,IAAI,IAAI,IAAI,KAAK;AAC5B,aAAO,KAAK,IAAI,SAAQ,EAAE,MAAM,YAAY,CAAC,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC;AAAA,IACvE;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,eAA2D;AAC7D,UAAM,eAAW,gCAAgB,KAAK,SAAS;AAE/C,WAAO;AAAA,MACL,KAAK,KAAK,SAAS,CAAC,IAAI,SAAS,CAAC,IAAI;AAAA,MACtC,KAAK,SAAS,CAAC;AAAA,MACf,MAAM,SAAS,CAAC;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,IAAI,KAAK;AACP,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,IAAI,SAA8B;AAChC,QAAI,KAAK,OAAO,GAAG;AACjB,aAAO,IAAI,SAAQ,EAAE,MAAM,KAAK,MAAM,EAAE,EAAE,QAAQ,KAAK,OAAO,CAAC;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,IAAI,WAAW;AACb,UAAM,eAAW,wBAAS,KAAK,QAAQ,UAAU,MAAM,4BAA4B,KAAK,SAAS,EAAE;AACnG,UAAM,mBAAmB,SAAS,OAAO,CAAC,YAAY,QAAQ,QAAQ,KAAK,GAAG;AAC9E,gCAAS,iBAAiB,WAAW,GAAG,MAAM,yBAAyB,iBAAiB,MAAM,GAAG;AACjG,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,OAAqB;AACvB,eAAO,gCAAgB,KAAK,SAAS;AAAA,EACvC;AAAA,EAEA,IAAI,QAAQ;AAEV,WAAO,KAAK,GAAG,SAAS,CAAC,MAAM,KAAK,UAAU,SAAS,IAAI,GAAG;AAAA,EAChE;AAAA,EAEA,IAAI,OAAO;AAET,WAAO,QAAQ,KAAK,MAAM,cAAc,IAAI;AAAA,EAC9C;AAAA,EAEA,OAAO,KAAK,MAAc,IAAY;AACpC,WAAO,IAAI,SAAQ,EAAE,MAAM,EAAE,EAAE,QAAQ,IAAI;AAAA,EAC7C;AAAA,EAEA,OAAO,gBAAgB,MAAc,IAAiB;AACpD,WAAO,IAAI,SAAQ,EAAE,MAAM,WAAO,+BAAmB,IAAI,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI;AAAA,EAC3F;AAAA,EAEA,OAAO,iBAAiB,OAAe;AACrC,WAAO,IAAI,SAAQ,WAAO,6BAAiB,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC;AAAA,EACtE;AAAA,EAEA,OAAO,gBAAgB,OAAgB;AACrC,QAAI,UAAU,SAAS,UAAU,MAAM,UAAU,QAAW;AAC1D,aAAO,SAAQ;AAAA,IACjB;AACA,QAAI,KAAK;AACT,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,SAAS,OAAO,SAAS,MAAM,CAAC,CAAC;AACvC,kCAAS,SAAS,KAAK,UAAU,GAAG,MAAM,yBAAyB,KAAK,EAAE;AAC1E,WAAM,MAAM,KAAM,OAAO,MAAM;AAAA,IACjC;AACA,WAAO,IAAI,SAAQ,EAAE,MAAM,EAAE,EAAE,QAAQ,MAAM,MAAM;AAAA,EACrD;AAAA,EAEA,OAAO,gBAAgB,aAAkC,MAAc;AACrE,UAAM,YAAQ,qCAAqB,aAAa,KAAK,MAAM,IAAI,CAAC;AAChE,UAAM,SAAoB,CAAC;AAC3B,eAAW,QAAQ,OAAO;AACxB,aAAO,SAAK,wBAAS,SAAQ,SAAS,IAAI,GAAG,MAAM,aAAa,CAAC;AAAA,IACnE;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,WAAW,OAAmB,MAAc;AACjD,UAAM,WAAO,8BAAc,wBAAO,QAAQ,KAAK,GAAG,IAAI;AACtD,UAAM,oBAAgB,8BAAc,IAAI;AACxC,WAAO,SAAQ,gBAAgB,aAAa;AAAA,EAC9C;AAAA,EAEA,OAAO,WAAW,MAAc,IAAY,OAAO,IAAI;AACrD,YAAQ,MAAM;AAAA,MACZ,KAAK,IAAI;AACP,eAAO,SAAQ,iBAAiB,EAAE,EAAE,QAAQ,IAAI;AAAA,MAClD;AAAA,MACA,SAAS;AACP,cAAM,IAAI,MAAM,iBAAiB,IAAI,GAAG;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,SAAS,MAAoB;AAClC,WAAO,SAAQ,oBAAgB,8BAAc,IAAI,CAAC;AAAA,EACpD;AAAA,EAEA,eAAe,MAAc;AAE3B,QAAI,QAAQ,SAAS,KAAK,MAAM;AAC9B,aAAO,CAAC,IAAI;AAAA,IACd;AAGA,QAAI,aAAwB,CAAC;AAC7B,eAAW,WAAW,KAAK,UAAU;AACnC,mBAAa,CAAC,GAAG,YAAY,GAAG,QAAQ,eAAe,IAAI,CAAC;AAAA,IAC9D;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ;AACN,WAAO,IAAI,SAAQ,KAAK,GAAG;AAAA,EAC7B;AAAA,EAEA,OAAO,KAAuB;AAC5B,WAAO,IAAI,OAAO,KAAK;AAAA,EACzB;AAAA,EAEA,UAAU;AACR,SAAK,WAAW,KAAK,YAAY,IAAI,uBAAQ,KAAK,SAAS;AAC3D,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,mBAAmB,MAAc;AAC/B,UAAM,OAAO,KAAK;AAClB,QAAI,QAAQ;AACZ,QAAI,OAAO;AACX,QAAI,MAAM;AACV,QAAI,YAAY;AAChB,WAAO,QAAQ,KAAK,QAAQ;AAC1B,oBAAc;AACd,cAAQ,KAAK,KAAK,GAAG;AAAA,QACnB,KAAK,KAAK;AACR,kBAAQ;AACR;AAAA,QACF;AAAA,QACA,KAAK,KAAK;AACR,iBAAO;AACP;AAAA,QACF;AAAA,QACA,KAAK,KAAK;AACR,kBAAQ;AACR,iBAAO;AACP;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AACA,QAAI,YAAY,GAAG;AACjB,kBAAY;AAAA,IACd;AACA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,kBAAkB;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,gBAAgB,aAAkC;AAChD,UAAM,sBAAkB,kCAAkB,KAAK,IAAI;AACnD,WACE,YAAY,SAAS,gBAAgB,aAAa,CAAC,KACnD,YAAY,SAAS,gBAAgB,aAAa,CAAC,KACnD,YAAY,SAAS,gBAAgB,aAAa,CAAC,KACnD,YAAY,SAAS,gBAAgB,aAAa,CAAC;AAAA,EAEvD;AAAA,EAEA,SAAS,WAAmB;AAC1B,UAAM,wBAAoB,wBAAS,gCAAgC,SAAS,GAAG,MAAM,mBAAmB;AACxG,QAAI,UAAU,KAAK;AACnB,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,QAAQ,SAAS;AAC7B,WAAO,SAAS,GAAG;AACjB,UAAI,SAAS,OAAO,SAAS,QAAQ,OAAO,KAAK,CAAC;AAClD,gBAAU;AACV,UAAI,SAAS,GAAG;AACd,kBAAU;AACV,kBAAU,QAAQ,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC,IAAI,OAAO,SAAS,IAAI,QAAQ,MAAM,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC;AACzG;AAAA,MACF,WAAW,SAAS,GAAG;AACrB,kBAAU;AACV,kBAAU,QAAQ,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC,IAAI,OAAO,SAAS,IAAI,QAAQ,MAAM,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC;AACzG;AAAA,MACF,OAAO;AACL,gBAAQ;AAAA,MACV;AAAA,IACF;AACA,WAAO,SAAQ,gBAAgB,OAAO;AAAA,EACxC;AAAA,EAEA,MAAM,IAAY;AAChB,qBAAiB,IAAI,IAAI;AACzB,SAAK,OAAO,KAAK,MAAM,EAAE;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,MAAc,KAAa;AAChC,qBAAiB,GAAG;AACpB,SAAK,MAAM;AACX,SAAK,QAAQ,IAAI;AACjB,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,MAAc;AACpB,gCAAS,OAAO,UAAU,MAAM,iBAAiB,IAAI,SAAS,QAAQ,EAAE;AACxE,SAAK,MAAO,KAAK,MAAM,UAAY,OAAO,IAAI,KAAK;AACnD,WAAO;AAAA,EACT;AAAA,EAEA,SAAiB;AACf,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,WAAW;AACT,WAAO,KAAK;AAAA,EACd;AAAA,EAEU,YAAY;AACpB,UAAM,gBAAgB,KAAK,GAAG,SAAS,CAAC;AACxC,SAAK,QAAQ,cAAc,MAAM;AAAA,EACnC;AACF;","names":[]}
@@ -1,10 +1,15 @@
1
- var __defProp = Object.defineProperty;
2
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
-
4
1
  // src/Quadkey.ts
5
2
  import { assertEx } from "@xylabs/assert";
6
3
  import { hexFromArrayBuffer, hexFromHexString } from "@xylabs/hex";
7
- import { boundingBoxToCenter, GeoJson, tileFromPoint, tileFromQuadkey, tilesFromBoundingBox, tileToBoundingBox, tileToQuadkey } from "@xyo-network/sdk-geo";
4
+ import {
5
+ boundingBoxToCenter,
6
+ GeoJson,
7
+ tileFromPoint,
8
+ tileFromQuadkey,
9
+ tilesFromBoundingBox,
10
+ tileToBoundingBox,
11
+ tileToQuadkey
12
+ } from "@xyo-network/sdk-geo";
8
13
  import { LngLat } from "mapbox-gl";
9
14
 
10
15
  // src/RelativeDirectionConstantLookup.ts
@@ -17,29 +22,24 @@ var RelativeDirectionConstantLookup = {
17
22
 
18
23
  // src/Quadkey.ts
19
24
  var MAX_ZOOM = 124;
20
- var isQuadkey = /* @__PURE__ */ __name((obj) => obj?.type === Quadkey.type, "isQuadkey");
25
+ var isQuadkey = (obj) => obj?.type === Quadkey.type;
21
26
  var FULL_MASK = 2n ** 256n - 1n;
22
27
  var ZOOM_MASK = 0xffn << 248n;
23
28
  var ID_MASK = ZOOM_MASK ^ FULL_MASK;
24
- var assertMaxBitUint = /* @__PURE__ */ __name((value, bits = 256n) => {
29
+ var assertMaxBitUint = (value, bits = 256n) => {
25
30
  assertEx(value < 2n ** bits && value >= 0, () => "Not a 256 Bit Uint!");
26
- }, "assertMaxBitUint");
31
+ };
27
32
  var Quadkey = class _Quadkey {
28
- static {
29
- __name(this, "Quadkey");
30
- }
31
- key;
32
- static Zero = _Quadkey.from(0, 0n);
33
- static root = new _Quadkey();
34
- static type = "Quadkey";
35
- type;
36
- _geoJson;
37
33
  constructor(key = 0n) {
38
34
  this.key = key;
39
- this.type = _Quadkey.type;
40
35
  assertMaxBitUint(key);
41
36
  this.guessZoom();
42
37
  }
38
+ static Zero = _Quadkey.from(0, 0n);
39
+ static root = new _Quadkey();
40
+ static type = "Quadkey";
41
+ type = _Quadkey.type;
42
+ _geoJson;
43
43
  get base10String() {
44
44
  return this.id.toString(10);
45
45
  }
@@ -104,14 +104,10 @@ var Quadkey = class _Quadkey {
104
104
  return new _Quadkey().setId(id).setZoom(zoom);
105
105
  }
106
106
  static fromArrayBuffer(zoom, id) {
107
- return new _Quadkey().setId(BigInt(hexFromArrayBuffer(id, {
108
- prefix: true
109
- }))).setZoom(zoom);
107
+ return new _Quadkey().setId(BigInt(hexFromArrayBuffer(id, { prefix: true }))).setZoom(zoom);
110
108
  }
111
109
  static fromBase16String(value) {
112
- return new _Quadkey(BigInt(hexFromHexString(value, {
113
- prefix: true
114
- })));
110
+ return new _Quadkey(BigInt(hexFromHexString(value, { prefix: true })));
115
111
  }
116
112
  static fromBase4String(value) {
117
113
  if (value === "fhr" || value === "" || value === void 0) {
@@ -153,16 +149,11 @@ var Quadkey = class _Quadkey {
153
149
  }
154
150
  childrenByZoom(zoom) {
155
151
  if (zoom && zoom === this.zoom) {
156
- return [
157
- this
158
- ];
152
+ return [this];
159
153
  }
160
154
  let deepResult = [];
161
155
  for (const quadkey of this.children) {
162
- deepResult = [
163
- ...deepResult,
164
- ...quadkey.childrenByZoom(zoom)
165
- ];
156
+ deepResult = [...deepResult, ...quadkey.childrenByZoom(zoom)];
166
157
  }
167
158
  return deepResult;
168
159
  }
@@ -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.js'\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(public key = 0n) {\n assertMaxBitUint(key)\n this.guessZoom()\n }\n\n get base10String() {\n return this.id.toString(10)\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(): { col: number; row: number; zoom: number } {\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":";;;;AAAA,SAASA,gBAAgB;AACzB,SAASC,oBAAoBC,wBAAwB;AACrD,SACEC,qBACAC,SAGAC,eACAC,iBACAC,sBACAC,mBACAC,qBACK;AACP,SAASC,cAA0B;;;ACb5B,IAAMC,kCAA0D;EACrEC,GAAG;EACHC,GAAG;EACHC,GAAG;EACHC,GAAG;AACL;;;ADYA,IAAMC,WAAW;AAEV,IAAMC,YAAY,wBAACC,QAA0BA,KAAKC,SAASC,QAAQD,MAAjD;AAEzB,IAAME,YAAY,MAAM,OAAO;AAC/B,IAAMC,YAAY,SAAS;AAC3B,IAAMC,UAAUD,YAAYD;AAE5B,IAAMG,mBAAmB,wBAACC,OAAeC,OAAO,SAAI;AAClDC,WAASF,QAAQ,MAAMC,QAAQD,SAAS,GAAG,MAAM,qBAAA;AACnD,GAFyB;AAIlB,IAAML,UAAN,MAAMA,SAAAA;EA7Bb,OA6BaA;;;;EACX,OAAOQ,OAAOR,SAAQS,KAAK,GAAG,EAAE;EAChC,OAAOC,OAAO,IAAIV,SAAAA;EAClB,OAAOD,OAAO;EAEdA;EAEQY;EAERC,YAAmBC,MAAM,IAAI;SAAVA,MAAAA;SAJnBd,OAAOC,SAAQD;AAKbK,qBAAiBS,GAAAA;AACjB,SAAKC,UAAS;EAChB;EAEA,IAAIC,eAAe;AACjB,WAAO,KAAKC,GAAGC,SAAS,EAAA;EAC1B;EAEA,IAAIC,eAAe;AACjB,WAAO,KAAKF,GAAGC,SAAS,EAAA,EAAIE,SAAS,IAAI,GAAA;EAC3C;EAEA,IAAIC,YAAY;AACd,WAAO,KAAKJ,GAAGC,SAAS,CAAA,EAAGE,SAAS,KAAKE,MAAM,GAAA;EACjD;EAEA,IAAIC,iBAAiB;AACnB,UAAMC,OAAO,KAAKH;AAClB,WAAOG,KAAKC,WAAW,IAAI,QAAQD;EACrC;EAEA,IAAIE,cAAmC;AACrC,WAAOC,kBAAkB,KAAKC,IAAI;EACpC;EAEA,IAAIC,SAAS;AACX,UAAMC,SAASC,oBAAoB,KAAKL,WAAW;AACnD,WAAO,IAAIM,OAAOF,OAAO,CAAA,GAAIA,OAAO,CAAA,CAAE;EACxC;EAEA,IAAIG,WAAW;AACbzB,aAAS,KAAKc,OAAOzB,WAAW,GAAG,MAAM,sCAAA;AACzC,UAAMiC,SAAoB,CAAA;AAC1B,UAAMI,YAAY,KAAKjB,MAAM;AAC7B,aAASkB,IAAI,IAAIA,IAAI,IAAIA,KAAK;AAC5BL,aAAOM,KAAK,IAAInC,SAAAA,EAAUoC,MAAMH,YAAYC,CAAAA,EAAGG,QAAQ,KAAKhB,OAAO,CAAA,CAAA;IACrE;AACA,WAAOQ;EACT;EAEA,IAAIS,eAA2D;AAC7D,UAAMC,WAAWC,gBAAgB,KAAKpB,SAAS;AAE/C,WAAO;MACLqB,KAAK,KAAKF,SAAS,CAAA,IAAKA,SAAS,CAAA,IAAK;MACtCG,KAAKH,SAAS,CAAA;MACdlB,MAAMkB,SAAS,CAAA;IACjB;EACF;EAEA,IAAIvB,KAAK;AACP,WAAO,KAAKH,MAAMV;EACpB;EAEA,IAAIwC,SAA8B;AAChC,QAAI,KAAKtB,OAAO,GAAG;AACjB,aAAO,IAAIrB,SAAAA,EAAUoC,MAAM,KAAKpB,MAAM,EAAE,EAAEqB,QAAQ,KAAKhB,OAAO,CAAA;IAChE;EACF;EAEA,IAAIuB,WAAW;AACb,UAAMA,WAAWrC,SAAS,KAAKoC,QAAQX,UAAU,MAAM,4BAA4B,KAAKZ,SAAS,EAAE;AACnG,UAAMyB,mBAAmBD,SAASE,OAAO,CAACC,YAAYA,QAAQlC,QAAQ,KAAKA,GAAG;AAC9EN,aAASsC,iBAAiBrB,WAAW,GAAG,MAAM,yBAAyBqB,iBAAiBrB,MAAM,GAAG;AACjG,WAAOqB;EACT;EAEA,IAAIlB,OAAqB;AACvB,WAAOa,gBAAgB,KAAKpB,SAAS;EACvC;EAEA,IAAI4B,QAAQ;AAEV,WAAO,KAAKhC,GAAGC,SAAS,CAAA,MAAO,KAAKG,UAAUD,SAAS,IAAI,GAAA;EAC7D;EAEA,IAAIE,OAAO;AAET,WAAO4B,QAAQ,KAAKpC,MAAMX,cAAc,IAAI;EAC9C;EAEA,OAAOO,KAAKY,MAAcL,IAAY;AACpC,WAAO,IAAIhB,SAAAA,EAAUoC,MAAMpB,EAAAA,EAAIqB,QAAQhB,IAAAA;EACzC;EAEA,OAAO6B,gBAAgB7B,MAAcL,IAAiB;AACpD,WAAO,IAAIhB,SAAAA,EAAUoC,MAAMe,OAAOC,mBAAmBpC,IAAI;MAAEqC,QAAQ;IAAK,CAAA,CAAA,CAAA,EAAKhB,QAAQhB,IAAAA;EACvF;EAEA,OAAOiC,iBAAiBjD,OAAe;AACrC,WAAO,IAAIL,SAAQmD,OAAOI,iBAAiBlD,OAAO;MAAEgD,QAAQ;IAAK,CAAA,CAAA,CAAA;EACnE;EAEA,OAAOG,gBAAgBnD,OAAgB;AACrC,QAAIA,UAAU,SAASA,UAAU,MAAMA,UAAUoD,QAAW;AAC1D,aAAOzD,SAAQU;IACjB;AACA,QAAIM,KAAK;AACT,aAASkB,IAAI,GAAGA,IAAI7B,MAAMmB,QAAQU,KAAK;AACrC,YAAMwB,SAAST,OAAOU,SAAStD,MAAM6B,CAAAA,CAAE;AACvC3B,eAASmD,SAAS,KAAKA,UAAU,GAAG,MAAM,yBAAyBrD,KAAAA,EAAO;AAC1EW,WAAMA,MAAM,KAAMmC,OAAOO,MAAAA;IAC3B;AACA,WAAO,IAAI1D,SAAAA,EAAUoC,MAAMpB,EAAAA,EAAIqB,QAAQhC,MAAMmB,MAAM;EACrD;EAEA,OAAOoC,gBAAgBnC,aAAkCJ,MAAc;AACrE,UAAMwC,QAAQC,qBAAqBrC,aAAasC,KAAKC,MAAM3C,IAAAA,CAAAA;AAC3D,UAAMQ,SAAoB,CAAA;AAC1B,eAAWF,QAAQkC,OAAO;AACxBhC,aAAOM,KAAK5B,SAASP,SAAQiE,SAAStC,IAAAA,GAAO,MAAM,aAAA,CAAA;IACrD;AAEA,WAAOE;EACT;EAEA,OAAOqC,WAAWC,OAAmB9C,MAAc;AACjD,UAAMM,OAAOyC,cAAcrC,OAAOsC,QAAQF,KAAAA,GAAQ9C,IAAAA;AAClD,UAAMiD,gBAAgBC,cAAc5C,IAAAA;AACpC,WAAO3B,SAAQwD,gBAAgBc,aAAAA;EACjC;EAEA,OAAOE,WAAWnD,MAAcL,IAAYyD,OAAO,IAAI;AACrD,YAAQA,MAAAA;MACN,KAAK,IAAI;AACP,eAAOzE,SAAQsD,iBAAiBtC,EAAAA,EAAIqB,QAAQhB,IAAAA;MAC9C;MACA,SAAS;AACP,cAAM,IAAIqD,MAAM,iBAAiBD,IAAAA,GAAO;MAC1C;IACF;EACF;EAEA,OAAOR,SAAStC,MAAoB;AAClC,WAAO3B,SAAQwD,gBAAgBe,cAAc5C,IAAAA,CAAAA;EAC/C;EAEAgD,eAAetD,MAAc;AAE3B,QAAIA,QAAQA,SAAS,KAAKA,MAAM;AAC9B,aAAO;QAAC;;IACV;AAGA,QAAIuD,aAAwB,CAAA;AAC5B,eAAW7B,WAAW,KAAKf,UAAU;AACnC4C,mBAAa;WAAIA;WAAe7B,QAAQ4B,eAAetD,IAAAA;;IACzD;AACA,WAAOuD;EACT;EAEAC,QAAQ;AACN,WAAO,IAAI7E,SAAQ,KAAKa,GAAG;EAC7B;EAEAiE,OAAOhF,KAAuB;AAC5B,WAAOA,IAAIe,OAAO,KAAKA;EACzB;EAEAkE,UAAU;AACR,SAAKpE,WAAW,KAAKA,YAAY,IAAIqE,QAAQ,KAAK5D,SAAS;AAC3D,WAAO,KAAKT;EACd;EAEAsE,mBAAmBC,MAAc;AAC/B,UAAM3D,OAAO,KAAKH;AAClB,QAAI+D,QAAQ;AACZ,QAAIC,OAAO;AACX,QAAIC,MAAM;AACV,QAAIC,YAAYJ;AAChB,WAAOC,QAAQ5D,KAAKC,QAAQ;AAC1B8D,oBAAc;AACd,cAAQ/D,KAAK4D,KAAAA,GAAM;QACjB,KAAK,KAAK;AACRC,kBAAQE;AACR;QACF;QACA,KAAK,KAAK;AACRD,iBAAOC;AACP;QACF;QACA,KAAK,KAAK;AACRF,kBAAQE;AACRD,iBAAOC;AACP;QACF;MACF;AACAH;IACF;AACA,QAAIG,YAAY,GAAG;AACjBA,kBAAY;IACd;AACA,WAAO;MACLC,QAAQD;MACRF;MACAC;MACAG,OAAOF;IACT;EACF;;EAGAG,kBAAkB;AAChB,WAAO,KAAKnD;EACd;EAEAoD,gBAAgBjE,aAAkC;AAChD,UAAMkE,kBAAkBjE,kBAAkB,KAAKC,IAAI;AACnD,WACEF,YAAYmE,SAASD,gBAAgBE,aAAY,CAAA,KACjDpE,YAAYmE,SAASD,gBAAgBG,aAAY,CAAA,KACjDrE,YAAYmE,SAASD,gBAAgBI,aAAY,CAAA,KACjDtE,YAAYmE,SAASD,gBAAgBK,aAAY,CAAA;EAErD;EAEAC,SAASC,WAAmB;AAC1B,UAAMC,oBAAoB5F,SAAS6F,gCAAgCF,SAAAA,GAAY,MAAM,mBAAA;AACrF,QAAInD,UAAU,KAAK3B;AACnB,QAAI2B,QAAQvB,WAAW,GAAG;AACxB,aAAO;IACT;AACA,QAAI2D,QAAQpC,QAAQvB,SAAS;AAC7B,WAAO2D,SAAS,GAAG;AACjB,UAAIkB,SAASpD,OAAOU,SAASZ,QAAQuD,OAAOnB,KAAAA,CAAAA;AAC5CkB,gBAAUF;AACV,UAAIE,SAAS,GAAG;AACdA,kBAAU;AACVtD,kBAAUA,QAAQwD,MAAM,GAAGxC,KAAKyC,IAAI,GAAGrB,KAAAA,CAAAA,IAAUkB,OAAOpF,SAAQ,IAAK8B,QAAQwD,MAAMxC,KAAKyC,IAAI,GAAGrB,QAAQ,CAAA,CAAA;AACvGA;MACF,WAAWkB,SAAS,GAAG;AACrBA,kBAAU;AACVtD,kBAAUA,QAAQwD,MAAM,GAAGxC,KAAKyC,IAAI,GAAGrB,KAAAA,CAAAA,IAAUkB,OAAOpF,SAAQ,IAAK8B,QAAQwD,MAAMxC,KAAKyC,IAAI,GAAGrB,QAAQ,CAAA,CAAA;AACvGA;MACF,OAAO;AACLA,gBAAQ;MACV;IACF;AACA,WAAOnF,SAAQwD,gBAAgBT,OAAAA;EACjC;EAEAX,MAAMpB,IAAY;AAChBZ,qBAAiBY,IAAI,IAAI;AACzB,SAAKyF,OAAO,KAAKpF,MAAML,EAAAA;AACvB,WAAO;EACT;EAEAyF,OAAOpF,MAAcR,KAAa;AAChCT,qBAAiBS,GAAAA;AACjB,SAAKA,MAAMA;AACX,SAAKwB,QAAQhB,IAAAA;AACb,WAAO;EACT;EAEAgB,QAAQhB,MAAc;AACpBd,aAASc,OAAOzB,UAAU,MAAM,iBAAiByB,IAAAA,SAAazB,QAAAA,EAAU;AACxE,SAAKiB,MAAO,KAAKA,MAAMV,UAAYgD,OAAO9B,IAAAA,KAAS;AACnD,WAAO;EACT;EAEAqF,SAAiB;AACf,WAAO,KAAKpF;EACd;EAEAL,WAAW;AACT,WAAO,KAAKG;EACd;EAEUN,YAAY;AACpB,UAAM6F,gBAAgB,KAAK3F,GAAGC,SAAS,CAAA;AACvC,SAAKoB,QAAQsE,cAAcnF,MAAM;EACnC;AACF;","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","base10String","id","toString","base16String","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"]}
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.js'\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(public key = 0n) {\n assertMaxBitUint(key)\n this.guessZoom()\n }\n\n get base10String() {\n return this.id.toString(10)\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(): { col: number; row: number; zoom: number } {\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":";AAAA,SAAS,gBAAgB;AACzB,SAAS,oBAAoB,wBAAwB;AACrD;AAAA,EACE;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAA0B;;;ACb5B,IAAM,kCAA0D;AAAA,EACrE,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;;;ADYA,IAAM,WAAW;AAEV,IAAM,YAAY,CAAC,QAA0B,KAAK,SAAS,QAAQ;AAE1E,IAAM,YAAY,MAAM,OAAO;AAC/B,IAAM,YAAY,SAAS;AAC3B,IAAM,UAAU,YAAY;AAE5B,IAAM,mBAAmB,CAAC,OAAe,OAAO,SAAS;AACvD,WAAS,QAAQ,MAAM,QAAQ,SAAS,GAAG,MAAM,qBAAqB;AACxE;AAEO,IAAM,UAAN,MAAM,SAAQ;AAAA,EASnB,YAAmB,MAAM,IAAI;AAAV;AACjB,qBAAiB,GAAG;AACpB,SAAK,UAAU;AAAA,EACjB;AAAA,EAXA,OAAO,OAAO,SAAQ,KAAK,GAAG,EAAE;AAAA,EAChC,OAAO,OAAO,IAAI,SAAQ;AAAA,EAC1B,OAAO,OAAO;AAAA,EAEd,OAAO,SAAQ;AAAA,EAEP;AAAA,EAOR,IAAI,eAAe;AACjB,WAAO,KAAK,GAAG,SAAS,EAAE;AAAA,EAC5B;AAAA,EAEA,IAAI,eAAe;AACjB,WAAO,KAAK,GAAG,SAAS,EAAE,EAAE,SAAS,IAAI,GAAG;AAAA,EAC9C;AAAA,EAEA,IAAI,YAAY;AACd,WAAO,KAAK,GAAG,SAAS,CAAC,EAAE,SAAS,KAAK,MAAM,GAAG;AAAA,EACpD;AAAA,EAEA,IAAI,iBAAiB;AACnB,UAAM,OAAO,KAAK;AAClB,WAAO,KAAK,WAAW,IAAI,QAAQ;AAAA,EACrC;AAAA,EAEA,IAAI,cAAmC;AACrC,WAAO,kBAAkB,KAAK,IAAI;AAAA,EACpC;AAAA,EAEA,IAAI,SAAS;AACX,UAAM,SAAS,oBAAoB,KAAK,WAAW;AACnD,WAAO,IAAI,OAAO,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AAAA,EACxC;AAAA,EAEA,IAAI,WAAW;AACb,aAAS,KAAK,OAAO,WAAW,GAAG,MAAM,sCAAsC;AAC/E,UAAM,SAAoB,CAAC;AAC3B,UAAM,YAAY,KAAK,MAAM;AAC7B,aAAS,IAAI,IAAI,IAAI,IAAI,KAAK;AAC5B,aAAO,KAAK,IAAI,SAAQ,EAAE,MAAM,YAAY,CAAC,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC;AAAA,IACvE;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,eAA2D;AAC7D,UAAM,WAAW,gBAAgB,KAAK,SAAS;AAE/C,WAAO;AAAA,MACL,KAAK,KAAK,SAAS,CAAC,IAAI,SAAS,CAAC,IAAI;AAAA,MACtC,KAAK,SAAS,CAAC;AAAA,MACf,MAAM,SAAS,CAAC;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,IAAI,KAAK;AACP,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,IAAI,SAA8B;AAChC,QAAI,KAAK,OAAO,GAAG;AACjB,aAAO,IAAI,SAAQ,EAAE,MAAM,KAAK,MAAM,EAAE,EAAE,QAAQ,KAAK,OAAO,CAAC;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,IAAI,WAAW;AACb,UAAM,WAAW,SAAS,KAAK,QAAQ,UAAU,MAAM,4BAA4B,KAAK,SAAS,EAAE;AACnG,UAAM,mBAAmB,SAAS,OAAO,CAAC,YAAY,QAAQ,QAAQ,KAAK,GAAG;AAC9E,aAAS,iBAAiB,WAAW,GAAG,MAAM,yBAAyB,iBAAiB,MAAM,GAAG;AACjG,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,OAAqB;AACvB,WAAO,gBAAgB,KAAK,SAAS;AAAA,EACvC;AAAA,EAEA,IAAI,QAAQ;AAEV,WAAO,KAAK,GAAG,SAAS,CAAC,MAAM,KAAK,UAAU,SAAS,IAAI,GAAG;AAAA,EAChE;AAAA,EAEA,IAAI,OAAO;AAET,WAAO,QAAQ,KAAK,MAAM,cAAc,IAAI;AAAA,EAC9C;AAAA,EAEA,OAAO,KAAK,MAAc,IAAY;AACpC,WAAO,IAAI,SAAQ,EAAE,MAAM,EAAE,EAAE,QAAQ,IAAI;AAAA,EAC7C;AAAA,EAEA,OAAO,gBAAgB,MAAc,IAAiB;AACpD,WAAO,IAAI,SAAQ,EAAE,MAAM,OAAO,mBAAmB,IAAI,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI;AAAA,EAC3F;AAAA,EAEA,OAAO,iBAAiB,OAAe;AACrC,WAAO,IAAI,SAAQ,OAAO,iBAAiB,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC;AAAA,EACtE;AAAA,EAEA,OAAO,gBAAgB,OAAgB;AACrC,QAAI,UAAU,SAAS,UAAU,MAAM,UAAU,QAAW;AAC1D,aAAO,SAAQ;AAAA,IACjB;AACA,QAAI,KAAK;AACT,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,SAAS,OAAO,SAAS,MAAM,CAAC,CAAC;AACvC,eAAS,SAAS,KAAK,UAAU,GAAG,MAAM,yBAAyB,KAAK,EAAE;AAC1E,WAAM,MAAM,KAAM,OAAO,MAAM;AAAA,IACjC;AACA,WAAO,IAAI,SAAQ,EAAE,MAAM,EAAE,EAAE,QAAQ,MAAM,MAAM;AAAA,EACrD;AAAA,EAEA,OAAO,gBAAgB,aAAkC,MAAc;AACrE,UAAM,QAAQ,qBAAqB,aAAa,KAAK,MAAM,IAAI,CAAC;AAChE,UAAM,SAAoB,CAAC;AAC3B,eAAW,QAAQ,OAAO;AACxB,aAAO,KAAK,SAAS,SAAQ,SAAS,IAAI,GAAG,MAAM,aAAa,CAAC;AAAA,IACnE;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,WAAW,OAAmB,MAAc;AACjD,UAAM,OAAO,cAAc,OAAO,QAAQ,KAAK,GAAG,IAAI;AACtD,UAAM,gBAAgB,cAAc,IAAI;AACxC,WAAO,SAAQ,gBAAgB,aAAa;AAAA,EAC9C;AAAA,EAEA,OAAO,WAAW,MAAc,IAAY,OAAO,IAAI;AACrD,YAAQ,MAAM;AAAA,MACZ,KAAK,IAAI;AACP,eAAO,SAAQ,iBAAiB,EAAE,EAAE,QAAQ,IAAI;AAAA,MAClD;AAAA,MACA,SAAS;AACP,cAAM,IAAI,MAAM,iBAAiB,IAAI,GAAG;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,SAAS,MAAoB;AAClC,WAAO,SAAQ,gBAAgB,cAAc,IAAI,CAAC;AAAA,EACpD;AAAA,EAEA,eAAe,MAAc;AAE3B,QAAI,QAAQ,SAAS,KAAK,MAAM;AAC9B,aAAO,CAAC,IAAI;AAAA,IACd;AAGA,QAAI,aAAwB,CAAC;AAC7B,eAAW,WAAW,KAAK,UAAU;AACnC,mBAAa,CAAC,GAAG,YAAY,GAAG,QAAQ,eAAe,IAAI,CAAC;AAAA,IAC9D;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ;AACN,WAAO,IAAI,SAAQ,KAAK,GAAG;AAAA,EAC7B;AAAA,EAEA,OAAO,KAAuB;AAC5B,WAAO,IAAI,OAAO,KAAK;AAAA,EACzB;AAAA,EAEA,UAAU;AACR,SAAK,WAAW,KAAK,YAAY,IAAI,QAAQ,KAAK,SAAS;AAC3D,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,mBAAmB,MAAc;AAC/B,UAAM,OAAO,KAAK;AAClB,QAAI,QAAQ;AACZ,QAAI,OAAO;AACX,QAAI,MAAM;AACV,QAAI,YAAY;AAChB,WAAO,QAAQ,KAAK,QAAQ;AAC1B,oBAAc;AACd,cAAQ,KAAK,KAAK,GAAG;AAAA,QACnB,KAAK,KAAK;AACR,kBAAQ;AACR;AAAA,QACF;AAAA,QACA,KAAK,KAAK;AACR,iBAAO;AACP;AAAA,QACF;AAAA,QACA,KAAK,KAAK;AACR,kBAAQ;AACR,iBAAO;AACP;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AACA,QAAI,YAAY,GAAG;AACjB,kBAAY;AAAA,IACd;AACA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,kBAAkB;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,gBAAgB,aAAkC;AAChD,UAAM,kBAAkB,kBAAkB,KAAK,IAAI;AACnD,WACE,YAAY,SAAS,gBAAgB,aAAa,CAAC,KACnD,YAAY,SAAS,gBAAgB,aAAa,CAAC,KACnD,YAAY,SAAS,gBAAgB,aAAa,CAAC,KACnD,YAAY,SAAS,gBAAgB,aAAa,CAAC;AAAA,EAEvD;AAAA,EAEA,SAAS,WAAmB;AAC1B,UAAM,oBAAoB,SAAS,gCAAgC,SAAS,GAAG,MAAM,mBAAmB;AACxG,QAAI,UAAU,KAAK;AACnB,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,QAAQ,SAAS;AAC7B,WAAO,SAAS,GAAG;AACjB,UAAI,SAAS,OAAO,SAAS,QAAQ,OAAO,KAAK,CAAC;AAClD,gBAAU;AACV,UAAI,SAAS,GAAG;AACd,kBAAU;AACV,kBAAU,QAAQ,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC,IAAI,OAAO,SAAS,IAAI,QAAQ,MAAM,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC;AACzG;AAAA,MACF,WAAW,SAAS,GAAG;AACrB,kBAAU;AACV,kBAAU,QAAQ,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC,IAAI,OAAO,SAAS,IAAI,QAAQ,MAAM,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC;AACzG;AAAA,MACF,OAAO;AACL,gBAAQ;AAAA,MACV;AAAA,IACF;AACA,WAAO,SAAQ,gBAAgB,OAAO;AAAA,EACxC;AAAA,EAEA,MAAM,IAAY;AAChB,qBAAiB,IAAI,IAAI;AACzB,SAAK,OAAO,KAAK,MAAM,EAAE;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,MAAc,KAAa;AAChC,qBAAiB,GAAG;AACpB,SAAK,MAAM;AACX,SAAK,QAAQ,IAAI;AACjB,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,MAAc;AACpB,aAAS,OAAO,UAAU,MAAM,iBAAiB,IAAI,SAAS,QAAQ,EAAE;AACxE,SAAK,MAAO,KAAK,MAAM,UAAY,OAAO,IAAI,KAAK;AACnD,WAAO;AAAA,EACT;AAAA,EAEA,SAAiB;AACf,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,WAAW;AACT,WAAO,KAAK;AAAA,EACd;AAAA,EAEU,YAAY;AACpB,UAAM,gBAAgB,KAAK,GAAG,SAAS,CAAC;AACxC,SAAK,QAAQ,cAAc,MAAM;AAAA,EACnC;AACF;","names":[]}
@@ -3,8 +3,6 @@ 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 });
8
6
  var __export = (target, all) => {
9
7
  for (var name in all)
10
8
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -18,7 +16,6 @@ var __copyProps = (to, from, except, desc) => {
18
16
  return to;
19
17
  };
20
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
22
19
 
23
20
  // src/index.ts
24
21
  var src_exports = {};
@@ -44,23 +41,24 @@ var RelativeDirectionConstantLookup = {
44
41
 
45
42
  // src/Quadkey.ts
46
43
  var MAX_ZOOM = 124;
47
- var isQuadkey = /* @__PURE__ */ __name((obj) => (obj == null ? void 0 : obj.type) === Quadkey.type, "isQuadkey");
44
+ var isQuadkey = (obj) => (obj == null ? void 0 : obj.type) === Quadkey.type;
48
45
  var FULL_MASK = 2n ** 256n - 1n;
49
46
  var ZOOM_MASK = 0xffn << 248n;
50
47
  var ID_MASK = ZOOM_MASK ^ FULL_MASK;
51
- var assertMaxBitUint = /* @__PURE__ */ __name((value, bits = 256n) => {
48
+ var assertMaxBitUint = (value, bits = 256n) => {
52
49
  (0, import_assert.assertEx)(value < 2n ** bits && value >= 0, () => "Not a 256 Bit Uint!");
53
- }, "assertMaxBitUint");
54
- var _Quadkey = class _Quadkey {
55
- key;
56
- type;
57
- _geoJson;
50
+ };
51
+ var Quadkey = class _Quadkey {
58
52
  constructor(key = 0n) {
59
53
  this.key = key;
60
- this.type = _Quadkey.type;
61
54
  assertMaxBitUint(key);
62
55
  this.guessZoom();
63
56
  }
57
+ static Zero = _Quadkey.from(0, 0n);
58
+ static root = new _Quadkey();
59
+ static type = "Quadkey";
60
+ type = _Quadkey.type;
61
+ _geoJson;
64
62
  get base10String() {
65
63
  return this.id.toString(10);
66
64
  }
@@ -126,14 +124,10 @@ var _Quadkey = class _Quadkey {
126
124
  return new _Quadkey().setId(id).setZoom(zoom);
127
125
  }
128
126
  static fromArrayBuffer(zoom, id) {
129
- return new _Quadkey().setId(BigInt((0, import_hex.hexFromArrayBuffer)(id, {
130
- prefix: true
131
- }))).setZoom(zoom);
127
+ return new _Quadkey().setId(BigInt((0, import_hex.hexFromArrayBuffer)(id, { prefix: true }))).setZoom(zoom);
132
128
  }
133
129
  static fromBase16String(value) {
134
- return new _Quadkey(BigInt((0, import_hex.hexFromHexString)(value, {
135
- prefix: true
136
- })));
130
+ return new _Quadkey(BigInt((0, import_hex.hexFromHexString)(value, { prefix: true })));
137
131
  }
138
132
  static fromBase4String(value) {
139
133
  if (value === "fhr" || value === "" || value === void 0) {
@@ -175,16 +169,11 @@ var _Quadkey = class _Quadkey {
175
169
  }
176
170
  childrenByZoom(zoom) {
177
171
  if (zoom && zoom === this.zoom) {
178
- return [
179
- this
180
- ];
172
+ return [this];
181
173
  }
182
174
  let deepResult = [];
183
175
  for (const quadkey of this.children) {
184
- deepResult = [
185
- ...deepResult,
186
- ...quadkey.childrenByZoom(zoom)
187
- ];
176
+ deepResult = [...deepResult, ...quadkey.childrenByZoom(zoom)];
188
177
  }
189
178
  return deepResult;
190
179
  }
@@ -292,11 +281,6 @@ var _Quadkey = class _Quadkey {
292
281
  this.setZoom(quadkeySimple.length);
293
282
  }
294
283
  };
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;
300
284
  // Annotate the CommonJS export names for ESM import in node:
301
285
  0 && (module.exports = {
302
286
  Quadkey,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/Quadkey.ts","../../src/RelativeDirectionConstantLookup.ts"],"sourcesContent":["export * from './Quadkey.js'\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.js'\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(public key = 0n) {\n assertMaxBitUint(key)\n this.guessZoom()\n }\n\n get base10String() {\n return this.id.toString(10)\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(): { col: number; row: number; zoom: number } {\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","base10String","id","toString","base16String","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"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/Quadkey.ts","../../src/RelativeDirectionConstantLookup.ts"],"sourcesContent":["export * from './Quadkey.js'\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.js'\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(public key = 0n) {\n assertMaxBitUint(key)\n this.guessZoom()\n }\n\n get base10String() {\n return this.id.toString(10)\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(): { col: number; row: number; zoom: number } {\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,12 +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) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
-
6
1
  // src/Quadkey.ts
7
2
  import { assertEx } from "@xylabs/assert";
8
3
  import { hexFromArrayBuffer, hexFromHexString } from "@xylabs/hex";
9
- import { boundingBoxToCenter, GeoJson, tileFromPoint, tileFromQuadkey, tilesFromBoundingBox, tileToBoundingBox, tileToQuadkey } from "@xyo-network/sdk-geo";
4
+ import {
5
+ boundingBoxToCenter,
6
+ GeoJson,
7
+ tileFromPoint,
8
+ tileFromQuadkey,
9
+ tilesFromBoundingBox,
10
+ tileToBoundingBox,
11
+ tileToQuadkey
12
+ } from "@xyo-network/sdk-geo";
10
13
  import { LngLat } from "mapbox-gl";
11
14
 
12
15
  // src/RelativeDirectionConstantLookup.ts
@@ -19,23 +22,24 @@ var RelativeDirectionConstantLookup = {
19
22
 
20
23
  // src/Quadkey.ts
21
24
  var MAX_ZOOM = 124;
22
- var isQuadkey = /* @__PURE__ */ __name((obj) => (obj == null ? void 0 : obj.type) === Quadkey.type, "isQuadkey");
25
+ var isQuadkey = (obj) => (obj == null ? void 0 : obj.type) === Quadkey.type;
23
26
  var FULL_MASK = 2n ** 256n - 1n;
24
27
  var ZOOM_MASK = 0xffn << 248n;
25
28
  var ID_MASK = ZOOM_MASK ^ FULL_MASK;
26
- var assertMaxBitUint = /* @__PURE__ */ __name((value, bits = 256n) => {
29
+ var assertMaxBitUint = (value, bits = 256n) => {
27
30
  assertEx(value < 2n ** bits && value >= 0, () => "Not a 256 Bit Uint!");
28
- }, "assertMaxBitUint");
29
- var _Quadkey = class _Quadkey {
30
- key;
31
- type;
32
- _geoJson;
31
+ };
32
+ var Quadkey = class _Quadkey {
33
33
  constructor(key = 0n) {
34
34
  this.key = key;
35
- this.type = _Quadkey.type;
36
35
  assertMaxBitUint(key);
37
36
  this.guessZoom();
38
37
  }
38
+ static Zero = _Quadkey.from(0, 0n);
39
+ static root = new _Quadkey();
40
+ static type = "Quadkey";
41
+ type = _Quadkey.type;
42
+ _geoJson;
39
43
  get base10String() {
40
44
  return this.id.toString(10);
41
45
  }
@@ -101,14 +105,10 @@ var _Quadkey = class _Quadkey {
101
105
  return new _Quadkey().setId(id).setZoom(zoom);
102
106
  }
103
107
  static fromArrayBuffer(zoom, id) {
104
- return new _Quadkey().setId(BigInt(hexFromArrayBuffer(id, {
105
- prefix: true
106
- }))).setZoom(zoom);
108
+ return new _Quadkey().setId(BigInt(hexFromArrayBuffer(id, { prefix: true }))).setZoom(zoom);
107
109
  }
108
110
  static fromBase16String(value) {
109
- return new _Quadkey(BigInt(hexFromHexString(value, {
110
- prefix: true
111
- })));
111
+ return new _Quadkey(BigInt(hexFromHexString(value, { prefix: true })));
112
112
  }
113
113
  static fromBase4String(value) {
114
114
  if (value === "fhr" || value === "" || value === void 0) {
@@ -150,16 +150,11 @@ var _Quadkey = class _Quadkey {
150
150
  }
151
151
  childrenByZoom(zoom) {
152
152
  if (zoom && zoom === this.zoom) {
153
- return [
154
- this
155
- ];
153
+ return [this];
156
154
  }
157
155
  let deepResult = [];
158
156
  for (const quadkey of this.children) {
159
- deepResult = [
160
- ...deepResult,
161
- ...quadkey.childrenByZoom(zoom)
162
- ];
157
+ deepResult = [...deepResult, ...quadkey.childrenByZoom(zoom)];
163
158
  }
164
159
  return deepResult;
165
160
  }
@@ -267,11 +262,6 @@ var _Quadkey = class _Quadkey {
267
262
  this.setZoom(quadkeySimple.length);
268
263
  }
269
264
  };
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;
275
265
  export {
276
266
  Quadkey,
277
267
  isQuadkey
@@ -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.js'\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(public key = 0n) {\n assertMaxBitUint(key)\n this.guessZoom()\n }\n\n get base10String() {\n return this.id.toString(10)\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(): { col: number; row: number; zoom: number } {\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","base10String","id","toString","base16String","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"]}
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.js'\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(public key = 0n) {\n assertMaxBitUint(key)\n this.guessZoom()\n }\n\n get base10String() {\n return this.id.toString(10)\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(): { col: number; row: number; zoom: number } {\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":";AAAA,SAAS,gBAAgB;AACzB,SAAS,oBAAoB,wBAAwB;AACrD;AAAA,EACE;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAA0B;;;ACb5B,IAAM,kCAA0D;AAAA,EACrE,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;;;ADYA,IAAM,WAAW;AAEV,IAAM,YAAY,CAAC,SAA0B,2BAAK,UAAS,QAAQ;AAE1E,IAAM,YAAY,MAAM,OAAO;AAC/B,IAAM,YAAY,SAAS;AAC3B,IAAM,UAAU,YAAY;AAE5B,IAAM,mBAAmB,CAAC,OAAe,OAAO,SAAS;AACvD,WAAS,QAAQ,MAAM,QAAQ,SAAS,GAAG,MAAM,qBAAqB;AACxE;AAEO,IAAM,UAAN,MAAM,SAAQ;AAAA,EASnB,YAAmB,MAAM,IAAI;AAAV;AACjB,qBAAiB,GAAG;AACpB,SAAK,UAAU;AAAA,EACjB;AAAA,EAXA,OAAO,OAAO,SAAQ,KAAK,GAAG,EAAE;AAAA,EAChC,OAAO,OAAO,IAAI,SAAQ;AAAA,EAC1B,OAAO,OAAO;AAAA,EAEd,OAAO,SAAQ;AAAA,EAEP;AAAA,EAOR,IAAI,eAAe;AACjB,WAAO,KAAK,GAAG,SAAS,EAAE;AAAA,EAC5B;AAAA,EAEA,IAAI,eAAe;AACjB,WAAO,KAAK,GAAG,SAAS,EAAE,EAAE,SAAS,IAAI,GAAG;AAAA,EAC9C;AAAA,EAEA,IAAI,YAAY;AACd,WAAO,KAAK,GAAG,SAAS,CAAC,EAAE,SAAS,KAAK,MAAM,GAAG;AAAA,EACpD;AAAA,EAEA,IAAI,iBAAiB;AACnB,UAAM,OAAO,KAAK;AAClB,WAAO,KAAK,WAAW,IAAI,QAAQ;AAAA,EACrC;AAAA,EAEA,IAAI,cAAmC;AACrC,WAAO,kBAAkB,KAAK,IAAI;AAAA,EACpC;AAAA,EAEA,IAAI,SAAS;AACX,UAAM,SAAS,oBAAoB,KAAK,WAAW;AACnD,WAAO,IAAI,OAAO,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AAAA,EACxC;AAAA,EAEA,IAAI,WAAW;AACb,aAAS,KAAK,OAAO,WAAW,GAAG,MAAM,sCAAsC;AAC/E,UAAM,SAAoB,CAAC;AAC3B,UAAM,YAAY,KAAK,MAAM;AAC7B,aAAS,IAAI,IAAI,IAAI,IAAI,KAAK;AAC5B,aAAO,KAAK,IAAI,SAAQ,EAAE,MAAM,YAAY,CAAC,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC;AAAA,IACvE;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,eAA2D;AAC7D,UAAM,WAAW,gBAAgB,KAAK,SAAS;AAE/C,WAAO;AAAA,MACL,KAAK,KAAK,SAAS,CAAC,IAAI,SAAS,CAAC,IAAI;AAAA,MACtC,KAAK,SAAS,CAAC;AAAA,MACf,MAAM,SAAS,CAAC;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,IAAI,KAAK;AACP,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,IAAI,SAA8B;AAChC,QAAI,KAAK,OAAO,GAAG;AACjB,aAAO,IAAI,SAAQ,EAAE,MAAM,KAAK,MAAM,EAAE,EAAE,QAAQ,KAAK,OAAO,CAAC;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,IAAI,WAAW;AAnGjB;AAoGI,UAAM,WAAW,UAAS,UAAK,WAAL,mBAAa,UAAU,MAAM,4BAA4B,KAAK,SAAS,EAAE;AACnG,UAAM,mBAAmB,SAAS,OAAO,CAAC,YAAY,QAAQ,QAAQ,KAAK,GAAG;AAC9E,aAAS,iBAAiB,WAAW,GAAG,MAAM,yBAAyB,iBAAiB,MAAM,GAAG;AACjG,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,OAAqB;AACvB,WAAO,gBAAgB,KAAK,SAAS;AAAA,EACvC;AAAA,EAEA,IAAI,QAAQ;AAEV,WAAO,KAAK,GAAG,SAAS,CAAC,MAAM,KAAK,UAAU,SAAS,IAAI,GAAG;AAAA,EAChE;AAAA,EAEA,IAAI,OAAO;AAET,WAAO,QAAQ,KAAK,MAAM,cAAc,IAAI;AAAA,EAC9C;AAAA,EAEA,OAAO,KAAK,MAAc,IAAY;AACpC,WAAO,IAAI,SAAQ,EAAE,MAAM,EAAE,EAAE,QAAQ,IAAI;AAAA,EAC7C;AAAA,EAEA,OAAO,gBAAgB,MAAc,IAAiB;AACpD,WAAO,IAAI,SAAQ,EAAE,MAAM,OAAO,mBAAmB,IAAI,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI;AAAA,EAC3F;AAAA,EAEA,OAAO,iBAAiB,OAAe;AACrC,WAAO,IAAI,SAAQ,OAAO,iBAAiB,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC;AAAA,EACtE;AAAA,EAEA,OAAO,gBAAgB,OAAgB;AACrC,QAAI,UAAU,SAAS,UAAU,MAAM,UAAU,QAAW;AAC1D,aAAO,SAAQ;AAAA,IACjB;AACA,QAAI,KAAK;AACT,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,SAAS,OAAO,SAAS,MAAM,CAAC,CAAC;AACvC,eAAS,SAAS,KAAK,UAAU,GAAG,MAAM,yBAAyB,KAAK,EAAE;AAC1E,WAAM,MAAM,KAAM,OAAO,MAAM;AAAA,IACjC;AACA,WAAO,IAAI,SAAQ,EAAE,MAAM,EAAE,EAAE,QAAQ,MAAM,MAAM;AAAA,EACrD;AAAA,EAEA,OAAO,gBAAgB,aAAkC,MAAc;AACrE,UAAM,QAAQ,qBAAqB,aAAa,KAAK,MAAM,IAAI,CAAC;AAChE,UAAM,SAAoB,CAAC;AAC3B,eAAW,QAAQ,OAAO;AACxB,aAAO,KAAK,SAAS,SAAQ,SAAS,IAAI,GAAG,MAAM,aAAa,CAAC;AAAA,IACnE;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,WAAW,OAAmB,MAAc;AACjD,UAAM,OAAO,cAAc,OAAO,QAAQ,KAAK,GAAG,IAAI;AACtD,UAAM,gBAAgB,cAAc,IAAI;AACxC,WAAO,SAAQ,gBAAgB,aAAa;AAAA,EAC9C;AAAA,EAEA,OAAO,WAAW,MAAc,IAAY,OAAO,IAAI;AACrD,YAAQ,MAAM;AAAA,MACZ,KAAK,IAAI;AACP,eAAO,SAAQ,iBAAiB,EAAE,EAAE,QAAQ,IAAI;AAAA,MAClD;AAAA,MACA,SAAS;AACP,cAAM,IAAI,MAAM,iBAAiB,IAAI,GAAG;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,SAAS,MAAoB;AAClC,WAAO,SAAQ,gBAAgB,cAAc,IAAI,CAAC;AAAA,EACpD;AAAA,EAEA,eAAe,MAAc;AAE3B,QAAI,QAAQ,SAAS,KAAK,MAAM;AAC9B,aAAO,CAAC,IAAI;AAAA,IACd;AAGA,QAAI,aAAwB,CAAC;AAC7B,eAAW,WAAW,KAAK,UAAU;AACnC,mBAAa,CAAC,GAAG,YAAY,GAAG,QAAQ,eAAe,IAAI,CAAC;AAAA,IAC9D;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ;AACN,WAAO,IAAI,SAAQ,KAAK,GAAG;AAAA,EAC7B;AAAA,EAEA,OAAO,KAAuB;AAC5B,WAAO,IAAI,OAAO,KAAK;AAAA,EACzB;AAAA,EAEA,UAAU;AACR,SAAK,WAAW,KAAK,YAAY,IAAI,QAAQ,KAAK,SAAS;AAC3D,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,mBAAmB,MAAc;AAC/B,UAAM,OAAO,KAAK;AAClB,QAAI,QAAQ;AACZ,QAAI,OAAO;AACX,QAAI,MAAM;AACV,QAAI,YAAY;AAChB,WAAO,QAAQ,KAAK,QAAQ;AAC1B,oBAAc;AACd,cAAQ,KAAK,KAAK,GAAG;AAAA,QACnB,KAAK,KAAK;AACR,kBAAQ;AACR;AAAA,QACF;AAAA,QACA,KAAK,KAAK;AACR,iBAAO;AACP;AAAA,QACF;AAAA,QACA,KAAK,KAAK;AACR,kBAAQ;AACR,iBAAO;AACP;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AACA,QAAI,YAAY,GAAG;AACjB,kBAAY;AAAA,IACd;AACA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,kBAAkB;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,gBAAgB,aAAkC;AAChD,UAAM,kBAAkB,kBAAkB,KAAK,IAAI;AACnD,WACE,YAAY,SAAS,gBAAgB,aAAa,CAAC,KACnD,YAAY,SAAS,gBAAgB,aAAa,CAAC,KACnD,YAAY,SAAS,gBAAgB,aAAa,CAAC,KACnD,YAAY,SAAS,gBAAgB,aAAa,CAAC;AAAA,EAEvD;AAAA,EAEA,SAAS,WAAmB;AAC1B,UAAM,oBAAoB,SAAS,gCAAgC,SAAS,GAAG,MAAM,mBAAmB;AACxG,QAAI,UAAU,KAAK;AACnB,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,QAAQ,SAAS;AAC7B,WAAO,SAAS,GAAG;AACjB,UAAI,SAAS,OAAO,SAAS,QAAQ,OAAO,KAAK,CAAC;AAClD,gBAAU;AACV,UAAI,SAAS,GAAG;AACd,kBAAU;AACV,kBAAU,QAAQ,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC,IAAI,OAAO,SAAS,IAAI,QAAQ,MAAM,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC;AACzG;AAAA,MACF,WAAW,SAAS,GAAG;AACrB,kBAAU;AACV,kBAAU,QAAQ,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC,IAAI,OAAO,SAAS,IAAI,QAAQ,MAAM,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC;AACzG;AAAA,MACF,OAAO;AACL,gBAAQ;AAAA,MACV;AAAA,IACF;AACA,WAAO,SAAQ,gBAAgB,OAAO;AAAA,EACxC;AAAA,EAEA,MAAM,IAAY;AAChB,qBAAiB,IAAI,IAAI;AACzB,SAAK,OAAO,KAAK,MAAM,EAAE;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,MAAc,KAAa;AAChC,qBAAiB,GAAG;AACpB,SAAK,MAAM;AACX,SAAK,QAAQ,IAAI;AACjB,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,MAAc;AACpB,aAAS,OAAO,UAAU,MAAM,iBAAiB,IAAI,SAAS,QAAQ,EAAE;AACxE,SAAK,MAAO,KAAK,MAAM,UAAY,OAAO,IAAI,KAAK;AACnD,WAAO;AAAA,EACT;AAAA,EAEA,SAAiB;AACf,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,WAAW;AACT,WAAO,KAAK;AAAA,EACd;AAAA,EAEU,YAAY;AACpB,UAAM,gBAAgB,KAAK,GAAG,SAAS,CAAC;AACxC,SAAK,QAAQ,cAAc,MAAM;AAAA,EACnC;AACF;","names":[]}
package/package.json CHANGED
@@ -10,15 +10,15 @@
10
10
  "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js/issues"
11
11
  },
12
12
  "dependencies": {
13
- "@xylabs/assert": "^3.6.4",
14
- "@xylabs/hex": "^3.6.4",
13
+ "@xylabs/assert": "^3.6.5",
14
+ "@xylabs/hex": "^3.6.5",
15
15
  "@xyo-network/sdk-geo": "^2.11.4",
16
16
  "mapbox-gl": "^3.5.2"
17
17
  },
18
18
  "devDependencies": {
19
- "@types/mapbox-gl": "^3.1.0",
20
- "@xylabs/ts-scripts-yarn3": "^3.12.4",
21
- "@xylabs/tsconfig": "^3.12.4",
19
+ "@types/mapbox-gl": "^3.4.0",
20
+ "@xylabs/ts-scripts-yarn3": "^3.13.9",
21
+ "@xylabs/tsconfig": "^3.13.9",
22
22
  "typescript": "^5.5.4"
23
23
  },
24
24
  "description": "Primary SDK for using XYO Protocol 2.0",
@@ -60,6 +60,6 @@
60
60
  "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
61
61
  },
62
62
  "sideEffects": false,
63
- "version": "2.110.10",
63
+ "version": "2.110.12",
64
64
  "type": "module"
65
65
  }