@xyo-network/quadkey 2.84.19 → 2.85.1

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