@xyo-network/quadkey 2.110.10 → 2.110.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index.cjs +12 -27
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +21 -30
- package/dist/browser/index.js.map +1 -1
- package/dist/neutral/index.cjs +12 -27
- package/dist/neutral/index.cjs.map +1 -1
- package/dist/neutral/index.js +21 -30
- package/dist/neutral/index.js.map +1 -1
- package/dist/node/index.cjs +13 -29
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +22 -32
- package/dist/node/index.js.map +1 -1
- package/package.json +5 -5
package/dist/browser/index.cjs
CHANGED
|
@@ -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 =
|
|
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 =
|
|
48
|
+
var assertMaxBitUint = (value, bits = 256n) => {
|
|
50
49
|
(0, import_assert.assertEx)(value < 2n ** bits && value >= 0, () => "Not a 256 Bit Uint!");
|
|
51
|
-
}
|
|
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":[]}
|
package/dist/browser/index.js
CHANGED
|
@@ -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 {
|
|
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 =
|
|
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 =
|
|
29
|
+
var assertMaxBitUint = (value, bits = 256n) => {
|
|
25
30
|
assertEx(value < 2n ** bits && value >= 0, () => "Not a 256 Bit Uint!");
|
|
26
|
-
}
|
|
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":"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","names":[]}
|
package/dist/neutral/index.cjs
CHANGED
|
@@ -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 =
|
|
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 =
|
|
48
|
+
var assertMaxBitUint = (value, bits = 256n) => {
|
|
50
49
|
(0, import_assert.assertEx)(value < 2n ** bits && value >= 0, () => "Not a 256 Bit Uint!");
|
|
51
|
-
}
|
|
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":[]}
|
package/dist/neutral/index.js
CHANGED
|
@@ -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 {
|
|
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 =
|
|
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 =
|
|
29
|
+
var assertMaxBitUint = (value, bits = 256n) => {
|
|
25
30
|
assertEx(value < 2n ** bits && value >= 0, () => "Not a 256 Bit Uint!");
|
|
26
|
-
}
|
|
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":"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","names":[]}
|
package/dist/node/index.cjs
CHANGED
|
@@ -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 =
|
|
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 =
|
|
48
|
+
var assertMaxBitUint = (value, bits = 256n) => {
|
|
52
49
|
(0, import_assert.assertEx)(value < 2n ** bits && value >= 0, () => "Not a 256 Bit Uint!");
|
|
53
|
-
}
|
|
54
|
-
var
|
|
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,
|
package/dist/node/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/Quadkey.ts","../../src/RelativeDirectionConstantLookup.ts"],"sourcesContent":["export * from './Quadkey.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":[]}
|
package/dist/node/index.js
CHANGED
|
@@ -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 {
|
|
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 =
|
|
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 =
|
|
29
|
+
var assertMaxBitUint = (value, bits = 256n) => {
|
|
27
30
|
assertEx(value < 2n ** bits && value >= 0, () => "Not a 256 Bit Uint!");
|
|
28
|
-
}
|
|
29
|
-
var
|
|
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
|
package/dist/node/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Quadkey.ts","../../src/RelativeDirectionConstantLookup.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { hexFromArrayBuffer, hexFromHexString } from '@xylabs/hex'\nimport {\n boundingBoxToCenter,\n GeoJson,\n MercatorBoundingBox,\n MercatorTile,\n tileFromPoint,\n tileFromQuadkey,\n tilesFromBoundingBox,\n tileToBoundingBox,\n tileToQuadkey,\n} from '@xyo-network/sdk-geo'\nimport { LngLat, LngLatLike } from 'mapbox-gl'\n\nimport { RelativeDirectionConstantLookup } from './RelativeDirectionConstantLookup.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":"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","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.
|
|
14
|
-
"@xylabs/hex": "^3.6.
|
|
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
19
|
"@types/mapbox-gl": "^3.1.0",
|
|
20
|
-
"@xylabs/ts-scripts-yarn3": "^3.
|
|
21
|
-
"@xylabs/tsconfig": "^3.
|
|
20
|
+
"@xylabs/ts-scripts-yarn3": "^3.13.3",
|
|
21
|
+
"@xylabs/tsconfig": "^3.13.3",
|
|
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.
|
|
63
|
+
"version": "2.110.11",
|
|
64
64
|
"type": "module"
|
|
65
65
|
}
|