@xyo-network/quadkey 2.106.0 → 2.107.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,295 +1,2 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
7
- var __export = (target, all) => {
8
- for (var name in all)
9
- __defProp(target, name, { get: all[name], enumerable: true });
10
- };
11
- var __copyProps = (to, from, except, desc) => {
12
- if (from && typeof from === "object" || typeof from === "function") {
13
- for (let key of __getOwnPropNames(from))
14
- if (!__hasOwnProp.call(to, key) && key !== except)
15
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
- }
17
- return to;
18
- };
19
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
-
21
- // src/index.ts
22
- var src_exports = {};
23
- __export(src_exports, {
24
- Quadkey: () => Quadkey,
25
- isQuadkey: () => isQuadkey
26
- });
27
- module.exports = __toCommonJS(src_exports);
28
-
29
- // src/Quadkey.ts
30
- var import_assert = require("@xylabs/assert");
31
- var import_hex = require("@xylabs/hex");
32
- var import_sdk_geo = require("@xyo-network/sdk-geo");
33
- var import_mapbox_gl = require("mapbox-gl");
34
-
35
- // src/RelativeDirectionConstantLookup.ts
36
- var RelativeDirectionConstantLookup = {
37
- e: 1,
38
- n: -2,
39
- s: 2,
40
- w: -1
41
- };
42
-
43
- // src/Quadkey.ts
44
- var MAX_ZOOM = 124;
45
- var isQuadkey = /* @__PURE__ */ __name((obj) => obj?.type === Quadkey.type, "isQuadkey");
46
- var FULL_MASK = 2n ** 256n - 1n;
47
- var ZOOM_MASK = 0xffn << 248n;
48
- var ID_MASK = ZOOM_MASK ^ FULL_MASK;
49
- var assertMaxBitUint = /* @__PURE__ */ __name((value, bits = 256n) => {
50
- (0, import_assert.assertEx)(value < 2n ** bits && value >= 0, () => "Not a 256 Bit Uint!");
51
- }, "assertMaxBitUint");
52
- 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
- constructor(key = 0n) {
63
- this.key = key;
64
- this.type = _Quadkey.type;
65
- assertMaxBitUint(key);
66
- this.guessZoom();
67
- }
68
- get base16String() {
69
- return this.id.toString(16).padStart(62, "0");
70
- }
71
- get base4Hash() {
72
- return this.id.toString(4).padStart(this.zoom, "0");
73
- }
74
- get base4HashLabel() {
75
- const hash = this.base4Hash;
76
- return hash.length === 0 ? "fhr" : hash;
77
- }
78
- get boundingBox() {
79
- return (0, import_sdk_geo.tileToBoundingBox)(this.tile);
80
- }
81
- get center() {
82
- const result = (0, import_sdk_geo.boundingBoxToCenter)(this.boundingBox);
83
- return new import_mapbox_gl.LngLat(result[0], result[1]);
84
- }
85
- get children() {
86
- (0, import_assert.assertEx)(this.zoom < MAX_ZOOM - 1, () => "Can not get children of bottom tiles");
87
- const result = [];
88
- const shiftedId = this.id << 2n;
89
- for (let i = 0n; i < 4n; i++) {
90
- result.push(new _Quadkey().setId(shiftedId | i).setZoom(this.zoom + 1));
91
- }
92
- return result;
93
- }
94
- get gridLocation() {
95
- const tileData = (0, import_sdk_geo.tileFromQuadkey)(this.base4Hash);
96
- return {
97
- col: 2 ** tileData[2] - tileData[1] - 1,
98
- row: tileData[0],
99
- zoom: tileData[2]
100
- };
101
- }
102
- get id() {
103
- return this.key & ID_MASK;
104
- }
105
- get parent() {
106
- if (this.zoom > 0) {
107
- return new _Quadkey().setId(this.id >> 2n).setZoom(this.zoom - 1);
108
- }
109
- }
110
- get siblings() {
111
- const siblings = (0, import_assert.assertEx)(this.parent?.children, () => `siblings: parentChildren ${this.base4Hash}`);
112
- const filteredSiblings = siblings.filter((quadkey) => quadkey.key !== this.key);
113
- (0, import_assert.assertEx)(filteredSiblings.length === 3, () => `siblings: expected 3 [${filteredSiblings.length}]`);
114
- return filteredSiblings;
115
- }
116
- get tile() {
117
- return (0, import_sdk_geo.tileFromQuadkey)(this.base4Hash);
118
- }
119
- get valid() {
120
- return this.id.toString(4) === this.base4Hash.padStart(64, "0");
121
- }
122
- get zoom() {
123
- return Number((this.key & ZOOM_MASK) >> 248n);
124
- }
125
- static from(zoom, id) {
126
- return new _Quadkey().setId(id).setZoom(zoom);
127
- }
128
- static fromArrayBuffer(zoom, id) {
129
- return new _Quadkey().setId(BigInt((0, import_hex.hexFromArrayBuffer)(id, {
130
- prefix: true
131
- }))).setZoom(zoom);
132
- }
133
- static fromBase16String(value) {
134
- return new _Quadkey(BigInt((0, import_hex.hexFromHexString)(value, {
135
- prefix: true
136
- })));
137
- }
138
- static fromBase4String(value) {
139
- if (value === "fhr" || value === "" || value === void 0) {
140
- return _Quadkey.root;
141
- }
142
- let id = 0n;
143
- for (let i = 0; i < value.length; i++) {
144
- const nibble = Number.parseInt(value[i]);
145
- (0, import_assert.assertEx)(nibble < 4 && nibble >= 0, () => `Invalid Base4 String: ${value}`);
146
- id = id << 2n | BigInt(nibble);
147
- }
148
- return new _Quadkey().setId(id).setZoom(value.length);
149
- }
150
- static fromBoundingBox(boundingBox, zoom) {
151
- const tiles = (0, import_sdk_geo.tilesFromBoundingBox)(boundingBox, Math.floor(zoom));
152
- const result = [];
153
- for (const tile of tiles) {
154
- result.push((0, import_assert.assertEx)(_Quadkey.fromTile(tile), () => "Bad Quadkey"));
155
- }
156
- return result;
157
- }
158
- static fromLngLat(point, zoom) {
159
- const tile = (0, import_sdk_geo.tileFromPoint)(import_mapbox_gl.LngLat.convert(point), zoom);
160
- const quadkeyString = (0, import_sdk_geo.tileToQuadkey)(tile);
161
- return _Quadkey.fromBase4String(quadkeyString);
162
- }
163
- static fromString(zoom, id, base = 16) {
164
- switch (base) {
165
- case 16: {
166
- return _Quadkey.fromBase16String(id).setZoom(zoom);
167
- }
168
- default: {
169
- throw new Error(`Invalid base [${base}]`);
170
- }
171
- }
172
- }
173
- static fromTile(tile) {
174
- return _Quadkey.fromBase4String((0, import_sdk_geo.tileToQuadkey)(tile));
175
- }
176
- childrenByZoom(zoom) {
177
- if (zoom && zoom === this.zoom) {
178
- return [
179
- this
180
- ];
181
- }
182
- let deepResult = [];
183
- for (const quadkey of this.children) {
184
- deepResult = [
185
- ...deepResult,
186
- ...quadkey.childrenByZoom(zoom)
187
- ];
188
- }
189
- return deepResult;
190
- }
191
- clone() {
192
- return new _Quadkey(this.key);
193
- }
194
- equals(obj) {
195
- return obj.key == this.key;
196
- }
197
- geoJson() {
198
- this._geoJson = this._geoJson ?? new import_sdk_geo.GeoJson(this.base4Hash);
199
- return this._geoJson;
200
- }
201
- getGridBoundingBox(size) {
202
- const hash = this.base4Hash;
203
- let index = 0;
204
- let left = 0;
205
- let top = 0;
206
- let blockSize = size;
207
- while (index < hash.length) {
208
- blockSize >>= 1;
209
- switch (hash[index]) {
210
- case "1": {
211
- left += blockSize;
212
- break;
213
- }
214
- case "2": {
215
- top += blockSize;
216
- break;
217
- }
218
- case "3": {
219
- left += blockSize;
220
- top += blockSize;
221
- break;
222
- }
223
- }
224
- index++;
225
- }
226
- if (blockSize < 2) {
227
- blockSize = 2;
228
- }
229
- return {
230
- height: blockSize,
231
- left,
232
- top,
233
- width: blockSize
234
- };
235
- }
236
- /** @deprecated use .gridLocation instead */
237
- getGridLocation() {
238
- return this.gridLocation;
239
- }
240
- isInBoundingBox(boundingBox) {
241
- const tileBoundingBox = (0, import_sdk_geo.tileToBoundingBox)(this.tile);
242
- return boundingBox.contains(tileBoundingBox.getNorthEast()) || boundingBox.contains(tileBoundingBox.getNorthWest()) || boundingBox.contains(tileBoundingBox.getSouthEast()) || boundingBox.contains(tileBoundingBox.getSouthWest());
243
- }
244
- relative(direction) {
245
- const directionConstant = (0, import_assert.assertEx)(RelativeDirectionConstantLookup[direction], () => "Invalid direction");
246
- let quadkey = this.base4Hash;
247
- if (quadkey.length === 0) {
248
- return this;
249
- }
250
- let index = quadkey.length - 1;
251
- while (index >= 0) {
252
- let number = Number.parseInt(quadkey.charAt(index));
253
- number += directionConstant;
254
- if (number > 3) {
255
- number -= 4;
256
- quadkey = quadkey.slice(0, Math.max(0, index)) + number.toString() + quadkey.slice(Math.max(0, index + 1));
257
- index--;
258
- } else if (number < 0) {
259
- number += 4;
260
- quadkey = quadkey.slice(0, Math.max(0, index)) + number.toString() + quadkey.slice(Math.max(0, index + 1));
261
- index--;
262
- } else {
263
- index = -1;
264
- }
265
- }
266
- return _Quadkey.fromBase4String(quadkey);
267
- }
268
- setId(id) {
269
- assertMaxBitUint(id, 248n);
270
- this.setKey(this.zoom, id);
271
- return this;
272
- }
273
- setKey(zoom, key) {
274
- assertMaxBitUint(key);
275
- this.key = key;
276
- this.setZoom(zoom);
277
- return this;
278
- }
279
- setZoom(zoom) {
280
- (0, import_assert.assertEx)(zoom < MAX_ZOOM, () => `Invalid zoom [${zoom}] max=${MAX_ZOOM}`);
281
- this.key = this.key & ID_MASK | BigInt(zoom) << 248n;
282
- return this;
283
- }
284
- toJSON() {
285
- return this.base4HashLabel;
286
- }
287
- toString() {
288
- return this.base4Hash;
289
- }
290
- guessZoom() {
291
- const quadkeySimple = this.id.toString(4);
292
- this.setZoom(quadkeySimple.length);
293
- }
294
- };
1
+ "use strict";var l=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var g=(n,t)=>l(n,"name",{value:t,configurable:!0});var k=(n,t)=>{for(var e in t)l(n,e,{get:t[e],enumerable:!0})},w=(n,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of S(t))!x.call(n,i)&&i!==e&&l(n,i,{get:()=>t[i],enumerable:!(s=B(t,i))||s.enumerable});return n};var I=n=>w(l({},"__esModule",{value:!0}),n);var L={};k(L,{Quadkey:()=>c,isQuadkey:()=>Z});module.exports=I(L);var h=require("@xylabs/assert"),u=require("@xylabs/hex"),r=require("@xyo-network/sdk-geo"),f=require("mapbox-gl");var p={e:1,n:-2,s:2,w:-1};var d=124,Z=g(n=>n?.type===c.type,"isQuadkey"),H=2n**256n-1n,y=0xffn<<248n,b=y^H,m=g((n,t=256n)=>{(0,h.assertEx)(n<2n**t&&n>=0,()=>"Not a 256 Bit Uint!")},"assertMaxBitUint"),c=class n{static{g(this,"Quadkey")}key;static Zero=n.from(0,0n);static root=new n;static type="Quadkey";type;_geoJson;constructor(t=0n){this.key=t,this.type=n.type,m(t),this.guessZoom()}get base16String(){return this.id.toString(16).padStart(62,"0")}get base4Hash(){return this.id.toString(4).padStart(this.zoom,"0")}get base4HashLabel(){let t=this.base4Hash;return t.length===0?"fhr":t}get boundingBox(){return(0,r.tileToBoundingBox)(this.tile)}get center(){let t=(0,r.boundingBoxToCenter)(this.boundingBox);return new f.LngLat(t[0],t[1])}get children(){(0,h.assertEx)(this.zoom<d-1,()=>"Can not get children of bottom tiles");let t=[],e=this.id<<2n;for(let s=0n;s<4n;s++)t.push(new n().setId(e|s).setZoom(this.zoom+1));return t}get gridLocation(){let t=(0,r.tileFromQuadkey)(this.base4Hash);return{col:2**t[2]-t[1]-1,row:t[0],zoom:t[2]}}get id(){return this.key&b}get parent(){if(this.zoom>0)return new n().setId(this.id>>2n).setZoom(this.zoom-1)}get siblings(){let e=(0,h.assertEx)(this.parent?.children,()=>`siblings: parentChildren ${this.base4Hash}`).filter(s=>s.key!==this.key);return(0,h.assertEx)(e.length===3,()=>`siblings: expected 3 [${e.length}]`),e}get tile(){return(0,r.tileFromQuadkey)(this.base4Hash)}get valid(){return this.id.toString(4)===this.base4Hash.padStart(64,"0")}get zoom(){return Number((this.key&y)>>248n)}static from(t,e){return new n().setId(e).setZoom(t)}static fromArrayBuffer(t,e){return new n().setId(BigInt((0,u.hexFromArrayBuffer)(e,{prefix:!0}))).setZoom(t)}static fromBase16String(t){return new n(BigInt((0,u.hexFromHexString)(t,{prefix:!0})))}static fromBase4String(t){if(t==="fhr"||t===""||t===void 0)return n.root;let e=0n;for(let s=0;s<t.length;s++){let i=Number.parseInt(t[s]);(0,h.assertEx)(i<4&&i>=0,()=>`Invalid Base4 String: ${t}`),e=e<<2n|BigInt(i)}return new n().setId(e).setZoom(t.length)}static fromBoundingBox(t,e){let s=(0,r.tilesFromBoundingBox)(t,Math.floor(e)),i=[];for(let o of s)i.push((0,h.assertEx)(n.fromTile(o),()=>"Bad Quadkey"));return i}static fromLngLat(t,e){let s=(0,r.tileFromPoint)(f.LngLat.convert(t),e),i=(0,r.tileToQuadkey)(s);return n.fromBase4String(i)}static fromString(t,e,s=16){switch(s){case 16:return n.fromBase16String(e).setZoom(t);default:throw new Error(`Invalid base [${s}]`)}}static fromTile(t){return n.fromBase4String((0,r.tileToQuadkey)(t))}childrenByZoom(t){if(t&&t===this.zoom)return[this];let e=[];for(let s of this.children)e=[...e,...s.childrenByZoom(t)];return e}clone(){return new n(this.key)}equals(t){return t.key==this.key}geoJson(){return this._geoJson=this._geoJson??new r.GeoJson(this.base4Hash),this._geoJson}getGridBoundingBox(t){let e=this.base4Hash,s=0,i=0,o=0,a=t;for(;s<e.length;){switch(a>>=1,e[s]){case"1":{i+=a;break}case"2":{o+=a;break}case"3":{i+=a,o+=a;break}}s++}return a<2&&(a=2),{height:a,left:i,top:o,width:a}}getGridLocation(){return this.gridLocation}isInBoundingBox(t){let e=(0,r.tileToBoundingBox)(this.tile);return t.contains(e.getNorthEast())||t.contains(e.getNorthWest())||t.contains(e.getSouthEast())||t.contains(e.getSouthWest())}relative(t){let e=(0,h.assertEx)(p[t],()=>"Invalid direction"),s=this.base4Hash;if(s.length===0)return this;let i=s.length-1;for(;i>=0;){let o=Number.parseInt(s.charAt(i));o+=e,o>3?(o-=4,s=s.slice(0,Math.max(0,i))+o.toString()+s.slice(Math.max(0,i+1)),i--):o<0?(o+=4,s=s.slice(0,Math.max(0,i))+o.toString()+s.slice(Math.max(0,i+1)),i--):i=-1}return n.fromBase4String(s)}setId(t){return m(t,248n),this.setKey(this.zoom,t),this}setKey(t,e){return m(e),this.key=e,this.setZoom(t),this}setZoom(t){return(0,h.assertEx)(t<d,()=>`Invalid zoom [${t}] max=${d}`),this.key=this.key&b|BigInt(t)<<248n,this}toJSON(){return this.base4HashLabel}toString(){return this.base4Hash}guessZoom(){let t=this.id.toString(4);this.setZoom(t.length)}};
295
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/Quadkey.ts","../../src/RelativeDirectionConstantLookup.ts"],"sourcesContent":["export * from './Quadkey'\n","import { assertEx } from '@xylabs/assert'\nimport { hexFromArrayBuffer, hexFromHexString } from '@xylabs/hex'\nimport {\n boundingBoxToCenter,\n GeoJson,\n MercatorBoundingBox,\n MercatorTile,\n tileFromPoint,\n tileFromQuadkey,\n tilesFromBoundingBox,\n tileToBoundingBox,\n tileToQuadkey,\n} from '@xyo-network/sdk-geo'\nimport { LngLat, LngLatLike } from 'mapbox-gl'\n\nimport { RelativeDirectionConstantLookup } from './RelativeDirectionConstantLookup'\n\nconst MAX_ZOOM = 124\n\nexport const isQuadkey = (obj: { type: string }) => obj?.type === Quadkey.type\n\nconst FULL_MASK = 2n ** 256n - 1n\nconst ZOOM_MASK = 0xffn << 248n\nconst ID_MASK = ZOOM_MASK ^ FULL_MASK\n\nconst assertMaxBitUint = (value: bigint, bits = 256n) => {\n assertEx(value < 2n ** bits && value >= 0, () => 'Not a 256 Bit Uint!')\n}\n\nexport class Quadkey {\n static Zero = Quadkey.from(0, 0n)\n static root = new Quadkey()\n static type = 'Quadkey'\n\n type = Quadkey.type\n\n private _geoJson?: GeoJson\n\n constructor(private key = 0n) {\n assertMaxBitUint(key)\n this.guessZoom()\n }\n\n get base16String() {\n return this.id.toString(16).padStart(62, '0')\n }\n\n get base4Hash() {\n return this.id.toString(4).padStart(this.zoom, '0')\n }\n\n get base4HashLabel() {\n const hash = this.base4Hash\n return hash.length === 0 ? 'fhr' : hash\n }\n\n get boundingBox(): MercatorBoundingBox {\n return tileToBoundingBox(this.tile)\n }\n\n get center() {\n const result = boundingBoxToCenter(this.boundingBox)\n return new LngLat(result[0], result[1])\n }\n\n get children() {\n assertEx(this.zoom < MAX_ZOOM - 1, () => 'Can not get children of bottom tiles')\n const result: Quadkey[] = []\n const shiftedId = this.id << 2n\n for (let i = 0n; i < 4n; i++) {\n result.push(new Quadkey().setId(shiftedId | i).setZoom(this.zoom + 1))\n }\n return result\n }\n\n get gridLocation() {\n const tileData = tileFromQuadkey(this.base4Hash)\n\n return {\n col: 2 ** tileData[2] - tileData[1] - 1,\n row: tileData[0],\n zoom: tileData[2],\n }\n }\n\n get id() {\n return this.key & ID_MASK\n }\n\n get parent(): Quadkey | undefined {\n if (this.zoom > 0) {\n return new Quadkey().setId(this.id >> 2n).setZoom(this.zoom - 1)\n }\n }\n\n get siblings() {\n const siblings = assertEx(this.parent?.children, () => `siblings: parentChildren ${this.base4Hash}`)\n const filteredSiblings = siblings.filter((quadkey) => quadkey.key !== this.key)\n assertEx(filteredSiblings.length === 3, () => `siblings: expected 3 [${filteredSiblings.length}]`)\n return filteredSiblings\n }\n\n get tile(): MercatorTile {\n return tileFromQuadkey(this.base4Hash)\n }\n\n get valid() {\n //check for additional data outside zoom scope\n return this.id.toString(4) === this.base4Hash.padStart(64, '0')\n }\n\n get zoom() {\n //zoom is stored in top byte\n return Number((this.key & ZOOM_MASK) >> 248n)\n }\n\n static from(zoom: number, id: bigint) {\n return new Quadkey().setId(id).setZoom(zoom)\n }\n\n static fromArrayBuffer(zoom: number, id: ArrayBuffer) {\n return new Quadkey().setId(BigInt(hexFromArrayBuffer(id, { prefix: true }))).setZoom(zoom)\n }\n\n static fromBase16String(value: string) {\n return new Quadkey(BigInt(hexFromHexString(value, { prefix: true })))\n }\n\n static fromBase4String(value?: string) {\n if (value === 'fhr' || value === '' || value === undefined) {\n return Quadkey.root\n }\n let id = 0n\n for (let i = 0; i < value.length; i++) {\n const nibble = Number.parseInt(value[i])\n assertEx(nibble < 4 && nibble >= 0, () => `Invalid Base4 String: ${value}`)\n id = (id << 2n) | BigInt(nibble)\n }\n return new Quadkey().setId(id).setZoom(value.length)\n }\n\n static fromBoundingBox(boundingBox: MercatorBoundingBox, zoom: number) {\n const tiles = tilesFromBoundingBox(boundingBox, Math.floor(zoom))\n const result: Quadkey[] = []\n for (const tile of tiles) {\n result.push(assertEx(Quadkey.fromTile(tile), () => 'Bad Quadkey'))\n }\n\n return result\n }\n\n static fromLngLat(point: LngLatLike, zoom: number) {\n const tile = tileFromPoint(LngLat.convert(point), zoom)\n const quadkeyString = tileToQuadkey(tile)\n return Quadkey.fromBase4String(quadkeyString)\n }\n\n static fromString(zoom: number, id: string, base = 16) {\n switch (base) {\n case 16: {\n return Quadkey.fromBase16String(id).setZoom(zoom)\n }\n default: {\n throw new Error(`Invalid base [${base}]`)\n }\n }\n }\n\n static fromTile(tile: MercatorTile) {\n return Quadkey.fromBase4String(tileToQuadkey(tile))\n }\n\n childrenByZoom(zoom: number) {\n // if we are limiting by zoom, and we are already at that limit, just return this quadkey\n if (zoom && zoom === this.zoom) {\n return [this]\n }\n\n // recursively get children\n let deepResult: Quadkey[] = []\n for (const quadkey of this.children) {\n deepResult = [...deepResult, ...quadkey.childrenByZoom(zoom)]\n }\n return deepResult\n }\n\n clone() {\n return new Quadkey(this.key)\n }\n\n equals(obj: Quadkey): boolean {\n return obj.key == this.key\n }\n\n geoJson() {\n this._geoJson = this._geoJson ?? new GeoJson(this.base4Hash)\n return this._geoJson\n }\n\n getGridBoundingBox(size: number) {\n const hash = this.base4Hash\n let index = 0\n let left = 0\n let top = 0\n let blockSize = size\n while (index < hash.length) {\n blockSize >>= 1\n switch (hash[index]) {\n case '1': {\n left += blockSize\n break\n }\n case '2': {\n top += blockSize\n break\n }\n case '3': {\n left += blockSize\n top += blockSize\n break\n }\n }\n index++\n }\n if (blockSize < 2) {\n blockSize = 2\n }\n return {\n height: blockSize,\n left,\n top,\n width: blockSize,\n }\n }\n\n /** @deprecated use .gridLocation instead */\n getGridLocation() {\n return this.gridLocation\n }\n\n isInBoundingBox(boundingBox: MercatorBoundingBox) {\n const tileBoundingBox = tileToBoundingBox(this.tile)\n return (\n boundingBox.contains(tileBoundingBox.getNorthEast()) ||\n boundingBox.contains(tileBoundingBox.getNorthWest()) ||\n boundingBox.contains(tileBoundingBox.getSouthEast()) ||\n boundingBox.contains(tileBoundingBox.getSouthWest())\n )\n }\n\n relative(direction: string) {\n const directionConstant = assertEx(RelativeDirectionConstantLookup[direction], () => 'Invalid direction')\n let quadkey = this.base4Hash\n if (quadkey.length === 0) {\n return this\n }\n let index = quadkey.length - 1\n while (index >= 0) {\n let number = Number.parseInt(quadkey.charAt(index))\n number += directionConstant\n if (number > 3) {\n number -= 4\n quadkey = quadkey.slice(0, Math.max(0, index)) + number.toString() + quadkey.slice(Math.max(0, index + 1))\n index--\n } else if (number < 0) {\n number += 4\n quadkey = quadkey.slice(0, Math.max(0, index)) + number.toString() + quadkey.slice(Math.max(0, index + 1))\n index--\n } else {\n index = -1\n }\n }\n return Quadkey.fromBase4String(quadkey)\n }\n\n setId(id: bigint) {\n assertMaxBitUint(id, 248n)\n this.setKey(this.zoom, id)\n return this\n }\n\n setKey(zoom: number, key: bigint) {\n assertMaxBitUint(key)\n this.key = key\n this.setZoom(zoom)\n return this\n }\n\n setZoom(zoom: number) {\n assertEx(zoom < MAX_ZOOM, () => `Invalid zoom [${zoom}] max=${MAX_ZOOM}`)\n this.key = (this.key & ID_MASK) | (BigInt(zoom) << 248n)\n return this\n }\n\n toJSON(): string {\n return this.base4HashLabel\n }\n\n toString() {\n return this.base4Hash\n }\n\n protected guessZoom() {\n const quadkeySimple = this.id.toString(4)\n this.setZoom(quadkeySimple.length)\n }\n}\n","export const RelativeDirectionConstantLookup: Record<string, number> = {\n e: 1,\n n: -2,\n s: 2,\n w: -1,\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;ACAA,oBAAyB;AACzB,iBAAqD;AACrD,qBAUO;AACP,uBAAmC;;;ACb5B,IAAMA,kCAA0D;EACrEC,GAAG;EACHC,GAAG;EACHC,GAAG;EACHC,GAAG;AACL;;;ADYA,IAAMC,WAAW;AAEV,IAAMC,YAAY,wBAACC,QAA0BA,KAAKC,SAASC,QAAQD,MAAjD;AAEzB,IAAME,YAAY,MAAM,OAAO;AAC/B,IAAMC,YAAY,SAAS;AAC3B,IAAMC,UAAUD,YAAYD;AAE5B,IAAMG,mBAAmB,wBAACC,OAAeC,OAAO,SAAI;AAClDC,8BAASF,QAAQ,MAAMC,QAAQD,SAAS,GAAG,MAAM,qBAAA;AACnD,GAFyB;AAIlB,IAAML,UAAN,MAAMA,SAAAA;EA7Bb,OA6BaA;;;;EACX,OAAOQ,OAAOR,SAAQS,KAAK,GAAG,EAAE;EAChC,OAAOC,OAAO,IAAIV,SAAAA;EAClB,OAAOD,OAAO;EAEdA;EAEQY;EAERC,YAAoBC,MAAM,IAAI;SAAVA,MAAAA;SAJpBd,OAAOC,SAAQD;AAKbK,qBAAiBS,GAAAA;AACjB,SAAKC,UAAS;EAChB;EAEA,IAAIC,eAAe;AACjB,WAAO,KAAKC,GAAGC,SAAS,EAAA,EAAIC,SAAS,IAAI,GAAA;EAC3C;EAEA,IAAIC,YAAY;AACd,WAAO,KAAKH,GAAGC,SAAS,CAAA,EAAGC,SAAS,KAAKE,MAAM,GAAA;EACjD;EAEA,IAAIC,iBAAiB;AACnB,UAAMC,OAAO,KAAKH;AAClB,WAAOG,KAAKC,WAAW,IAAI,QAAQD;EACrC;EAEA,IAAIE,cAAmC;AACrC,eAAOC,kCAAkB,KAAKC,IAAI;EACpC;EAEA,IAAIC,SAAS;AACX,UAAMC,aAASC,oCAAoB,KAAKL,WAAW;AACnD,WAAO,IAAIM,wBAAOF,OAAO,CAAA,GAAIA,OAAO,CAAA,CAAE;EACxC;EAEA,IAAIG,WAAW;AACbxB,gCAAS,KAAKa,OAAOxB,WAAW,GAAG,MAAM,sCAAA;AACzC,UAAMgC,SAAoB,CAAA;AAC1B,UAAMI,YAAY,KAAKhB,MAAM;AAC7B,aAASiB,IAAI,IAAIA,IAAI,IAAIA,KAAK;AAC5BL,aAAOM,KAAK,IAAIlC,SAAAA,EAAUmC,MAAMH,YAAYC,CAAAA,EAAGG,QAAQ,KAAKhB,OAAO,CAAA,CAAA;IACrE;AACA,WAAOQ;EACT;EAEA,IAAIS,eAAe;AACjB,UAAMC,eAAWC,gCAAgB,KAAKpB,SAAS;AAE/C,WAAO;MACLqB,KAAK,KAAKF,SAAS,CAAA,IAAKA,SAAS,CAAA,IAAK;MACtCG,KAAKH,SAAS,CAAA;MACdlB,MAAMkB,SAAS,CAAA;IACjB;EACF;EAEA,IAAItB,KAAK;AACP,WAAO,KAAKH,MAAMV;EACpB;EAEA,IAAIuC,SAA8B;AAChC,QAAI,KAAKtB,OAAO,GAAG;AACjB,aAAO,IAAIpB,SAAAA,EAAUmC,MAAM,KAAKnB,MAAM,EAAE,EAAEoB,QAAQ,KAAKhB,OAAO,CAAA;IAChE;EACF;EAEA,IAAIuB,WAAW;AACb,UAAMA,eAAWpC,wBAAS,KAAKmC,QAAQX,UAAU,MAAM,4BAA4B,KAAKZ,SAAS,EAAE;AACnG,UAAMyB,mBAAmBD,SAASE,OAAO,CAACC,YAAYA,QAAQjC,QAAQ,KAAKA,GAAG;AAC9EN,gCAASqC,iBAAiBrB,WAAW,GAAG,MAAM,yBAAyBqB,iBAAiBrB,MAAM,GAAG;AACjG,WAAOqB;EACT;EAEA,IAAIlB,OAAqB;AACvB,eAAOa,gCAAgB,KAAKpB,SAAS;EACvC;EAEA,IAAI4B,QAAQ;AAEV,WAAO,KAAK/B,GAAGC,SAAS,CAAA,MAAO,KAAKE,UAAUD,SAAS,IAAI,GAAA;EAC7D;EAEA,IAAIE,OAAO;AAET,WAAO4B,QAAQ,KAAKnC,MAAMX,cAAc,IAAI;EAC9C;EAEA,OAAOO,KAAKW,MAAcJ,IAAY;AACpC,WAAO,IAAIhB,SAAAA,EAAUmC,MAAMnB,EAAAA,EAAIoB,QAAQhB,IAAAA;EACzC;EAEA,OAAO6B,gBAAgB7B,MAAcJ,IAAiB;AACpD,WAAO,IAAIhB,SAAAA,EAAUmC,MAAMe,WAAOC,+BAAmBnC,IAAI;MAAEoC,QAAQ;IAAK,CAAA,CAAA,CAAA,EAAKhB,QAAQhB,IAAAA;EACvF;EAEA,OAAOiC,iBAAiBhD,OAAe;AACrC,WAAO,IAAIL,SAAQkD,WAAOI,6BAAiBjD,OAAO;MAAE+C,QAAQ;IAAK,CAAA,CAAA,CAAA;EACnE;EAEA,OAAOG,gBAAgBlD,OAAgB;AACrC,QAAIA,UAAU,SAASA,UAAU,MAAMA,UAAUmD,QAAW;AAC1D,aAAOxD,SAAQU;IACjB;AACA,QAAIM,KAAK;AACT,aAASiB,IAAI,GAAGA,IAAI5B,MAAMkB,QAAQU,KAAK;AACrC,YAAMwB,SAAST,OAAOU,SAASrD,MAAM4B,CAAAA,CAAE;AACvC1B,kCAASkD,SAAS,KAAKA,UAAU,GAAG,MAAM,yBAAyBpD,KAAAA,EAAO;AAC1EW,WAAMA,MAAM,KAAMkC,OAAOO,MAAAA;IAC3B;AACA,WAAO,IAAIzD,SAAAA,EAAUmC,MAAMnB,EAAAA,EAAIoB,QAAQ/B,MAAMkB,MAAM;EACrD;EAEA,OAAOoC,gBAAgBnC,aAAkCJ,MAAc;AACrE,UAAMwC,YAAQC,qCAAqBrC,aAAasC,KAAKC,MAAM3C,IAAAA,CAAAA;AAC3D,UAAMQ,SAAoB,CAAA;AAC1B,eAAWF,QAAQkC,OAAO;AACxBhC,aAAOM,SAAK3B,wBAASP,SAAQgE,SAAStC,IAAAA,GAAO,MAAM,aAAA,CAAA;IACrD;AAEA,WAAOE;EACT;EAEA,OAAOqC,WAAWC,OAAmB9C,MAAc;AACjD,UAAMM,WAAOyC,8BAAcrC,wBAAOsC,QAAQF,KAAAA,GAAQ9C,IAAAA;AAClD,UAAMiD,oBAAgBC,8BAAc5C,IAAAA;AACpC,WAAO1B,SAAQuD,gBAAgBc,aAAAA;EACjC;EAEA,OAAOE,WAAWnD,MAAcJ,IAAYwD,OAAO,IAAI;AACrD,YAAQA,MAAAA;MACN,KAAK,IAAI;AACP,eAAOxE,SAAQqD,iBAAiBrC,EAAAA,EAAIoB,QAAQhB,IAAAA;MAC9C;MACA,SAAS;AACP,cAAM,IAAIqD,MAAM,iBAAiBD,IAAAA,GAAO;MAC1C;IACF;EACF;EAEA,OAAOR,SAAStC,MAAoB;AAClC,WAAO1B,SAAQuD,oBAAgBe,8BAAc5C,IAAAA,CAAAA;EAC/C;EAEAgD,eAAetD,MAAc;AAE3B,QAAIA,QAAQA,SAAS,KAAKA,MAAM;AAC9B,aAAO;QAAC;;IACV;AAGA,QAAIuD,aAAwB,CAAA;AAC5B,eAAW7B,WAAW,KAAKf,UAAU;AACnC4C,mBAAa;WAAIA;WAAe7B,QAAQ4B,eAAetD,IAAAA;;IACzD;AACA,WAAOuD;EACT;EAEAC,QAAQ;AACN,WAAO,IAAI5E,SAAQ,KAAKa,GAAG;EAC7B;EAEAgE,OAAO/E,KAAuB;AAC5B,WAAOA,IAAIe,OAAO,KAAKA;EACzB;EAEAiE,UAAU;AACR,SAAKnE,WAAW,KAAKA,YAAY,IAAIoE,uBAAQ,KAAK5D,SAAS;AAC3D,WAAO,KAAKR;EACd;EAEAqE,mBAAmBC,MAAc;AAC/B,UAAM3D,OAAO,KAAKH;AAClB,QAAI+D,QAAQ;AACZ,QAAIC,OAAO;AACX,QAAIC,MAAM;AACV,QAAIC,YAAYJ;AAChB,WAAOC,QAAQ5D,KAAKC,QAAQ;AAC1B8D,oBAAc;AACd,cAAQ/D,KAAK4D,KAAAA,GAAM;QACjB,KAAK,KAAK;AACRC,kBAAQE;AACR;QACF;QACA,KAAK,KAAK;AACRD,iBAAOC;AACP;QACF;QACA,KAAK,KAAK;AACRF,kBAAQE;AACRD,iBAAOC;AACP;QACF;MACF;AACAH;IACF;AACA,QAAIG,YAAY,GAAG;AACjBA,kBAAY;IACd;AACA,WAAO;MACLC,QAAQD;MACRF;MACAC;MACAG,OAAOF;IACT;EACF;;EAGAG,kBAAkB;AAChB,WAAO,KAAKnD;EACd;EAEAoD,gBAAgBjE,aAAkC;AAChD,UAAMkE,sBAAkBjE,kCAAkB,KAAKC,IAAI;AACnD,WACEF,YAAYmE,SAASD,gBAAgBE,aAAY,CAAA,KACjDpE,YAAYmE,SAASD,gBAAgBG,aAAY,CAAA,KACjDrE,YAAYmE,SAASD,gBAAgBI,aAAY,CAAA,KACjDtE,YAAYmE,SAASD,gBAAgBK,aAAY,CAAA;EAErD;EAEAC,SAASC,WAAmB;AAC1B,UAAMC,wBAAoB3F,wBAAS4F,gCAAgCF,SAAAA,GAAY,MAAM,mBAAA;AACrF,QAAInD,UAAU,KAAK3B;AACnB,QAAI2B,QAAQvB,WAAW,GAAG;AACxB,aAAO;IACT;AACA,QAAI2D,QAAQpC,QAAQvB,SAAS;AAC7B,WAAO2D,SAAS,GAAG;AACjB,UAAIkB,SAASpD,OAAOU,SAASZ,QAAQuD,OAAOnB,KAAAA,CAAAA;AAC5CkB,gBAAUF;AACV,UAAIE,SAAS,GAAG;AACdA,kBAAU;AACVtD,kBAAUA,QAAQwD,MAAM,GAAGxC,KAAKyC,IAAI,GAAGrB,KAAAA,CAAAA,IAAUkB,OAAOnF,SAAQ,IAAK6B,QAAQwD,MAAMxC,KAAKyC,IAAI,GAAGrB,QAAQ,CAAA,CAAA;AACvGA;MACF,WAAWkB,SAAS,GAAG;AACrBA,kBAAU;AACVtD,kBAAUA,QAAQwD,MAAM,GAAGxC,KAAKyC,IAAI,GAAGrB,KAAAA,CAAAA,IAAUkB,OAAOnF,SAAQ,IAAK6B,QAAQwD,MAAMxC,KAAKyC,IAAI,GAAGrB,QAAQ,CAAA,CAAA;AACvGA;MACF,OAAO;AACLA,gBAAQ;MACV;IACF;AACA,WAAOlF,SAAQuD,gBAAgBT,OAAAA;EACjC;EAEAX,MAAMnB,IAAY;AAChBZ,qBAAiBY,IAAI,IAAI;AACzB,SAAKwF,OAAO,KAAKpF,MAAMJ,EAAAA;AACvB,WAAO;EACT;EAEAwF,OAAOpF,MAAcP,KAAa;AAChCT,qBAAiBS,GAAAA;AACjB,SAAKA,MAAMA;AACX,SAAKuB,QAAQhB,IAAAA;AACb,WAAO;EACT;EAEAgB,QAAQhB,MAAc;AACpBb,gCAASa,OAAOxB,UAAU,MAAM,iBAAiBwB,IAAAA,SAAaxB,QAAAA,EAAU;AACxE,SAAKiB,MAAO,KAAKA,MAAMV,UAAY+C,OAAO9B,IAAAA,KAAS;AACnD,WAAO;EACT;EAEAqF,SAAiB;AACf,WAAO,KAAKpF;EACd;EAEAJ,WAAW;AACT,WAAO,KAAKE;EACd;EAEUL,YAAY;AACpB,UAAM4F,gBAAgB,KAAK1F,GAAGC,SAAS,CAAA;AACvC,SAAKmB,QAAQsE,cAAcnF,MAAM;EACnC;AACF;","names":["RelativeDirectionConstantLookup","e","n","s","w","MAX_ZOOM","isQuadkey","obj","type","Quadkey","FULL_MASK","ZOOM_MASK","ID_MASK","assertMaxBitUint","value","bits","assertEx","Zero","from","root","_geoJson","constructor","key","guessZoom","base16String","id","toString","padStart","base4Hash","zoom","base4HashLabel","hash","length","boundingBox","tileToBoundingBox","tile","center","result","boundingBoxToCenter","LngLat","children","shiftedId","i","push","setId","setZoom","gridLocation","tileData","tileFromQuadkey","col","row","parent","siblings","filteredSiblings","filter","quadkey","valid","Number","fromArrayBuffer","BigInt","hexFromArrayBuffer","prefix","fromBase16String","hexFromHexString","fromBase4String","undefined","nibble","parseInt","fromBoundingBox","tiles","tilesFromBoundingBox","Math","floor","fromTile","fromLngLat","point","tileFromPoint","convert","quadkeyString","tileToQuadkey","fromString","base","Error","childrenByZoom","deepResult","clone","equals","geoJson","GeoJson","getGridBoundingBox","size","index","left","top","blockSize","height","width","getGridLocation","isInBoundingBox","tileBoundingBox","contains","getNorthEast","getNorthWest","getSouthEast","getSouthWest","relative","direction","directionConstant","RelativeDirectionConstantLookup","number","charAt","slice","max","setKey","toJSON","quadkeySimple"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/Quadkey.ts","../../src/RelativeDirectionConstantLookup.ts"],"sourcesContent":["export * from './Quadkey'\n","import { assertEx } from '@xylabs/assert'\nimport { hexFromArrayBuffer, hexFromHexString } from '@xylabs/hex'\nimport {\n boundingBoxToCenter,\n GeoJson,\n MercatorBoundingBox,\n MercatorTile,\n tileFromPoint,\n tileFromQuadkey,\n tilesFromBoundingBox,\n tileToBoundingBox,\n tileToQuadkey,\n} from '@xyo-network/sdk-geo'\nimport { LngLat, LngLatLike } from 'mapbox-gl'\n\nimport { RelativeDirectionConstantLookup } from './RelativeDirectionConstantLookup'\n\nconst MAX_ZOOM = 124\n\nexport const isQuadkey = (obj: { type: string }) => obj?.type === Quadkey.type\n\nconst FULL_MASK = 2n ** 256n - 1n\nconst ZOOM_MASK = 0xffn << 248n\nconst ID_MASK = ZOOM_MASK ^ FULL_MASK\n\nconst assertMaxBitUint = (value: bigint, bits = 256n) => {\n assertEx(value < 2n ** bits && value >= 0, () => 'Not a 256 Bit Uint!')\n}\n\nexport class Quadkey {\n static Zero = Quadkey.from(0, 0n)\n static root = new Quadkey()\n static type = 'Quadkey'\n\n type = Quadkey.type\n\n private _geoJson?: GeoJson\n\n constructor(private key = 0n) {\n assertMaxBitUint(key)\n this.guessZoom()\n }\n\n get base16String() {\n return this.id.toString(16).padStart(62, '0')\n }\n\n get base4Hash() {\n return this.id.toString(4).padStart(this.zoom, '0')\n }\n\n get base4HashLabel() {\n const hash = this.base4Hash\n return hash.length === 0 ? 'fhr' : hash\n }\n\n get boundingBox(): MercatorBoundingBox {\n return tileToBoundingBox(this.tile)\n }\n\n get center() {\n const result = boundingBoxToCenter(this.boundingBox)\n return new LngLat(result[0], result[1])\n }\n\n get children() {\n assertEx(this.zoom < MAX_ZOOM - 1, () => 'Can not get children of bottom tiles')\n const result: Quadkey[] = []\n const shiftedId = this.id << 2n\n for (let i = 0n; i < 4n; i++) {\n result.push(new Quadkey().setId(shiftedId | i).setZoom(this.zoom + 1))\n }\n return result\n }\n\n get gridLocation() {\n const tileData = tileFromQuadkey(this.base4Hash)\n\n return {\n col: 2 ** tileData[2] - tileData[1] - 1,\n row: tileData[0],\n zoom: tileData[2],\n }\n }\n\n get id() {\n return this.key & ID_MASK\n }\n\n get parent(): Quadkey | undefined {\n if (this.zoom > 0) {\n return new Quadkey().setId(this.id >> 2n).setZoom(this.zoom - 1)\n }\n }\n\n get siblings() {\n const siblings = assertEx(this.parent?.children, () => `siblings: parentChildren ${this.base4Hash}`)\n const filteredSiblings = siblings.filter((quadkey) => quadkey.key !== this.key)\n assertEx(filteredSiblings.length === 3, () => `siblings: expected 3 [${filteredSiblings.length}]`)\n return filteredSiblings\n }\n\n get tile(): MercatorTile {\n return tileFromQuadkey(this.base4Hash)\n }\n\n get valid() {\n //check for additional data outside zoom scope\n return this.id.toString(4) === this.base4Hash.padStart(64, '0')\n }\n\n get zoom() {\n //zoom is stored in top byte\n return Number((this.key & ZOOM_MASK) >> 248n)\n }\n\n static from(zoom: number, id: bigint) {\n return new Quadkey().setId(id).setZoom(zoom)\n }\n\n static fromArrayBuffer(zoom: number, id: ArrayBuffer) {\n return new Quadkey().setId(BigInt(hexFromArrayBuffer(id, { prefix: true }))).setZoom(zoom)\n }\n\n static fromBase16String(value: string) {\n return new Quadkey(BigInt(hexFromHexString(value, { prefix: true })))\n }\n\n static fromBase4String(value?: string) {\n if (value === 'fhr' || value === '' || value === undefined) {\n return Quadkey.root\n }\n let id = 0n\n for (let i = 0; i < value.length; i++) {\n const nibble = Number.parseInt(value[i])\n assertEx(nibble < 4 && nibble >= 0, () => `Invalid Base4 String: ${value}`)\n id = (id << 2n) | BigInt(nibble)\n }\n return new Quadkey().setId(id).setZoom(value.length)\n }\n\n static fromBoundingBox(boundingBox: MercatorBoundingBox, zoom: number) {\n const tiles = tilesFromBoundingBox(boundingBox, Math.floor(zoom))\n const result: Quadkey[] = []\n for (const tile of tiles) {\n result.push(assertEx(Quadkey.fromTile(tile), () => 'Bad Quadkey'))\n }\n\n return result\n }\n\n static fromLngLat(point: LngLatLike, zoom: number) {\n const tile = tileFromPoint(LngLat.convert(point), zoom)\n const quadkeyString = tileToQuadkey(tile)\n return Quadkey.fromBase4String(quadkeyString)\n }\n\n static fromString(zoom: number, id: string, base = 16) {\n switch (base) {\n case 16: {\n return Quadkey.fromBase16String(id).setZoom(zoom)\n }\n default: {\n throw new Error(`Invalid base [${base}]`)\n }\n }\n }\n\n static fromTile(tile: MercatorTile) {\n return Quadkey.fromBase4String(tileToQuadkey(tile))\n }\n\n childrenByZoom(zoom: number) {\n // if we are limiting by zoom, and we are already at that limit, just return this quadkey\n if (zoom && zoom === this.zoom) {\n return [this]\n }\n\n // recursively get children\n let deepResult: Quadkey[] = []\n for (const quadkey of this.children) {\n deepResult = [...deepResult, ...quadkey.childrenByZoom(zoom)]\n }\n return deepResult\n }\n\n clone() {\n return new Quadkey(this.key)\n }\n\n equals(obj: Quadkey): boolean {\n return obj.key == this.key\n }\n\n geoJson() {\n this._geoJson = this._geoJson ?? new GeoJson(this.base4Hash)\n return this._geoJson\n }\n\n getGridBoundingBox(size: number) {\n const hash = this.base4Hash\n let index = 0\n let left = 0\n let top = 0\n let blockSize = size\n while (index < hash.length) {\n blockSize >>= 1\n switch (hash[index]) {\n case '1': {\n left += blockSize\n break\n }\n case '2': {\n top += blockSize\n break\n }\n case '3': {\n left += blockSize\n top += blockSize\n break\n }\n }\n index++\n }\n if (blockSize < 2) {\n blockSize = 2\n }\n return {\n height: blockSize,\n left,\n top,\n width: blockSize,\n }\n }\n\n /** @deprecated use .gridLocation instead */\n getGridLocation() {\n return this.gridLocation\n }\n\n isInBoundingBox(boundingBox: MercatorBoundingBox) {\n const tileBoundingBox = tileToBoundingBox(this.tile)\n return (\n boundingBox.contains(tileBoundingBox.getNorthEast()) ||\n boundingBox.contains(tileBoundingBox.getNorthWest()) ||\n boundingBox.contains(tileBoundingBox.getSouthEast()) ||\n boundingBox.contains(tileBoundingBox.getSouthWest())\n )\n }\n\n relative(direction: string) {\n const directionConstant = assertEx(RelativeDirectionConstantLookup[direction], () => 'Invalid direction')\n let quadkey = this.base4Hash\n if (quadkey.length === 0) {\n return this\n }\n let index = quadkey.length - 1\n while (index >= 0) {\n let number = Number.parseInt(quadkey.charAt(index))\n number += directionConstant\n if (number > 3) {\n number -= 4\n quadkey = quadkey.slice(0, Math.max(0, index)) + number.toString() + quadkey.slice(Math.max(0, index + 1))\n index--\n } else if (number < 0) {\n number += 4\n quadkey = quadkey.slice(0, Math.max(0, index)) + number.toString() + quadkey.slice(Math.max(0, index + 1))\n index--\n } else {\n index = -1\n }\n }\n return Quadkey.fromBase4String(quadkey)\n }\n\n setId(id: bigint) {\n assertMaxBitUint(id, 248n)\n this.setKey(this.zoom, id)\n return this\n }\n\n setKey(zoom: number, key: bigint) {\n assertMaxBitUint(key)\n this.key = key\n this.setZoom(zoom)\n return this\n }\n\n setZoom(zoom: number) {\n assertEx(zoom < MAX_ZOOM, () => `Invalid zoom [${zoom}] max=${MAX_ZOOM}`)\n this.key = (this.key & ID_MASK) | (BigInt(zoom) << 248n)\n return this\n }\n\n toJSON(): string {\n return this.base4HashLabel\n }\n\n toString() {\n return this.base4Hash\n }\n\n protected guessZoom() {\n const quadkeySimple = this.id.toString(4)\n this.setZoom(quadkeySimple.length)\n }\n}\n","export const RelativeDirectionConstantLookup: Record<string, number> = {\n e: 1,\n n: -2,\n s: 2,\n w: -1,\n}\n"],"mappings":"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","names":["src_exports","__export","Quadkey","isQuadkey","__toCommonJS","import_assert","import_hex","import_sdk_geo","import_mapbox_gl","RelativeDirectionConstantLookup","e","n","s","w","MAX_ZOOM","isQuadkey","__name","obj","type","Quadkey","FULL_MASK","ZOOM_MASK","ID_MASK","assertMaxBitUint","value","bits","assertEx","Zero","from","root","_geoJson","constructor","key","guessZoom","base16String","id","toString","padStart","base4Hash","zoom","base4HashLabel","hash","length","boundingBox","tileToBoundingBox","tile","center","result","boundingBoxToCenter","LngLat","children","shiftedId","i","push","setId","setZoom","gridLocation","tileData","tileFromQuadkey","col","row","parent","siblings","filteredSiblings","filter","quadkey","valid","Number","fromArrayBuffer","BigInt","hexFromArrayBuffer","prefix","fromBase16String","hexFromHexString","fromBase4String","undefined","nibble","parseInt","fromBoundingBox","tiles","tilesFromBoundingBox","Math","floor","fromTile","fromLngLat","point","tileFromPoint","convert","quadkeyString","tileToQuadkey","fromString","base","Error","childrenByZoom","deepResult","clone","equals","geoJson","GeoJson","getGridBoundingBox","size","index","left","top","blockSize","height","width","getGridLocation","isInBoundingBox","tileBoundingBox","contains","getNorthEast","getNorthWest","getSouthEast","getSouthWest","relative","direction","directionConstant","RelativeDirectionConstantLookup","number","charAt","slice","max","setKey","toJSON","quadkeySimple"]}
@@ -1,274 +1,2 @@
1
- var __defProp = Object.defineProperty;
2
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
-
4
- // src/Quadkey.ts
5
- import { assertEx } from "@xylabs/assert";
6
- import { hexFromArrayBuffer, hexFromHexString } from "@xylabs/hex";
7
- import { boundingBoxToCenter, GeoJson, tileFromPoint, tileFromQuadkey, tilesFromBoundingBox, tileToBoundingBox, tileToQuadkey } from "@xyo-network/sdk-geo";
8
- import { LngLat } from "mapbox-gl";
9
-
10
- // src/RelativeDirectionConstantLookup.ts
11
- var RelativeDirectionConstantLookup = {
12
- e: 1,
13
- n: -2,
14
- s: 2,
15
- w: -1
16
- };
17
-
18
- // src/Quadkey.ts
19
- var MAX_ZOOM = 124;
20
- var isQuadkey = /* @__PURE__ */ __name((obj) => obj?.type === Quadkey.type, "isQuadkey");
21
- var FULL_MASK = 2n ** 256n - 1n;
22
- var ZOOM_MASK = 0xffn << 248n;
23
- var ID_MASK = ZOOM_MASK ^ FULL_MASK;
24
- var assertMaxBitUint = /* @__PURE__ */ __name((value, bits = 256n) => {
25
- assertEx(value < 2n ** bits && value >= 0, () => "Not a 256 Bit Uint!");
26
- }, "assertMaxBitUint");
27
- 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
- constructor(key = 0n) {
38
- this.key = key;
39
- this.type = _Quadkey.type;
40
- assertMaxBitUint(key);
41
- this.guessZoom();
42
- }
43
- get base16String() {
44
- return this.id.toString(16).padStart(62, "0");
45
- }
46
- get base4Hash() {
47
- return this.id.toString(4).padStart(this.zoom, "0");
48
- }
49
- get base4HashLabel() {
50
- const hash = this.base4Hash;
51
- return hash.length === 0 ? "fhr" : hash;
52
- }
53
- get boundingBox() {
54
- return tileToBoundingBox(this.tile);
55
- }
56
- get center() {
57
- const result = boundingBoxToCenter(this.boundingBox);
58
- return new LngLat(result[0], result[1]);
59
- }
60
- get children() {
61
- assertEx(this.zoom < MAX_ZOOM - 1, () => "Can not get children of bottom tiles");
62
- const result = [];
63
- const shiftedId = this.id << 2n;
64
- for (let i = 0n; i < 4n; i++) {
65
- result.push(new _Quadkey().setId(shiftedId | i).setZoom(this.zoom + 1));
66
- }
67
- return result;
68
- }
69
- get gridLocation() {
70
- const tileData = tileFromQuadkey(this.base4Hash);
71
- return {
72
- col: 2 ** tileData[2] - tileData[1] - 1,
73
- row: tileData[0],
74
- zoom: tileData[2]
75
- };
76
- }
77
- get id() {
78
- return this.key & ID_MASK;
79
- }
80
- get parent() {
81
- if (this.zoom > 0) {
82
- return new _Quadkey().setId(this.id >> 2n).setZoom(this.zoom - 1);
83
- }
84
- }
85
- get siblings() {
86
- const siblings = assertEx(this.parent?.children, () => `siblings: parentChildren ${this.base4Hash}`);
87
- const filteredSiblings = siblings.filter((quadkey) => quadkey.key !== this.key);
88
- assertEx(filteredSiblings.length === 3, () => `siblings: expected 3 [${filteredSiblings.length}]`);
89
- return filteredSiblings;
90
- }
91
- get tile() {
92
- return tileFromQuadkey(this.base4Hash);
93
- }
94
- get valid() {
95
- return this.id.toString(4) === this.base4Hash.padStart(64, "0");
96
- }
97
- get zoom() {
98
- return Number((this.key & ZOOM_MASK) >> 248n);
99
- }
100
- static from(zoom, id) {
101
- return new _Quadkey().setId(id).setZoom(zoom);
102
- }
103
- static fromArrayBuffer(zoom, id) {
104
- return new _Quadkey().setId(BigInt(hexFromArrayBuffer(id, {
105
- prefix: true
106
- }))).setZoom(zoom);
107
- }
108
- static fromBase16String(value) {
109
- return new _Quadkey(BigInt(hexFromHexString(value, {
110
- prefix: true
111
- })));
112
- }
113
- static fromBase4String(value) {
114
- if (value === "fhr" || value === "" || value === void 0) {
115
- return _Quadkey.root;
116
- }
117
- let id = 0n;
118
- for (let i = 0; i < value.length; i++) {
119
- const nibble = Number.parseInt(value[i]);
120
- assertEx(nibble < 4 && nibble >= 0, () => `Invalid Base4 String: ${value}`);
121
- id = id << 2n | BigInt(nibble);
122
- }
123
- return new _Quadkey().setId(id).setZoom(value.length);
124
- }
125
- static fromBoundingBox(boundingBox, zoom) {
126
- const tiles = tilesFromBoundingBox(boundingBox, Math.floor(zoom));
127
- const result = [];
128
- for (const tile of tiles) {
129
- result.push(assertEx(_Quadkey.fromTile(tile), () => "Bad Quadkey"));
130
- }
131
- return result;
132
- }
133
- static fromLngLat(point, zoom) {
134
- const tile = tileFromPoint(LngLat.convert(point), zoom);
135
- const quadkeyString = tileToQuadkey(tile);
136
- return _Quadkey.fromBase4String(quadkeyString);
137
- }
138
- static fromString(zoom, id, base = 16) {
139
- switch (base) {
140
- case 16: {
141
- return _Quadkey.fromBase16String(id).setZoom(zoom);
142
- }
143
- default: {
144
- throw new Error(`Invalid base [${base}]`);
145
- }
146
- }
147
- }
148
- static fromTile(tile) {
149
- return _Quadkey.fromBase4String(tileToQuadkey(tile));
150
- }
151
- childrenByZoom(zoom) {
152
- if (zoom && zoom === this.zoom) {
153
- return [
154
- this
155
- ];
156
- }
157
- let deepResult = [];
158
- for (const quadkey of this.children) {
159
- deepResult = [
160
- ...deepResult,
161
- ...quadkey.childrenByZoom(zoom)
162
- ];
163
- }
164
- return deepResult;
165
- }
166
- clone() {
167
- return new _Quadkey(this.key);
168
- }
169
- equals(obj) {
170
- return obj.key == this.key;
171
- }
172
- geoJson() {
173
- this._geoJson = this._geoJson ?? new GeoJson(this.base4Hash);
174
- return this._geoJson;
175
- }
176
- getGridBoundingBox(size) {
177
- const hash = this.base4Hash;
178
- let index = 0;
179
- let left = 0;
180
- let top = 0;
181
- let blockSize = size;
182
- while (index < hash.length) {
183
- blockSize >>= 1;
184
- switch (hash[index]) {
185
- case "1": {
186
- left += blockSize;
187
- break;
188
- }
189
- case "2": {
190
- top += blockSize;
191
- break;
192
- }
193
- case "3": {
194
- left += blockSize;
195
- top += blockSize;
196
- break;
197
- }
198
- }
199
- index++;
200
- }
201
- if (blockSize < 2) {
202
- blockSize = 2;
203
- }
204
- return {
205
- height: blockSize,
206
- left,
207
- top,
208
- width: blockSize
209
- };
210
- }
211
- /** @deprecated use .gridLocation instead */
212
- getGridLocation() {
213
- return this.gridLocation;
214
- }
215
- isInBoundingBox(boundingBox) {
216
- const tileBoundingBox = tileToBoundingBox(this.tile);
217
- return boundingBox.contains(tileBoundingBox.getNorthEast()) || boundingBox.contains(tileBoundingBox.getNorthWest()) || boundingBox.contains(tileBoundingBox.getSouthEast()) || boundingBox.contains(tileBoundingBox.getSouthWest());
218
- }
219
- relative(direction) {
220
- const directionConstant = assertEx(RelativeDirectionConstantLookup[direction], () => "Invalid direction");
221
- let quadkey = this.base4Hash;
222
- if (quadkey.length === 0) {
223
- return this;
224
- }
225
- let index = quadkey.length - 1;
226
- while (index >= 0) {
227
- let number = Number.parseInt(quadkey.charAt(index));
228
- number += directionConstant;
229
- if (number > 3) {
230
- number -= 4;
231
- quadkey = quadkey.slice(0, Math.max(0, index)) + number.toString() + quadkey.slice(Math.max(0, index + 1));
232
- index--;
233
- } else if (number < 0) {
234
- number += 4;
235
- quadkey = quadkey.slice(0, Math.max(0, index)) + number.toString() + quadkey.slice(Math.max(0, index + 1));
236
- index--;
237
- } else {
238
- index = -1;
239
- }
240
- }
241
- return _Quadkey.fromBase4String(quadkey);
242
- }
243
- setId(id) {
244
- assertMaxBitUint(id, 248n);
245
- this.setKey(this.zoom, id);
246
- return this;
247
- }
248
- setKey(zoom, key) {
249
- assertMaxBitUint(key);
250
- this.key = key;
251
- this.setZoom(zoom);
252
- return this;
253
- }
254
- setZoom(zoom) {
255
- assertEx(zoom < MAX_ZOOM, () => `Invalid zoom [${zoom}] max=${MAX_ZOOM}`);
256
- this.key = this.key & ID_MASK | BigInt(zoom) << 248n;
257
- return this;
258
- }
259
- toJSON() {
260
- return this.base4HashLabel;
261
- }
262
- toString() {
263
- return this.base4Hash;
264
- }
265
- guessZoom() {
266
- const quadkeySimple = this.id.toString(4);
267
- this.setZoom(quadkeySimple.length);
268
- }
269
- };
270
- export {
271
- Quadkey,
272
- isQuadkey
273
- };
1
+ var B=Object.defineProperty;var h=(n,t)=>B(n,"name",{value:t,configurable:!0});import{assertEx as a}from"@xylabs/assert";import{hexFromArrayBuffer as S,hexFromHexString as x}from"@xylabs/hex";import{boundingBoxToCenter as k,GeoJson as w,tileFromPoint as I,tileFromQuadkey as d,tilesFromBoundingBox as Z,tileToBoundingBox as m,tileToQuadkey as f}from"@xyo-network/sdk-geo";import{LngLat as p}from"mapbox-gl";var u={e:1,n:-2,s:2,w:-1};var l=124,F=h(n=>n?.type===c.type,"isQuadkey"),H=2n**256n-1n,y=0xffn<<248n,b=y^H,g=h((n,t=256n)=>{a(n<2n**t&&n>=0,()=>"Not a 256 Bit Uint!")},"assertMaxBitUint"),c=class n{static{h(this,"Quadkey")}key;static Zero=n.from(0,0n);static root=new n;static type="Quadkey";type;_geoJson;constructor(t=0n){this.key=t,this.type=n.type,g(t),this.guessZoom()}get base16String(){return this.id.toString(16).padStart(62,"0")}get base4Hash(){return this.id.toString(4).padStart(this.zoom,"0")}get base4HashLabel(){let t=this.base4Hash;return t.length===0?"fhr":t}get boundingBox(){return m(this.tile)}get center(){let t=k(this.boundingBox);return new p(t[0],t[1])}get children(){a(this.zoom<l-1,()=>"Can not get children of bottom tiles");let t=[],e=this.id<<2n;for(let s=0n;s<4n;s++)t.push(new n().setId(e|s).setZoom(this.zoom+1));return t}get gridLocation(){let t=d(this.base4Hash);return{col:2**t[2]-t[1]-1,row:t[0],zoom:t[2]}}get id(){return this.key&b}get parent(){if(this.zoom>0)return new n().setId(this.id>>2n).setZoom(this.zoom-1)}get siblings(){let e=a(this.parent?.children,()=>`siblings: parentChildren ${this.base4Hash}`).filter(s=>s.key!==this.key);return a(e.length===3,()=>`siblings: expected 3 [${e.length}]`),e}get tile(){return d(this.base4Hash)}get valid(){return this.id.toString(4)===this.base4Hash.padStart(64,"0")}get zoom(){return Number((this.key&y)>>248n)}static from(t,e){return new n().setId(e).setZoom(t)}static fromArrayBuffer(t,e){return new n().setId(BigInt(S(e,{prefix:!0}))).setZoom(t)}static fromBase16String(t){return new n(BigInt(x(t,{prefix:!0})))}static fromBase4String(t){if(t==="fhr"||t===""||t===void 0)return n.root;let e=0n;for(let s=0;s<t.length;s++){let i=Number.parseInt(t[s]);a(i<4&&i>=0,()=>`Invalid Base4 String: ${t}`),e=e<<2n|BigInt(i)}return new n().setId(e).setZoom(t.length)}static fromBoundingBox(t,e){let s=Z(t,Math.floor(e)),i=[];for(let r of s)i.push(a(n.fromTile(r),()=>"Bad Quadkey"));return i}static fromLngLat(t,e){let s=I(p.convert(t),e),i=f(s);return n.fromBase4String(i)}static fromString(t,e,s=16){switch(s){case 16:return n.fromBase16String(e).setZoom(t);default:throw new Error(`Invalid base [${s}]`)}}static fromTile(t){return n.fromBase4String(f(t))}childrenByZoom(t){if(t&&t===this.zoom)return[this];let e=[];for(let s of this.children)e=[...e,...s.childrenByZoom(t)];return e}clone(){return new n(this.key)}equals(t){return t.key==this.key}geoJson(){return this._geoJson=this._geoJson??new w(this.base4Hash),this._geoJson}getGridBoundingBox(t){let e=this.base4Hash,s=0,i=0,r=0,o=t;for(;s<e.length;){switch(o>>=1,e[s]){case"1":{i+=o;break}case"2":{r+=o;break}case"3":{i+=o,r+=o;break}}s++}return o<2&&(o=2),{height:o,left:i,top:r,width:o}}getGridLocation(){return this.gridLocation}isInBoundingBox(t){let e=m(this.tile);return t.contains(e.getNorthEast())||t.contains(e.getNorthWest())||t.contains(e.getSouthEast())||t.contains(e.getSouthWest())}relative(t){let e=a(u[t],()=>"Invalid direction"),s=this.base4Hash;if(s.length===0)return this;let i=s.length-1;for(;i>=0;){let r=Number.parseInt(s.charAt(i));r+=e,r>3?(r-=4,s=s.slice(0,Math.max(0,i))+r.toString()+s.slice(Math.max(0,i+1)),i--):r<0?(r+=4,s=s.slice(0,Math.max(0,i))+r.toString()+s.slice(Math.max(0,i+1)),i--):i=-1}return n.fromBase4String(s)}setId(t){return g(t,248n),this.setKey(this.zoom,t),this}setKey(t,e){return g(e),this.key=e,this.setZoom(t),this}setZoom(t){return a(t<l,()=>`Invalid zoom [${t}] max=${l}`),this.key=this.key&b|BigInt(t)<<248n,this}toJSON(){return this.base4HashLabel}toString(){return this.base4Hash}guessZoom(){let t=this.id.toString(4);this.setZoom(t.length)}};export{c as Quadkey,F as isQuadkey};
274
2
  //# sourceMappingURL=index.js.map