@xyo-network/quadkey 2.75.0 → 2.75.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/Quadkey.d.cts +92 -0
- package/dist/browser/Quadkey.d.cts.map +1 -0
- package/dist/browser/Quadkey.js +29 -79
- package/dist/browser/Quadkey.js.map +1 -1
- package/dist/browser/RelativeDirectionConstantLookup.d.cts +2 -0
- package/dist/browser/RelativeDirectionConstantLookup.d.cts.map +1 -0
- package/dist/browser/RelativeDirectionConstantLookup.js +1 -2
- package/dist/browser/RelativeDirectionConstantLookup.js.map +1 -1
- package/dist/browser/index.d.cts +2 -0
- package/dist/browser/index.d.cts.map +1 -0
- package/dist/browser/index.js +1 -374
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/utils.d.cts +6 -0
- package/dist/browser/utils.d.cts.map +1 -0
- package/dist/browser/utils.js +3 -4
- package/dist/browser/utils.js.map +1 -1
- package/dist/docs.json +3990 -0
- package/dist/node/Quadkey.d.cts +92 -0
- package/dist/node/Quadkey.d.cts.map +1 -0
- package/dist/node/Quadkey.js +91 -37
- package/dist/node/Quadkey.js.map +1 -1
- package/dist/node/Quadkey.mjs +82 -30
- package/dist/node/Quadkey.mjs.map +1 -1
- package/dist/node/RelativeDirectionConstantLookup.d.cts +2 -0
- package/dist/node/RelativeDirectionConstantLookup.d.cts.map +1 -0
- package/dist/node/RelativeDirectionConstantLookup.js +3 -1
- package/dist/node/RelativeDirectionConstantLookup.js.map +1 -1
- package/dist/node/RelativeDirectionConstantLookup.mjs +2 -1
- package/dist/node/RelativeDirectionConstantLookup.mjs.map +1 -1
- package/dist/node/index.d.cts +2 -0
- package/dist/node/index.d.cts.map +1 -0
- package/dist/node/index.js +380 -3
- package/dist/node/index.js.map +1 -1
- package/dist/node/index.mjs +376 -1
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/utils.d.cts +6 -0
- package/dist/node/utils.d.cts.map +1 -0
- package/dist/node/utils.js +5 -3
- package/dist/node/utils.js.map +1 -1
- package/dist/node/utils.mjs +4 -3
- package/dist/node/utils.mjs.map +1 -1
- package/package.json +8 -8
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { BigNumber } from '@xylabs/bignumber';
|
|
3
|
+
import { Buffer } from '@xylabs/buffer';
|
|
4
|
+
import { GeoJson, MercatorBoundingBox, MercatorTile } from '@xyo-network/sdk-geo';
|
|
5
|
+
import { LngLat, LngLatLike } from 'mapbox-gl';
|
|
6
|
+
export * from './utils';
|
|
7
|
+
export declare const isQuadkey: (obj: {
|
|
8
|
+
type: string;
|
|
9
|
+
}) => boolean;
|
|
10
|
+
export declare class Quadkey {
|
|
11
|
+
static Zero: Quadkey;
|
|
12
|
+
static root: Quadkey;
|
|
13
|
+
static type: string;
|
|
14
|
+
type: string;
|
|
15
|
+
private _geoJson?;
|
|
16
|
+
private key;
|
|
17
|
+
constructor(key?: Buffer);
|
|
18
|
+
get base10String(): string;
|
|
19
|
+
get base4Hash(): string;
|
|
20
|
+
get base4HashLabel(): string;
|
|
21
|
+
get bigNumber(): BigNumber;
|
|
22
|
+
get boundingBox(): MercatorBoundingBox;
|
|
23
|
+
get buffer(): Buffer;
|
|
24
|
+
get center(): LngLat;
|
|
25
|
+
get children(): Quadkey[];
|
|
26
|
+
get gridLocation(): {
|
|
27
|
+
col: number;
|
|
28
|
+
row: number;
|
|
29
|
+
zoom: number;
|
|
30
|
+
};
|
|
31
|
+
get hex(): string;
|
|
32
|
+
get id(): Buffer;
|
|
33
|
+
get parent(): Quadkey | undefined;
|
|
34
|
+
get siblings(): Quadkey[];
|
|
35
|
+
get tile(): MercatorTile;
|
|
36
|
+
get valid(): boolean;
|
|
37
|
+
get zoom(): number;
|
|
38
|
+
static from(zoom: number, id: Buffer): Quadkey;
|
|
39
|
+
static fromBase10String(value: string): Quadkey;
|
|
40
|
+
static fromBase16String(value: string): Quadkey;
|
|
41
|
+
static fromBase4String(value?: string): Quadkey | undefined;
|
|
42
|
+
static fromBoundingBox(boundingBox: MercatorBoundingBox, zoom: number): Quadkey[];
|
|
43
|
+
static fromBuffer(value: Buffer): Quadkey;
|
|
44
|
+
static fromLngLat(point: LngLatLike, zoom: number): Quadkey | undefined;
|
|
45
|
+
static fromString(zoom: number, id: string, base?: number): Quadkey;
|
|
46
|
+
static fromTile(tile: MercatorTile): Quadkey | undefined;
|
|
47
|
+
childrenByZoom(zoom: number): Quadkey[];
|
|
48
|
+
clone(): Quadkey;
|
|
49
|
+
compareTo(quadkey: Quadkey): 0 | 1 | -1;
|
|
50
|
+
equals(obj: Quadkey): boolean;
|
|
51
|
+
geoJson(): GeoJson;
|
|
52
|
+
getGridBoundingBox(size: number): {
|
|
53
|
+
height: number;
|
|
54
|
+
left: number;
|
|
55
|
+
top: number;
|
|
56
|
+
width: number;
|
|
57
|
+
};
|
|
58
|
+
/** @deprecated use .gridLocation instead */
|
|
59
|
+
getGridLocation(): {
|
|
60
|
+
col: number;
|
|
61
|
+
row: number;
|
|
62
|
+
zoom: number;
|
|
63
|
+
};
|
|
64
|
+
isInBoundingBox(boundingBox: MercatorBoundingBox): boolean;
|
|
65
|
+
relative(direction: string): Quadkey | undefined;
|
|
66
|
+
setId(id: Buffer): this;
|
|
67
|
+
setKey(zoom: number, id: Buffer): this;
|
|
68
|
+
setZoom(zoom: number): this;
|
|
69
|
+
/** @deprecated use .base10String*/
|
|
70
|
+
toBase10String(): string;
|
|
71
|
+
/** @deprecated use .base4Hash */
|
|
72
|
+
toBase4Hash(): string;
|
|
73
|
+
/** @deprecated use .base4HashLabel */
|
|
74
|
+
toBase4HashLabel(): string;
|
|
75
|
+
/** @deprecated use .bigNumber */
|
|
76
|
+
toBigNumber(): BigNumber;
|
|
77
|
+
/** @deprecated use .boundingBox */
|
|
78
|
+
toBoundingBox(): MercatorBoundingBox;
|
|
79
|
+
/** @deprecated use .buffer */
|
|
80
|
+
toBuffer(): Buffer;
|
|
81
|
+
/** @deprecated use .center */
|
|
82
|
+
toCenter(): LngLat;
|
|
83
|
+
/** @deprecated use .hex instead */
|
|
84
|
+
toHex(): string;
|
|
85
|
+
toJSON(): string;
|
|
86
|
+
toShortString(): string;
|
|
87
|
+
toString(): string;
|
|
88
|
+
/** @deprecated use .tile instead */
|
|
89
|
+
toTile(): MercatorTile;
|
|
90
|
+
protected guessZoom(): void;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=Quadkey.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Quadkey.d.ts","sourceRoot":"","sources":["../../src/Quadkey.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAEL,OAAO,EACP,mBAAmB,EACnB,YAAY,EAMb,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAK9C,cAAc,SAAS,CAAA;AAIvB,eAAO,MAAM,SAAS,QAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,YAA+B,CAAA;AAE9E,qBAAa,OAAO;IAClB,MAAM,CAAC,IAAI,UAAuC;IAClD,MAAM,CAAC,IAAI,UAAgB;IAC3B,MAAM,CAAC,IAAI,SAAY;IAEvB,IAAI,SAAe;IAEnB,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,GAAG,CAAmB;gBAElB,GAAG,SAAmB;IAKlC,IAAI,YAAY,WAEf;IAED,IAAI,SAAS,WAWZ;IAED,IAAI,cAAc,WAGjB;IAED,IAAI,SAAS,cAEZ;IAED,IAAI,WAAW,IAAI,mBAAmB,CAErC;IAED,IAAI,MAAM,WAET;IAED,IAAI,MAAM,WAGT;IAED,IAAI,QAAQ,cAUX;IAED,IAAI,YAAY;;;;MAQf;IAED,IAAI,GAAG,WAEN;IAED,IAAI,EAAE,WAEL;IAED,IAAI,MAAM,IAAI,OAAO,GAAG,SAAS,CAIhC;IAED,IAAI,QAAQ,cAKX;IAED,IAAI,IAAI,IAAI,YAAY,CAEvB;IAED,IAAI,KAAK,YAYR;IAED,IAAI,IAAI,WAEP;IAED,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAIpC,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM;IAIrC,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM;IAKrC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM;IAUrC,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM;IAUrE,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM;IAI/B,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM;IAMjD,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,SAAK;IAWrD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,YAAY;IAIlC,cAAc,CAAC,IAAI,EAAE,MAAM;IAc3B,KAAK;IAIL,SAAS,CAAC,OAAO,EAAE,OAAO;IAI1B,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;IAI7B,OAAO;IAKP,kBAAkB,CAAC,IAAI,EAAE,MAAM;;;;;;IAiC/B,4CAA4C;IAC5C,eAAe;;;;;IAIf,eAAe,CAAC,WAAW,EAAE,mBAAmB;IAUhD,QAAQ,CAAC,SAAS,EAAE,MAAM;IAyB1B,KAAK,CAAC,EAAE,EAAE,MAAM;IAKhB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAM/B,OAAO,CAAC,IAAI,EAAE,MAAM;IAMpB,mCAAmC;IACnC,cAAc;IAId,iCAAiC;IACjC,WAAW;IAIX,sCAAsC;IACtC,gBAAgB;IAKhB,iCAAiC;IACjC,WAAW;IAIX,mCAAmC;IACnC,aAAa,IAAI,mBAAmB;IAIpC,8BAA8B;IAC9B,QAAQ;IAIR,8BAA8B;IAC9B,QAAQ;IAIR,mCAAmC;IACnC,KAAK;IAIL,MAAM,IAAI,MAAM;IAIhB,aAAa;IAOb,QAAQ;IAIR,oCAAoC;IACpC,MAAM,IAAI,YAAY;IAItB,SAAS,CAAC,SAAS;CAKpB"}
|
package/dist/node/Quadkey.js
CHANGED
|
@@ -15,32 +15,82 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
15
15
|
}
|
|
16
16
|
return to;
|
|
17
17
|
};
|
|
18
|
-
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
19
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/Quadkey.ts
|
|
20
21
|
var Quadkey_exports = {};
|
|
21
22
|
__export(Quadkey_exports, {
|
|
22
23
|
Quadkey: () => Quadkey,
|
|
23
|
-
|
|
24
|
+
bitShiftLeft: () => bitShiftLeft,
|
|
25
|
+
bitShiftRight: () => bitShiftRight,
|
|
26
|
+
isQuadkey: () => isQuadkey,
|
|
27
|
+
padHex: () => padHex
|
|
24
28
|
});
|
|
25
29
|
module.exports = __toCommonJS(Quadkey_exports);
|
|
26
30
|
var import_assert = require("@xylabs/assert");
|
|
27
31
|
var import_bignumber = require("@xylabs/bignumber");
|
|
28
|
-
var
|
|
32
|
+
var import_buffer2 = require("@xylabs/buffer");
|
|
29
33
|
var import_sdk_geo = require("@xyo-network/sdk-geo");
|
|
30
34
|
var import_mapbox_gl = require("mapbox-gl");
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
|
|
36
|
+
// src/RelativeDirectionConstantLookup.ts
|
|
37
|
+
var RelativeDirectionConstantLookup = {
|
|
38
|
+
e: 1,
|
|
39
|
+
n: -2,
|
|
40
|
+
s: 2,
|
|
41
|
+
w: -1
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
// src/utils.ts
|
|
45
|
+
var import_buffer = require("@xylabs/buffer");
|
|
46
|
+
var padHex = (hex, byteCount) => {
|
|
47
|
+
let result = hex;
|
|
48
|
+
if (hex.length % 2 !== 0) {
|
|
49
|
+
result = `0${hex}`;
|
|
50
|
+
}
|
|
51
|
+
if (byteCount) {
|
|
52
|
+
while (result.length / 2 < byteCount) {
|
|
53
|
+
result = `00${result}`;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return result;
|
|
57
|
+
};
|
|
58
|
+
var bitShiftLeft = (buffer) => {
|
|
59
|
+
const shifted = import_buffer.Buffer.alloc(buffer.length);
|
|
60
|
+
const last = buffer.length - 1;
|
|
61
|
+
for (let index = 0; index < last; index++) {
|
|
62
|
+
shifted[index] = buffer[index] << 1;
|
|
63
|
+
if (buffer[index + 1] & 128) {
|
|
64
|
+
shifted[index] += 1;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
shifted[last] = buffer[last] << 1;
|
|
68
|
+
return shifted;
|
|
69
|
+
};
|
|
70
|
+
var bitShiftRight = (buffer) => {
|
|
71
|
+
const shifted = import_buffer.Buffer.alloc(buffer.length);
|
|
72
|
+
const last = buffer.length - 1;
|
|
73
|
+
for (let index = last; index > 0; index--) {
|
|
74
|
+
shifted[index] = buffer[index] >> 1;
|
|
75
|
+
if (buffer[index - 1] & 1) {
|
|
76
|
+
shifted[index] += 128;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
shifted[0] = buffer[0] >> 1;
|
|
80
|
+
return shifted;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
// src/Quadkey.ts
|
|
84
|
+
var MAX_ZOOM = 124;
|
|
85
|
+
var isQuadkey = (obj) => (obj == null ? void 0 : obj.type) === Quadkey.type;
|
|
86
|
+
var Quadkey = class _Quadkey {
|
|
87
|
+
static Zero = _Quadkey.from(0, import_buffer2.Buffer.alloc(31, 0));
|
|
88
|
+
static root = new _Quadkey();
|
|
39
89
|
static type = "Quadkey";
|
|
40
|
-
type =
|
|
90
|
+
type = _Quadkey.type;
|
|
41
91
|
_geoJson;
|
|
42
|
-
key =
|
|
43
|
-
constructor(key =
|
|
92
|
+
key = import_buffer2.Buffer.alloc(32);
|
|
93
|
+
constructor(key = import_buffer2.Buffer.alloc(32)) {
|
|
44
94
|
key.copy(this.key, this.key.length - key.length);
|
|
45
95
|
this.guessZoom();
|
|
46
96
|
}
|
|
@@ -79,11 +129,11 @@ class Quadkey {
|
|
|
79
129
|
get children() {
|
|
80
130
|
(0, import_assert.assertEx)(this.zoom < MAX_ZOOM - 1, "Can not get children of bottom tiles");
|
|
81
131
|
const result = [];
|
|
82
|
-
const shiftedId =
|
|
132
|
+
const shiftedId = bitShiftLeft(bitShiftLeft(this.id));
|
|
83
133
|
for (let i = 0; i < 4; i++) {
|
|
84
134
|
const currentLastByte = shiftedId.readUInt8(shiftedId.length - 1);
|
|
85
135
|
shiftedId.writeUInt8(currentLastByte & 252 | i, shiftedId.length - 1);
|
|
86
|
-
result.push(new
|
|
136
|
+
result.push(new _Quadkey().setId(shiftedId).setZoom(this.zoom + 1));
|
|
87
137
|
}
|
|
88
138
|
return result;
|
|
89
139
|
}
|
|
@@ -103,11 +153,12 @@ class Quadkey {
|
|
|
103
153
|
}
|
|
104
154
|
get parent() {
|
|
105
155
|
if (this.zoom > 0) {
|
|
106
|
-
return new
|
|
156
|
+
return new _Quadkey().setId(bitShiftRight(bitShiftRight(this.id))).setZoom(this.zoom - 1);
|
|
107
157
|
}
|
|
108
158
|
}
|
|
109
159
|
get siblings() {
|
|
110
|
-
|
|
160
|
+
var _a;
|
|
161
|
+
const siblings = (0, import_assert.assertEx)((_a = this.parent) == null ? void 0 : _a.children, `siblings: parentChildren ${this.base4Hash}`);
|
|
111
162
|
const filteredSiblings = siblings.filter((quadkey) => this.compareTo(quadkey) !== 0);
|
|
112
163
|
(0, import_assert.assertEx)(filteredSiblings.length === 3, `siblings: expected 3 [${filteredSiblings.length}]`);
|
|
113
164
|
return filteredSiblings;
|
|
@@ -121,10 +172,10 @@ class Quadkey {
|
|
|
121
172
|
const id = this.id;
|
|
122
173
|
let testId = id;
|
|
123
174
|
for (let i = 0; i < shift; i++) {
|
|
124
|
-
testId =
|
|
175
|
+
testId = bitShiftLeft(testId);
|
|
125
176
|
}
|
|
126
177
|
for (let i = 0; i < shift; i++) {
|
|
127
|
-
testId =
|
|
178
|
+
testId = bitShiftRight(testId);
|
|
128
179
|
}
|
|
129
180
|
return testId.compare(id) === 0;
|
|
130
181
|
}
|
|
@@ -132,21 +183,21 @@ class Quadkey {
|
|
|
132
183
|
return this.buffer.readUInt8(0);
|
|
133
184
|
}
|
|
134
185
|
static from(zoom, id) {
|
|
135
|
-
return new
|
|
186
|
+
return new _Quadkey().setId(id).setZoom(zoom);
|
|
136
187
|
}
|
|
137
188
|
static fromBase10String(value) {
|
|
138
|
-
return new
|
|
189
|
+
return new _Quadkey(import_buffer2.Buffer.from(padHex(new import_bignumber.BigNumber(value, 10).toString(16)), "hex"));
|
|
139
190
|
}
|
|
140
191
|
static fromBase16String(value) {
|
|
141
192
|
const valueToUse = value.startsWith("0x") ? value.slice(2) : value;
|
|
142
|
-
return new
|
|
193
|
+
return new _Quadkey(import_buffer2.Buffer.from(padHex(valueToUse), "hex"));
|
|
143
194
|
}
|
|
144
195
|
static fromBase4String(value) {
|
|
145
196
|
if (value === "fhr" || value === "") {
|
|
146
|
-
return
|
|
197
|
+
return _Quadkey.root;
|
|
147
198
|
}
|
|
148
199
|
if (value && value.length && value.length > 0) {
|
|
149
|
-
const quadkey = new
|
|
200
|
+
const quadkey = new _Quadkey(import_buffer2.Buffer.from(padHex(new import_bignumber.BigNumber(value, 4).toString(16)), "hex")).setZoom(value.length);
|
|
150
201
|
return quadkey.valid ? quadkey : void 0;
|
|
151
202
|
}
|
|
152
203
|
}
|
|
@@ -154,30 +205,31 @@ class Quadkey {
|
|
|
154
205
|
const tiles = (0, import_sdk_geo.tilesFromBoundingBox)(boundingBox, Math.floor(zoom));
|
|
155
206
|
const result = [];
|
|
156
207
|
for (const tile of tiles) {
|
|
157
|
-
result.push((0, import_assert.assertEx)(
|
|
208
|
+
result.push((0, import_assert.assertEx)(_Quadkey.fromTile(tile), "Bad Quadkey"));
|
|
158
209
|
}
|
|
159
210
|
return result;
|
|
160
211
|
}
|
|
161
212
|
static fromBuffer(value) {
|
|
162
|
-
return
|
|
213
|
+
return _Quadkey.fromBase16String(value.toString("hex"));
|
|
163
214
|
}
|
|
164
215
|
static fromLngLat(point, zoom) {
|
|
165
216
|
const tile = (0, import_sdk_geo.tileFromPoint)(import_mapbox_gl.LngLat.convert(point), zoom);
|
|
166
217
|
const quadkeyString = (0, import_sdk_geo.tileToQuadkey)(tile);
|
|
167
|
-
return
|
|
218
|
+
return _Quadkey.fromBase4String(quadkeyString);
|
|
168
219
|
}
|
|
169
220
|
static fromString(zoom, id, base = 10) {
|
|
221
|
+
var _a;
|
|
170
222
|
switch (base) {
|
|
171
223
|
case 10:
|
|
172
|
-
return
|
|
224
|
+
return (_a = _Quadkey.fromBase10String(id)) == null ? void 0 : _a.setZoom(zoom);
|
|
173
225
|
case 16:
|
|
174
|
-
return
|
|
226
|
+
return _Quadkey.fromBase16String(id).setZoom(zoom);
|
|
175
227
|
default:
|
|
176
228
|
throw Error(`Invalid base [${base}]`);
|
|
177
229
|
}
|
|
178
230
|
}
|
|
179
231
|
static fromTile(tile) {
|
|
180
|
-
return
|
|
232
|
+
return _Quadkey.fromBase4String((0, import_sdk_geo.tileToQuadkey)(tile));
|
|
181
233
|
}
|
|
182
234
|
childrenByZoom(zoom) {
|
|
183
235
|
if (zoom && zoom === this.zoom) {
|
|
@@ -190,7 +242,7 @@ class Quadkey {
|
|
|
190
242
|
return deepResult;
|
|
191
243
|
}
|
|
192
244
|
clone() {
|
|
193
|
-
return
|
|
245
|
+
return _Quadkey.fromBase10String(this.base10String);
|
|
194
246
|
}
|
|
195
247
|
compareTo(quadkey) {
|
|
196
248
|
return this.bigNumber.cmp(quadkey.bigNumber);
|
|
@@ -243,7 +295,7 @@ class Quadkey {
|
|
|
243
295
|
return boundingBox.contains(tileBoundingBox.getNorthEast()) || boundingBox.contains(tileBoundingBox.getNorthWest()) || boundingBox.contains(tileBoundingBox.getSouthEast()) || boundingBox.contains(tileBoundingBox.getSouthWest());
|
|
244
296
|
}
|
|
245
297
|
relative(direction) {
|
|
246
|
-
const directionConstant = (0, import_assert.assertEx)(
|
|
298
|
+
const directionConstant = (0, import_assert.assertEx)(RelativeDirectionConstantLookup[direction], "Invalid direction");
|
|
247
299
|
let quadkey = this.base4Hash;
|
|
248
300
|
if (quadkey.length === 0) {
|
|
249
301
|
return this;
|
|
@@ -264,7 +316,7 @@ class Quadkey {
|
|
|
264
316
|
index = -1;
|
|
265
317
|
}
|
|
266
318
|
}
|
|
267
|
-
return
|
|
319
|
+
return _Quadkey.fromBase4String(quadkey);
|
|
268
320
|
}
|
|
269
321
|
setId(id) {
|
|
270
322
|
this.setKey(this.zoom, id);
|
|
@@ -323,7 +375,7 @@ class Quadkey {
|
|
|
323
375
|
return `${part1.toString("hex")}...${part2.toString("hex")}`;
|
|
324
376
|
}
|
|
325
377
|
toString() {
|
|
326
|
-
return `0x${
|
|
378
|
+
return `0x${padHex(this.bigNumber.toString(16))}`;
|
|
327
379
|
}
|
|
328
380
|
/** @deprecated use .tile instead */
|
|
329
381
|
toTile() {
|
|
@@ -334,11 +386,13 @@ class Quadkey {
|
|
|
334
386
|
const quadkeySimple = bn.toString(4);
|
|
335
387
|
this.setZoom(quadkeySimple.length);
|
|
336
388
|
}
|
|
337
|
-
}
|
|
389
|
+
};
|
|
338
390
|
// Annotate the CommonJS export names for ESM import in node:
|
|
339
391
|
0 && (module.exports = {
|
|
340
392
|
Quadkey,
|
|
393
|
+
bitShiftLeft,
|
|
394
|
+
bitShiftRight,
|
|
341
395
|
isQuadkey,
|
|
342
|
-
|
|
396
|
+
padHex
|
|
343
397
|
});
|
|
344
398
|
//# sourceMappingURL=Quadkey.js.map
|
package/dist/node/Quadkey.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Quadkey.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { BigNumber } from '@xylabs/bignumber'\nimport { Buffer } from '@xylabs/buffer'\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'\nimport { bitShiftLeft, bitShiftRight, padHex } from './utils'\n\nexport * from './utils'\n\nconst MAX_ZOOM = 124\n\nexport const isQuadkey = (obj: { type: string }) => obj?.type === Quadkey.type\n\nexport class Quadkey {\n static Zero = Quadkey.from(0, Buffer.alloc(31, 0))\n static root = new Quadkey()\n static type = 'Quadkey'\n\n type = Quadkey.type\n\n private _geoJson?: GeoJson\n private key = Buffer.alloc(32)\n\n constructor(key = Buffer.alloc(32)) {\n key.copy(this.key, this.key.length - key.length)\n this.guessZoom()\n }\n\n get base10String() {\n return this.bigNumber.toString(10)\n }\n\n get base4Hash() {\n const bn = new BigNumber(this.id.toString('hex'), 16)\n const zoom = this.zoom\n if (zoom === 0) {\n return ''\n }\n let quadkeySimple = bn.toString(4)\n while (quadkeySimple.length < zoom) {\n quadkeySimple = `0${quadkeySimple}`\n }\n return quadkeySimple\n }\n\n get base4HashLabel() {\n const hash = this.base4Hash\n return hash.length === 0 ? 'fhr' : hash\n }\n\n get bigNumber() {\n return new BigNumber(`${this.key.toString('hex')}`, 'hex')\n }\n\n get boundingBox(): MercatorBoundingBox {\n return tileToBoundingBox(this.tile)\n }\n\n get buffer() {\n return this.key\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 = bitShiftLeft(bitShiftLeft(this.id))\n for (let i = 0; i < 4; i++) {\n const currentLastByte = shiftedId.readUInt8(shiftedId.length - 1)\n shiftedId.writeUInt8((currentLastByte & 0xfc) | i, shiftedId.length - 1)\n result.push(new Quadkey().setId(shiftedId).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 hex() {\n return `0x${this.key.toString('hex')}`\n }\n\n get id() {\n return this.buffer.slice(1)\n }\n\n get parent(): Quadkey | undefined {\n if (this.zoom > 0) {\n return new Quadkey().setId(bitShiftRight(bitShiftRight(this.id))).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) => this.compareTo(quadkey) !== 0)\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 const zoom = this.zoom\n const shift = (MAX_ZOOM - zoom) * 2\n const id = this.id\n let testId = id\n for (let i = 0; i < shift; i++) {\n testId = bitShiftLeft(testId)\n }\n for (let i = 0; i < shift; i++) {\n testId = bitShiftRight(testId)\n }\n return testId.compare(id) === 0\n }\n\n get zoom() {\n return this.buffer.readUInt8(0)\n }\n\n static from(zoom: number, id: Buffer) {\n return new Quadkey().setId(id).setZoom(zoom)\n }\n\n static fromBase10String(value: string) {\n return new Quadkey(Buffer.from(padHex(new BigNumber(value, 10).toString(16)), 'hex'))\n }\n\n static fromBase16String(value: string) {\n const valueToUse = value.startsWith('0x') ? value.slice(2) : value\n return new Quadkey(Buffer.from(padHex(valueToUse), 'hex'))\n }\n\n static fromBase4String(value?: string) {\n if (value === 'fhr' || value === '') {\n return Quadkey.root\n }\n if (value && value.length && value.length > 0) {\n const quadkey = new Quadkey(Buffer.from(padHex(new BigNumber(value, 4).toString(16)), 'hex')).setZoom(value.length)\n return quadkey.valid ? quadkey : undefined\n }\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 fromBuffer(value: Buffer) {\n return Quadkey.fromBase16String(value.toString('hex'))\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 = 10) {\n switch (base) {\n case 10:\n return Quadkey.fromBase10String(id)?.setZoom(zoom)\n case 16:\n return Quadkey.fromBase16String(id).setZoom(zoom)\n default:\n throw Error(`Invalid base [${base}]`)\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.concat(quadkey.childrenByZoom(zoom))\n }\n return deepResult\n }\n\n clone() {\n return Quadkey.fromBase10String(this.base10String)\n }\n\n compareTo(quadkey: Quadkey) {\n return this.bigNumber.cmp(quadkey.bigNumber)\n }\n\n equals(obj: Quadkey): boolean {\n return obj.base4HashLabel == this.base4HashLabel\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 case '2':\n top += blockSize\n break\n case '3':\n left += blockSize\n top += blockSize\n break\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 = parseInt(quadkey.charAt(index))\n number += directionConstant\n if (number > 3) {\n number -= 4\n quadkey = quadkey.substring(0, index) + number.toString() + quadkey.substring(index + 1)\n index--\n } else if (number < 0) {\n number += 4\n quadkey = quadkey.substring(0, index) + number.toString() + quadkey.substring(index + 1)\n index--\n } else {\n index = -1\n }\n }\n return Quadkey.fromBase4String(quadkey)\n }\n\n setId(id: Buffer) {\n this.setKey(this.zoom, id)\n return this\n }\n\n setKey(zoom: number, id: Buffer) {\n id.copy(this.key, this.key.length - id.length)\n this.key.writeUInt8(zoom, 0)\n return this\n }\n\n setZoom(zoom: number) {\n assertEx(zoom < MAX_ZOOM, `Invalid zoom [${zoom}] max=${MAX_ZOOM}`)\n this.setKey(zoom, this.id)\n return this\n }\n\n /** @deprecated use .base10String*/\n toBase10String() {\n return this.base10String\n }\n\n /** @deprecated use .base4Hash */\n toBase4Hash() {\n return this.base4Hash\n }\n\n /** @deprecated use .base4HashLabel */\n toBase4HashLabel() {\n const hash = this.base4HashLabel\n return hash.length === 0 ? 'fhr' : hash\n }\n\n /** @deprecated use .bigNumber */\n toBigNumber() {\n return this.bigNumber\n }\n\n /** @deprecated use .boundingBox */\n toBoundingBox(): MercatorBoundingBox {\n return this.boundingBox\n }\n\n /** @deprecated use .buffer */\n toBuffer() {\n return this.buffer\n }\n\n /** @deprecated use .center */\n toCenter() {\n return this.center\n }\n\n /** @deprecated use .hex instead */\n toHex() {\n return this.hex\n }\n\n toJSON(): string {\n return this.base4HashLabel\n }\n\n toShortString() {\n const buffer = this.buffer\n const part1 = buffer.slice(0, 2)\n const part2 = buffer.slice(buffer.length - 2, buffer.length)\n return `${part1.toString('hex')}...${part2.toString('hex')}`\n }\n\n toString() {\n return `0x${padHex(this.bigNumber.toString(16))}`\n }\n\n /** @deprecated use .tile instead */\n toTile(): MercatorTile {\n return this.tile\n }\n\n protected guessZoom() {\n const bn = new BigNumber(this.id.toString('hex'), 16)\n const quadkeySimple = bn.toString(4)\n this.setZoom(quadkeySimple.length)\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/Quadkey.ts","../../src/RelativeDirectionConstantLookup.ts","../../src/utils.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { BigNumber } from '@xylabs/bignumber'\nimport { Buffer } from '@xylabs/buffer'\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'\nimport { bitShiftLeft, bitShiftRight, padHex } from './utils'\n\nexport * from './utils'\n\nconst MAX_ZOOM = 124\n\nexport const isQuadkey = (obj: { type: string }) => obj?.type === Quadkey.type\n\nexport class Quadkey {\n static Zero = Quadkey.from(0, Buffer.alloc(31, 0))\n static root = new Quadkey()\n static type = 'Quadkey'\n\n type = Quadkey.type\n\n private _geoJson?: GeoJson\n private key = Buffer.alloc(32)\n\n constructor(key = Buffer.alloc(32)) {\n key.copy(this.key, this.key.length - key.length)\n this.guessZoom()\n }\n\n get base10String() {\n return this.bigNumber.toString(10)\n }\n\n get base4Hash() {\n const bn = new BigNumber(this.id.toString('hex'), 16)\n const zoom = this.zoom\n if (zoom === 0) {\n return ''\n }\n let quadkeySimple = bn.toString(4)\n while (quadkeySimple.length < zoom) {\n quadkeySimple = `0${quadkeySimple}`\n }\n return quadkeySimple\n }\n\n get base4HashLabel() {\n const hash = this.base4Hash\n return hash.length === 0 ? 'fhr' : hash\n }\n\n get bigNumber() {\n return new BigNumber(`${this.key.toString('hex')}`, 'hex')\n }\n\n get boundingBox(): MercatorBoundingBox {\n return tileToBoundingBox(this.tile)\n }\n\n get buffer() {\n return this.key\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 = bitShiftLeft(bitShiftLeft(this.id))\n for (let i = 0; i < 4; i++) {\n const currentLastByte = shiftedId.readUInt8(shiftedId.length - 1)\n shiftedId.writeUInt8((currentLastByte & 0xfc) | i, shiftedId.length - 1)\n result.push(new Quadkey().setId(shiftedId).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 hex() {\n return `0x${this.key.toString('hex')}`\n }\n\n get id() {\n return this.buffer.slice(1)\n }\n\n get parent(): Quadkey | undefined {\n if (this.zoom > 0) {\n return new Quadkey().setId(bitShiftRight(bitShiftRight(this.id))).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) => this.compareTo(quadkey) !== 0)\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 const zoom = this.zoom\n const shift = (MAX_ZOOM - zoom) * 2\n const id = this.id\n let testId = id\n for (let i = 0; i < shift; i++) {\n testId = bitShiftLeft(testId)\n }\n for (let i = 0; i < shift; i++) {\n testId = bitShiftRight(testId)\n }\n return testId.compare(id) === 0\n }\n\n get zoom() {\n return this.buffer.readUInt8(0)\n }\n\n static from(zoom: number, id: Buffer) {\n return new Quadkey().setId(id).setZoom(zoom)\n }\n\n static fromBase10String(value: string) {\n return new Quadkey(Buffer.from(padHex(new BigNumber(value, 10).toString(16)), 'hex'))\n }\n\n static fromBase16String(value: string) {\n const valueToUse = value.startsWith('0x') ? value.slice(2) : value\n return new Quadkey(Buffer.from(padHex(valueToUse), 'hex'))\n }\n\n static fromBase4String(value?: string) {\n if (value === 'fhr' || value === '') {\n return Quadkey.root\n }\n if (value && value.length && value.length > 0) {\n const quadkey = new Quadkey(Buffer.from(padHex(new BigNumber(value, 4).toString(16)), 'hex')).setZoom(value.length)\n return quadkey.valid ? quadkey : undefined\n }\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 fromBuffer(value: Buffer) {\n return Quadkey.fromBase16String(value.toString('hex'))\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 = 10) {\n switch (base) {\n case 10:\n return Quadkey.fromBase10String(id)?.setZoom(zoom)\n case 16:\n return Quadkey.fromBase16String(id).setZoom(zoom)\n default:\n throw Error(`Invalid base [${base}]`)\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.concat(quadkey.childrenByZoom(zoom))\n }\n return deepResult\n }\n\n clone() {\n return Quadkey.fromBase10String(this.base10String)\n }\n\n compareTo(quadkey: Quadkey) {\n return this.bigNumber.cmp(quadkey.bigNumber)\n }\n\n equals(obj: Quadkey): boolean {\n return obj.base4HashLabel == this.base4HashLabel\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 case '2':\n top += blockSize\n break\n case '3':\n left += blockSize\n top += blockSize\n break\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 = parseInt(quadkey.charAt(index))\n number += directionConstant\n if (number > 3) {\n number -= 4\n quadkey = quadkey.substring(0, index) + number.toString() + quadkey.substring(index + 1)\n index--\n } else if (number < 0) {\n number += 4\n quadkey = quadkey.substring(0, index) + number.toString() + quadkey.substring(index + 1)\n index--\n } else {\n index = -1\n }\n }\n return Quadkey.fromBase4String(quadkey)\n }\n\n setId(id: Buffer) {\n this.setKey(this.zoom, id)\n return this\n }\n\n setKey(zoom: number, id: Buffer) {\n id.copy(this.key, this.key.length - id.length)\n this.key.writeUInt8(zoom, 0)\n return this\n }\n\n setZoom(zoom: number) {\n assertEx(zoom < MAX_ZOOM, `Invalid zoom [${zoom}] max=${MAX_ZOOM}`)\n this.setKey(zoom, this.id)\n return this\n }\n\n /** @deprecated use .base10String*/\n toBase10String() {\n return this.base10String\n }\n\n /** @deprecated use .base4Hash */\n toBase4Hash() {\n return this.base4Hash\n }\n\n /** @deprecated use .base4HashLabel */\n toBase4HashLabel() {\n const hash = this.base4HashLabel\n return hash.length === 0 ? 'fhr' : hash\n }\n\n /** @deprecated use .bigNumber */\n toBigNumber() {\n return this.bigNumber\n }\n\n /** @deprecated use .boundingBox */\n toBoundingBox(): MercatorBoundingBox {\n return this.boundingBox\n }\n\n /** @deprecated use .buffer */\n toBuffer() {\n return this.buffer\n }\n\n /** @deprecated use .center */\n toCenter() {\n return this.center\n }\n\n /** @deprecated use .hex instead */\n toHex() {\n return this.hex\n }\n\n toJSON(): string {\n return this.base4HashLabel\n }\n\n toShortString() {\n const buffer = this.buffer\n const part1 = buffer.slice(0, 2)\n const part2 = buffer.slice(buffer.length - 2, buffer.length)\n return `${part1.toString('hex')}...${part2.toString('hex')}`\n }\n\n toString() {\n return `0x${padHex(this.bigNumber.toString(16))}`\n }\n\n /** @deprecated use .tile instead */\n toTile(): MercatorTile {\n return this.tile\n }\n\n protected guessZoom() {\n const bn = new BigNumber(this.id.toString('hex'), 16)\n const quadkeySimple = bn.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","import { Buffer } from '@xylabs/buffer'\n\nexport const padHex = (hex: string, byteCount?: number) => {\n let result = hex\n if (hex.length % 2 !== 0) {\n result = `0${hex}`\n }\n if (byteCount) {\n while (result.length / 2 < byteCount) {\n result = `00${result}`\n }\n }\n return result\n}\n\nexport const bitShiftLeft = (buffer: Buffer) => {\n const shifted = Buffer.alloc(buffer.length)\n const last = buffer.length - 1\n for (let index = 0; index < last; index++) {\n shifted[index] = buffer[index] << 1\n if (buffer[index + 1] & 0x80) {\n shifted[index] += 0x01\n }\n }\n shifted[last] = buffer[last] << 1\n return shifted\n}\n\nexport const bitShiftRight = (buffer: Buffer) => {\n const shifted = Buffer.alloc(buffer.length)\n const last = buffer.length - 1\n for (let index = last; index > 0; index--) {\n shifted[index] = buffer[index] >> 1\n if (buffer[index - 1] & 0x01) {\n shifted[index] += 0x80\n }\n }\n shifted[0] = buffer[0] >> 1\n return shifted\n}\n"],"mappings":"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","names":["import_buffer"]}
|
package/dist/node/Quadkey.mjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
// src/Quadkey.ts
|
|
1
2
|
import { assertEx } from "@xylabs/assert";
|
|
2
3
|
import { BigNumber } from "@xylabs/bignumber";
|
|
3
|
-
import { Buffer } from "@xylabs/buffer";
|
|
4
|
+
import { Buffer as Buffer2 } from "@xylabs/buffer";
|
|
4
5
|
import {
|
|
5
6
|
boundingBoxToCenter,
|
|
6
7
|
GeoJson,
|
|
@@ -11,19 +12,65 @@ import {
|
|
|
11
12
|
tileToQuadkey
|
|
12
13
|
} from "@xyo-network/sdk-geo";
|
|
13
14
|
import { LngLat } from "mapbox-gl";
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
15
|
+
|
|
16
|
+
// src/RelativeDirectionConstantLookup.ts
|
|
17
|
+
var RelativeDirectionConstantLookup = {
|
|
18
|
+
e: 1,
|
|
19
|
+
n: -2,
|
|
20
|
+
s: 2,
|
|
21
|
+
w: -1
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
// src/utils.ts
|
|
25
|
+
import { Buffer } from "@xylabs/buffer";
|
|
26
|
+
var padHex = (hex, byteCount) => {
|
|
27
|
+
let result = hex;
|
|
28
|
+
if (hex.length % 2 !== 0) {
|
|
29
|
+
result = `0${hex}`;
|
|
30
|
+
}
|
|
31
|
+
if (byteCount) {
|
|
32
|
+
while (result.length / 2 < byteCount) {
|
|
33
|
+
result = `00${result}`;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
var bitShiftLeft = (buffer) => {
|
|
39
|
+
const shifted = Buffer.alloc(buffer.length);
|
|
40
|
+
const last = buffer.length - 1;
|
|
41
|
+
for (let index = 0; index < last; index++) {
|
|
42
|
+
shifted[index] = buffer[index] << 1;
|
|
43
|
+
if (buffer[index + 1] & 128) {
|
|
44
|
+
shifted[index] += 1;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
shifted[last] = buffer[last] << 1;
|
|
48
|
+
return shifted;
|
|
49
|
+
};
|
|
50
|
+
var bitShiftRight = (buffer) => {
|
|
51
|
+
const shifted = Buffer.alloc(buffer.length);
|
|
52
|
+
const last = buffer.length - 1;
|
|
53
|
+
for (let index = last; index > 0; index--) {
|
|
54
|
+
shifted[index] = buffer[index] >> 1;
|
|
55
|
+
if (buffer[index - 1] & 1) {
|
|
56
|
+
shifted[index] += 128;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
shifted[0] = buffer[0] >> 1;
|
|
60
|
+
return shifted;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
// src/Quadkey.ts
|
|
64
|
+
var MAX_ZOOM = 124;
|
|
65
|
+
var isQuadkey = (obj) => (obj == null ? void 0 : obj.type) === Quadkey.type;
|
|
66
|
+
var Quadkey = class _Quadkey {
|
|
67
|
+
static Zero = _Quadkey.from(0, Buffer2.alloc(31, 0));
|
|
68
|
+
static root = new _Quadkey();
|
|
22
69
|
static type = "Quadkey";
|
|
23
|
-
type =
|
|
70
|
+
type = _Quadkey.type;
|
|
24
71
|
_geoJson;
|
|
25
|
-
key =
|
|
26
|
-
constructor(key =
|
|
72
|
+
key = Buffer2.alloc(32);
|
|
73
|
+
constructor(key = Buffer2.alloc(32)) {
|
|
27
74
|
key.copy(this.key, this.key.length - key.length);
|
|
28
75
|
this.guessZoom();
|
|
29
76
|
}
|
|
@@ -66,7 +113,7 @@ class Quadkey {
|
|
|
66
113
|
for (let i = 0; i < 4; i++) {
|
|
67
114
|
const currentLastByte = shiftedId.readUInt8(shiftedId.length - 1);
|
|
68
115
|
shiftedId.writeUInt8(currentLastByte & 252 | i, shiftedId.length - 1);
|
|
69
|
-
result.push(new
|
|
116
|
+
result.push(new _Quadkey().setId(shiftedId).setZoom(this.zoom + 1));
|
|
70
117
|
}
|
|
71
118
|
return result;
|
|
72
119
|
}
|
|
@@ -86,11 +133,12 @@ class Quadkey {
|
|
|
86
133
|
}
|
|
87
134
|
get parent() {
|
|
88
135
|
if (this.zoom > 0) {
|
|
89
|
-
return new
|
|
136
|
+
return new _Quadkey().setId(bitShiftRight(bitShiftRight(this.id))).setZoom(this.zoom - 1);
|
|
90
137
|
}
|
|
91
138
|
}
|
|
92
139
|
get siblings() {
|
|
93
|
-
|
|
140
|
+
var _a;
|
|
141
|
+
const siblings = assertEx((_a = this.parent) == null ? void 0 : _a.children, `siblings: parentChildren ${this.base4Hash}`);
|
|
94
142
|
const filteredSiblings = siblings.filter((quadkey) => this.compareTo(quadkey) !== 0);
|
|
95
143
|
assertEx(filteredSiblings.length === 3, `siblings: expected 3 [${filteredSiblings.length}]`);
|
|
96
144
|
return filteredSiblings;
|
|
@@ -115,21 +163,21 @@ class Quadkey {
|
|
|
115
163
|
return this.buffer.readUInt8(0);
|
|
116
164
|
}
|
|
117
165
|
static from(zoom, id) {
|
|
118
|
-
return new
|
|
166
|
+
return new _Quadkey().setId(id).setZoom(zoom);
|
|
119
167
|
}
|
|
120
168
|
static fromBase10String(value) {
|
|
121
|
-
return new
|
|
169
|
+
return new _Quadkey(Buffer2.from(padHex(new BigNumber(value, 10).toString(16)), "hex"));
|
|
122
170
|
}
|
|
123
171
|
static fromBase16String(value) {
|
|
124
172
|
const valueToUse = value.startsWith("0x") ? value.slice(2) : value;
|
|
125
|
-
return new
|
|
173
|
+
return new _Quadkey(Buffer2.from(padHex(valueToUse), "hex"));
|
|
126
174
|
}
|
|
127
175
|
static fromBase4String(value) {
|
|
128
176
|
if (value === "fhr" || value === "") {
|
|
129
|
-
return
|
|
177
|
+
return _Quadkey.root;
|
|
130
178
|
}
|
|
131
179
|
if (value && value.length && value.length > 0) {
|
|
132
|
-
const quadkey = new
|
|
180
|
+
const quadkey = new _Quadkey(Buffer2.from(padHex(new BigNumber(value, 4).toString(16)), "hex")).setZoom(value.length);
|
|
133
181
|
return quadkey.valid ? quadkey : void 0;
|
|
134
182
|
}
|
|
135
183
|
}
|
|
@@ -137,30 +185,31 @@ class Quadkey {
|
|
|
137
185
|
const tiles = tilesFromBoundingBox(boundingBox, Math.floor(zoom));
|
|
138
186
|
const result = [];
|
|
139
187
|
for (const tile of tiles) {
|
|
140
|
-
result.push(assertEx(
|
|
188
|
+
result.push(assertEx(_Quadkey.fromTile(tile), "Bad Quadkey"));
|
|
141
189
|
}
|
|
142
190
|
return result;
|
|
143
191
|
}
|
|
144
192
|
static fromBuffer(value) {
|
|
145
|
-
return
|
|
193
|
+
return _Quadkey.fromBase16String(value.toString("hex"));
|
|
146
194
|
}
|
|
147
195
|
static fromLngLat(point, zoom) {
|
|
148
196
|
const tile = tileFromPoint(LngLat.convert(point), zoom);
|
|
149
197
|
const quadkeyString = tileToQuadkey(tile);
|
|
150
|
-
return
|
|
198
|
+
return _Quadkey.fromBase4String(quadkeyString);
|
|
151
199
|
}
|
|
152
200
|
static fromString(zoom, id, base = 10) {
|
|
201
|
+
var _a;
|
|
153
202
|
switch (base) {
|
|
154
203
|
case 10:
|
|
155
|
-
return
|
|
204
|
+
return (_a = _Quadkey.fromBase10String(id)) == null ? void 0 : _a.setZoom(zoom);
|
|
156
205
|
case 16:
|
|
157
|
-
return
|
|
206
|
+
return _Quadkey.fromBase16String(id).setZoom(zoom);
|
|
158
207
|
default:
|
|
159
208
|
throw Error(`Invalid base [${base}]`);
|
|
160
209
|
}
|
|
161
210
|
}
|
|
162
211
|
static fromTile(tile) {
|
|
163
|
-
return
|
|
212
|
+
return _Quadkey.fromBase4String(tileToQuadkey(tile));
|
|
164
213
|
}
|
|
165
214
|
childrenByZoom(zoom) {
|
|
166
215
|
if (zoom && zoom === this.zoom) {
|
|
@@ -173,7 +222,7 @@ class Quadkey {
|
|
|
173
222
|
return deepResult;
|
|
174
223
|
}
|
|
175
224
|
clone() {
|
|
176
|
-
return
|
|
225
|
+
return _Quadkey.fromBase10String(this.base10String);
|
|
177
226
|
}
|
|
178
227
|
compareTo(quadkey) {
|
|
179
228
|
return this.bigNumber.cmp(quadkey.bigNumber);
|
|
@@ -247,7 +296,7 @@ class Quadkey {
|
|
|
247
296
|
index = -1;
|
|
248
297
|
}
|
|
249
298
|
}
|
|
250
|
-
return
|
|
299
|
+
return _Quadkey.fromBase4String(quadkey);
|
|
251
300
|
}
|
|
252
301
|
setId(id) {
|
|
253
302
|
this.setKey(this.zoom, id);
|
|
@@ -317,9 +366,12 @@ class Quadkey {
|
|
|
317
366
|
const quadkeySimple = bn.toString(4);
|
|
318
367
|
this.setZoom(quadkeySimple.length);
|
|
319
368
|
}
|
|
320
|
-
}
|
|
369
|
+
};
|
|
321
370
|
export {
|
|
322
371
|
Quadkey,
|
|
323
|
-
|
|
372
|
+
bitShiftLeft,
|
|
373
|
+
bitShiftRight,
|
|
374
|
+
isQuadkey,
|
|
375
|
+
padHex
|
|
324
376
|
};
|
|
325
377
|
//# sourceMappingURL=Quadkey.mjs.map
|