@math.gl/dggs 5.0.0-alpha.10

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.
Files changed (118) hide show
  1. package/LICENSE +140 -0
  2. package/README.md +7 -0
  3. package/dist/a5-decoder.d.ts +15 -0
  4. package/dist/a5-decoder.d.ts.map +1 -0
  5. package/dist/a5-decoder.js +36 -0
  6. package/dist/a5-decoder.js.map +1 -0
  7. package/dist/a5.cjs +134 -0
  8. package/dist/a5.cjs.map +6 -0
  9. package/dist/a5.d.ts +2 -0
  10. package/dist/a5.d.ts.map +1 -0
  11. package/dist/a5.js +5 -0
  12. package/dist/a5.js.map +1 -0
  13. package/dist/converters/s2-to-obb-points.d.ts +15 -0
  14. package/dist/converters/s2-to-obb-points.d.ts.map +1 -0
  15. package/dist/converters/s2-to-obb-points.js +60 -0
  16. package/dist/converters/s2-to-obb-points.js.map +1 -0
  17. package/dist/converters/s2-to-region.d.ts +6 -0
  18. package/dist/converters/s2-to-region.d.ts.map +1 -0
  19. package/dist/converters/s2-to-region.js +27 -0
  20. package/dist/converters/s2-to-region.js.map +1 -0
  21. package/dist/dggs-decoder.d.ts +46 -0
  22. package/dist/dggs-decoder.d.ts.map +1 -0
  23. package/dist/dggs-decoder.js +52 -0
  24. package/dist/dggs-decoder.js.map +1 -0
  25. package/dist/geohash-decoder.d.ts +17 -0
  26. package/dist/geohash-decoder.d.ts.map +1 -0
  27. package/dist/geohash-decoder.js +88 -0
  28. package/dist/geohash-decoder.js.map +1 -0
  29. package/dist/geohash.cjs +181 -0
  30. package/dist/geohash.cjs.map +6 -0
  31. package/dist/geohash.d.ts +2 -0
  32. package/dist/geohash.d.ts.map +1 -0
  33. package/dist/geohash.js +5 -0
  34. package/dist/geohash.js.map +1 -0
  35. package/dist/h3-decoder.d.ts +15 -0
  36. package/dist/h3-decoder.d.ts.map +1 -0
  37. package/dist/h3-decoder.js +46 -0
  38. package/dist/h3-decoder.js.map +1 -0
  39. package/dist/h3.cjs +144 -0
  40. package/dist/h3.cjs.map +6 -0
  41. package/dist/h3.d.ts +2 -0
  42. package/dist/h3.d.ts.map +1 -0
  43. package/dist/h3.js +5 -0
  44. package/dist/h3.js.map +1 -0
  45. package/dist/index.cjs +863 -0
  46. package/dist/index.cjs.map +6 -0
  47. package/dist/index.d.ts +27 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +54 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/plus-code-decoder.d.ts +16 -0
  52. package/dist/plus-code-decoder.d.ts.map +1 -0
  53. package/dist/plus-code-decoder.js +50 -0
  54. package/dist/plus-code-decoder.js.map +1 -0
  55. package/dist/plus-code.cjs +161 -0
  56. package/dist/plus-code.cjs.map +6 -0
  57. package/dist/plus-code.d.ts +2 -0
  58. package/dist/plus-code.d.ts.map +1 -0
  59. package/dist/plus-code.js +5 -0
  60. package/dist/plus-code.js.map +1 -0
  61. package/dist/quadkey-decoder.d.ts +14 -0
  62. package/dist/quadkey-decoder.d.ts.map +1 -0
  63. package/dist/quadkey-decoder.js +86 -0
  64. package/dist/quadkey-decoder.js.map +1 -0
  65. package/dist/quadkey.cjs +179 -0
  66. package/dist/quadkey.cjs.map +6 -0
  67. package/dist/quadkey.d.ts +2 -0
  68. package/dist/quadkey.d.ts.map +1 -0
  69. package/dist/quadkey.js +5 -0
  70. package/dist/quadkey.js.map +1 -0
  71. package/dist/s2-decoder.d.ts +36 -0
  72. package/dist/s2-decoder.d.ts.map +1 -0
  73. package/dist/s2-decoder.js +144 -0
  74. package/dist/s2-decoder.js.map +1 -0
  75. package/dist/s2-geometry/s2-geometry.d.ts +33 -0
  76. package/dist/s2-geometry/s2-geometry.d.ts.map +1 -0
  77. package/dist/s2-geometry/s2-geometry.js +249 -0
  78. package/dist/s2-geometry/s2-geometry.js.map +1 -0
  79. package/dist/s2-geometry/s2-to-boundary.d.ts +14 -0
  80. package/dist/s2-geometry/s2-to-boundary.d.ts.map +1 -0
  81. package/dist/s2-geometry/s2-to-boundary.js +60 -0
  82. package/dist/s2-geometry/s2-to-boundary.js.map +1 -0
  83. package/dist/s2-geometry/s2-token.d.ts +43 -0
  84. package/dist/s2-geometry/s2-token.d.ts.map +1 -0
  85. package/dist/s2-geometry/s2-token.js +127 -0
  86. package/dist/s2-geometry/s2-token.js.map +1 -0
  87. package/dist/s2.cjs +543 -0
  88. package/dist/s2.cjs.map +6 -0
  89. package/dist/s2.d.ts +5 -0
  90. package/dist/s2.d.ts.map +1 -0
  91. package/dist/s2.js +7 -0
  92. package/dist/s2.js.map +1 -0
  93. package/dist/unwrap-dggs-boundary.d.ts +12 -0
  94. package/dist/unwrap-dggs-boundary.d.ts.map +1 -0
  95. package/dist/unwrap-dggs-boundary.js +49 -0
  96. package/dist/unwrap-dggs-boundary.js.map +1 -0
  97. package/package.json +80 -0
  98. package/src/a5-decoder.ts +47 -0
  99. package/src/a5.ts +5 -0
  100. package/src/converters/s2-to-obb-points.ts +78 -0
  101. package/src/converters/s2-to-region.ts +30 -0
  102. package/src/dggs-decoder.ts +108 -0
  103. package/src/geohash-decoder.ts +104 -0
  104. package/src/geohash.ts +5 -0
  105. package/src/h3-decoder.ts +58 -0
  106. package/src/h3.ts +5 -0
  107. package/src/index.ts +72 -0
  108. package/src/open-location-code.d.ts +19 -0
  109. package/src/plus-code-decoder.ts +61 -0
  110. package/src/plus-code.ts +5 -0
  111. package/src/quadkey-decoder.ts +103 -0
  112. package/src/quadkey.ts +5 -0
  113. package/src/s2-decoder.ts +157 -0
  114. package/src/s2-geometry/s2-geometry.ts +303 -0
  115. package/src/s2-geometry/s2-to-boundary.ts +76 -0
  116. package/src/s2-geometry/s2-token.ts +139 -0
  117. package/src/s2.ts +15 -0
  118. package/src/unwrap-dggs-boundary.ts +54 -0
@@ -0,0 +1,249 @@
1
+ // math.gl
2
+ // SPDX-License-Identifier: MIT and ISC
3
+ // Copyright (c) vis.gl contributors
4
+ // math.gl, MIT license
5
+ /*
6
+ Adapted from s2-geometry under ISC License (ISC)
7
+ Copyright (c) 2012-2016, Jon Atkins <github@jonatkins.com>
8
+ Copyright (c) 2016, AJ ONeal <aj@daplie.com>
9
+ Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
10
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
11
+ */
12
+ import { isS2IndexValid } from "./s2-token.js";
13
+ export function getS2Cell(s2Index) {
14
+ if (!isS2IndexValid(s2Index)) {
15
+ throw new Error(`Invalid S2 index: ${s2Index}`);
16
+ }
17
+ const key = toHilbertQuadkey(s2Index);
18
+ const s2cell = fromHilbertQuadKey(key);
19
+ return s2cell;
20
+ }
21
+ //
22
+ // Functional Style
23
+ //
24
+ const FACE_BITS = 3;
25
+ const MAX_LEVEL = 30;
26
+ const POS_BITS = 2 * MAX_LEVEL + 1; // 61 (60 bits of data, 1 bit lsb marker)
27
+ const RADIAN_TO_DEGREE = 180 / Math.PI;
28
+ const HILBERT_MAP = {
29
+ a: [
30
+ [0, 'd'],
31
+ [1, 'a'],
32
+ [3, 'b'],
33
+ [2, 'a']
34
+ ],
35
+ b: [
36
+ [2, 'b'],
37
+ [1, 'b'],
38
+ [3, 'a'],
39
+ [0, 'c']
40
+ ],
41
+ c: [
42
+ [2, 'c'],
43
+ [3, 'd'],
44
+ [1, 'c'],
45
+ [0, 'b']
46
+ ],
47
+ d: [
48
+ [0, 'a'],
49
+ [3, 'c'],
50
+ [1, 'd'],
51
+ [2, 'd']
52
+ ]
53
+ };
54
+ /*
55
+ Original function taken from deck.gl doesn't support the case of (face <= 5)
56
+ It's fixed here.
57
+ */
58
+ export function fromHilbertQuadKey(hilbertQuadkey) {
59
+ if (!/^[0-5]\/[0-3]{0,30}$/.test(hilbertQuadkey)) {
60
+ throw new Error(`Invalid S2 Hilbert quadkey: ${hilbertQuadkey}`);
61
+ }
62
+ const parts = hilbertQuadkey.split('/');
63
+ const face = parseInt(parts[0], 10);
64
+ const position = parts[1] || '';
65
+ const maxLevel = position.length;
66
+ let level = 0;
67
+ const point = [0, 0];
68
+ for (let i = maxLevel - 1; i >= 0; i--) {
69
+ level = maxLevel - i;
70
+ const bit = position[i];
71
+ let rx = 0;
72
+ let ry = 0;
73
+ if (bit === '1') {
74
+ ry = 1;
75
+ }
76
+ else if (bit === '2') {
77
+ rx = 1;
78
+ ry = 1;
79
+ }
80
+ else if (bit === '3') {
81
+ rx = 1;
82
+ }
83
+ const val = Math.pow(2, level - 1);
84
+ rotateAndFlipQuadrant(val, point, rx, ry);
85
+ point[0] += val * rx;
86
+ point[1] += val * ry;
87
+ }
88
+ if (face % 2 === 1) {
89
+ const t = point[0];
90
+ point[0] = point[1];
91
+ point[1] = t;
92
+ }
93
+ return { face, ij: point, level };
94
+ }
95
+ export function toHilbertQuadkey(id) {
96
+ if (!isS2IndexValid(id)) {
97
+ throw new Error(`Invalid S2 index: ${id}`);
98
+ }
99
+ let bin = id.toString(2);
100
+ while (bin.length < FACE_BITS + POS_BITS) {
101
+ // eslint-disable-next-line prefer-template
102
+ bin = '0' + bin;
103
+ }
104
+ // MUST come AFTER binstr has been left-padded with '0's
105
+ const lsbIndex = bin.lastIndexOf('1');
106
+ // substr(start, len)
107
+ // substring(start, end) // includes start, does not include end
108
+ const faceB = bin.substring(0, 3);
109
+ // posB will always be a multiple of 2 (or it's invalid)
110
+ const posB = bin.substring(3, lsbIndex);
111
+ const levelN = posB.length / 2;
112
+ const faceS = BigInt(`0b${faceB}`).toString(10);
113
+ let posS = '';
114
+ if (levelN !== 0) {
115
+ posS = BigInt(`0b${posB}`).toString(4);
116
+ while (posS.length < levelN) {
117
+ // eslint-disable-next-line prefer-template
118
+ posS = '0' + posS;
119
+ }
120
+ }
121
+ return `${faceS}/${posS}`;
122
+ }
123
+ /**
124
+ * Converts face-local integer coordinates into an S2 cell index.
125
+ *
126
+ * @param s2Cell - Face, `(i, j)` coordinates, and level of an S2 cell.
127
+ * @returns The corresponding 64-bit S2 cell index.
128
+ */
129
+ export function getS2IndexFromCell(s2Cell) {
130
+ const { face, ij, level } = s2Cell;
131
+ if (!Number.isInteger(face) || face < 0 || face > 5) {
132
+ throw new Error(`Invalid S2 face: ${face}`);
133
+ }
134
+ if (!Number.isInteger(level) || level < 0 || level > MAX_LEVEL) {
135
+ throw new Error(`Invalid S2 level: ${level}`);
136
+ }
137
+ const maximumCoordinate = 2 ** level;
138
+ if (!Number.isInteger(ij[0]) ||
139
+ !Number.isInteger(ij[1]) ||
140
+ ij[0] < 0 ||
141
+ ij[1] < 0 ||
142
+ ij[0] >= maximumCoordinate ||
143
+ ij[1] >= maximumCoordinate) {
144
+ throw new Error(`Invalid S2 IJ coordinates: ${ij[0]}, ${ij[1]}`);
145
+ }
146
+ const positions = getHilbertQuadList(ij[0], ij[1], level, face);
147
+ let s2Index = BigInt(face) << 61n;
148
+ for (let positionIndex = 0; positionIndex < positions.length; positionIndex++) {
149
+ const bitOffset = 59 - positionIndex * 2;
150
+ s2Index |= BigInt(positions[positionIndex]) << BigInt(bitOffset);
151
+ }
152
+ s2Index |= 1n << BigInt(60 - level * 2);
153
+ return s2Index;
154
+ }
155
+ /**
156
+ * Returns a spatially addressed descendant of an S2 cell.
157
+ *
158
+ * Unlike {@link getS2ChildIndex}, `x` and `y` address the descendant along increasing face-local
159
+ * `i` and `j` axes. This accounts for Hilbert orientation changes across faces and levels.
160
+ *
161
+ * @param rootIndex - Valid S2 cell index at the root of the relative grid.
162
+ * @param relativeLevel - Number of subdivision levels below the root.
163
+ * @param x - Descendant coordinate along the root cell's increasing `i` axis.
164
+ * @param y - Descendant coordinate along the root cell's increasing `j` axis.
165
+ * @returns The descendant S2 cell index.
166
+ */
167
+ export function getS2DescendantIndex(rootIndex, relativeLevel, x, y) {
168
+ const rootCell = getS2Cell(rootIndex);
169
+ if (!Number.isInteger(relativeLevel) ||
170
+ relativeLevel < 0 ||
171
+ rootCell.level + relativeLevel > MAX_LEVEL) {
172
+ throw new Error(`Invalid S2 relative level: ${relativeLevel}`);
173
+ }
174
+ const divisionCount = 2 ** relativeLevel;
175
+ if (!Number.isInteger(x) ||
176
+ !Number.isInteger(y) ||
177
+ x < 0 ||
178
+ y < 0 ||
179
+ x >= divisionCount ||
180
+ y >= divisionCount) {
181
+ throw new Error(`Invalid S2 descendant coordinates: ${x}, ${y}`);
182
+ }
183
+ return getS2IndexFromCell({
184
+ face: rootCell.face,
185
+ ij: [rootCell.ij[0] * divisionCount + x, rootCell.ij[1] * divisionCount + y],
186
+ level: rootCell.level + relativeLevel
187
+ });
188
+ }
189
+ export function IJToST(ij, order, offsets) {
190
+ const maxSize = 1 << order;
191
+ return [(ij[0] + offsets[0]) / maxSize, (ij[1] + offsets[1]) / maxSize];
192
+ }
193
+ function singleSTtoUV(st) {
194
+ if (st >= 0.5) {
195
+ return (1 / 3.0) * (4 * st * st - 1);
196
+ }
197
+ return (1 / 3.0) * (1 - 4 * (1 - st) * (1 - st));
198
+ }
199
+ export function STToUV(st) {
200
+ return [singleSTtoUV(st[0]), singleSTtoUV(st[1])];
201
+ }
202
+ export function FaceUVToXYZ(face, [u, v]) {
203
+ switch (face) {
204
+ case 0:
205
+ return [1, u, v];
206
+ case 1:
207
+ return [-u, 1, v];
208
+ case 2:
209
+ return [-u, -v, 1];
210
+ case 3:
211
+ return [-1, -v, -u];
212
+ case 4:
213
+ return [v, -1, -u];
214
+ case 5:
215
+ return [v, u, -1];
216
+ default:
217
+ throw new Error('Invalid face');
218
+ }
219
+ }
220
+ export function XYZToLngLat([x, y, z]) {
221
+ const lat = Math.atan2(z, Math.sqrt(x * x + y * y));
222
+ const lng = Math.atan2(y, x);
223
+ return [lng * RADIAN_TO_DEGREE, lat * RADIAN_TO_DEGREE];
224
+ }
225
+ function rotateAndFlipQuadrant(n, point, rx, ry) {
226
+ if (ry === 0) {
227
+ if (rx === 1) {
228
+ point[0] = n - 1 - point[0];
229
+ point[1] = n - 1 - point[1];
230
+ }
231
+ const x = point[0];
232
+ point[0] = point[1];
233
+ point[1] = x;
234
+ }
235
+ }
236
+ function getHilbertQuadList(x, y, level, face) {
237
+ let orientation = face % 2 === 1 ? 'd' : 'a';
238
+ const positions = [];
239
+ for (let bit = level - 1; bit >= 0; bit--) {
240
+ const mask = 1 << bit;
241
+ const quadrantX = (x & mask) !== 0 ? 1 : 0;
242
+ const quadrantY = (y & mask) !== 0 ? 1 : 0;
243
+ const [position, nextOrientation] = HILBERT_MAP[orientation][quadrantX * 2 + quadrantY];
244
+ positions.push(position);
245
+ orientation = nextOrientation;
246
+ }
247
+ return positions;
248
+ }
249
+ //# sourceMappingURL=s2-geometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s2-geometry.js","sourceRoot":"","sources":["../../src/s2-geometry/s2-geometry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export declare function getS2GeoBounds(s2Index: bigint): Float64Array;
2
+ /**
3
+ * The S2 cell edge is curved: http://s2geometry.io/
4
+ * This is more prominent at lower levels
5
+ * resolution is the number of segments to generate per edge.
6
+ * We exponentially reduce resolution as level increases so it doesn't affect perf
7
+ * when there are a large number of cells
8
+ */
9
+ export declare function getS2GeoBoundsFromCell({ face, ij, level }: {
10
+ face: number;
11
+ ij: [number, number];
12
+ level: number;
13
+ }): Float64Array;
14
+ //# sourceMappingURL=s2-to-boundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s2-to-boundary.d.ts","sourceRoot":"","sources":["../../src/s2-geometry/s2-to-boundary.ts"],"names":[],"mappings":"AAQA,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAG5D;AAED;;;;;;GAMG;AAEH,wBAAgB,sBAAsB,CAAC,EACrC,IAAI,EACJ,EAAE,EACF,KAAK,EACN,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,YAAY,CA8Cf"}
@@ -0,0 +1,60 @@
1
+ // math.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { IJToST, STToUV, FaceUVToXYZ, XYZToLngLat, getS2Cell } from "./s2-geometry.js";
5
+ const MAX_RESOLUTION = 100;
6
+ export function getS2GeoBounds(s2Index) {
7
+ const s2Cell = getS2Cell(s2Index);
8
+ return getS2GeoBoundsFromCell(s2Cell);
9
+ }
10
+ /**
11
+ * The S2 cell edge is curved: http://s2geometry.io/
12
+ * This is more prominent at lower levels
13
+ * resolution is the number of segments to generate per edge.
14
+ * We exponentially reduce resolution as level increases so it doesn't affect perf
15
+ * when there are a large number of cells
16
+ */
17
+ // eslint-disable-next-line max-statements
18
+ export function getS2GeoBoundsFromCell({ face, ij, level }) {
19
+ const offsets = [
20
+ [0, 0],
21
+ [0, 1],
22
+ [1, 1],
23
+ [1, 0],
24
+ [0, 0]
25
+ ];
26
+ const resolution = Math.max(1, Math.ceil(MAX_RESOLUTION * Math.pow(2, -level)));
27
+ const result = new Float64Array(4 * resolution * 2 + 2);
28
+ let ptIndex = 0;
29
+ let prevLng = 0;
30
+ for (let i = 0; i < 4; i++) {
31
+ const offset = offsets[i].slice(0);
32
+ const nextOffset = offsets[i + 1];
33
+ const stepI = (nextOffset[0] - offset[0]) / resolution;
34
+ const stepJ = (nextOffset[1] - offset[1]) / resolution;
35
+ for (let j = 0; j < resolution; j++) {
36
+ offset[0] += stepI;
37
+ offset[1] += stepJ;
38
+ // Cell can be represented by coordinates IJ, ST, UV, XYZ
39
+ // http://s2geometry.io/devguide/s2cell_hierarchy#coordinate-systems
40
+ const st = IJToST(ij, level, offset);
41
+ const uv = STToUV(st);
42
+ const xyz = FaceUVToXYZ(face, uv);
43
+ const lngLat = XYZToLngLat(xyz);
44
+ // Adjust longitude for Web Mercator projection
45
+ if (Math.abs(lngLat[1]) > 89.999) {
46
+ lngLat[0] = prevLng;
47
+ }
48
+ const deltaLng = lngLat[0] - prevLng;
49
+ lngLat[0] += deltaLng > 180 ? -360 : deltaLng < -180 ? 360 : 0;
50
+ result[ptIndex++] = lngLat[0];
51
+ result[ptIndex++] = lngLat[1];
52
+ prevLng = lngLat[0];
53
+ }
54
+ }
55
+ // close the loop
56
+ result[ptIndex++] = result[0];
57
+ result[ptIndex++] = result[1];
58
+ return result;
59
+ }
60
+ //# sourceMappingURL=s2-to-boundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s2-to-boundary.js","sourceRoot":"","sources":["../../src/s2-geometry/s2-to-boundary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Given an S2 token (String) this function convert the token to 64 bit id (Index)
3
+ * 'X' is the empty cell
4
+ * https://github.com/google/s2-geometry-library-java/blob/c04b68bf3197a9c34082327eeb3aec7ab7c85da1/src/com/google/common/geometry/S2CellId.java#L439
5
+ */
6
+ export declare function getS2IndexFromToken(token: string): bigint;
7
+ /**
8
+ * Convert a 64 bit number to a string token
9
+ * 'X' is the empty cell
10
+ */
11
+ export declare function getS2TokenFromIndex(cellId: bigint): string;
12
+ /**
13
+ * Returns whether a value is a valid non-empty 64-bit S2 cell index.
14
+ *
15
+ * @param s2Index - Candidate S2 cell index.
16
+ * @returns `true` when the face and level marker encode a valid S2 cell.
17
+ */
18
+ export declare function isS2IndexValid(s2Index: unknown): s2Index is bigint;
19
+ /**
20
+ * Returns whether a string is a canonical token for a non-empty S2 cell.
21
+ *
22
+ * The empty-cell sentinel `X` is supported by the conversion functions but is not a valid cell.
23
+ *
24
+ * @param token - Candidate hexadecimal S2 token.
25
+ * @returns `true` when the token canonically encodes a valid S2 cell.
26
+ */
27
+ export declare function isS2TokenValid(token: unknown): token is string;
28
+ /**
29
+ * Returns the subdivision level encoded by an S2 cell index.
30
+ *
31
+ * @param s2Index - Valid non-empty S2 cell index.
32
+ * @returns The S2 level in the range `[0, 30]`.
33
+ */
34
+ export declare function getS2Level(s2Index: bigint): number;
35
+ /**
36
+ * Returns one of the four Hilbert-ordered children of an S2 cell.
37
+ *
38
+ * @param s2Index - Valid S2 cell index below level 30.
39
+ * @param index - Hilbert child position in the range `[0, 3]`.
40
+ * @returns The child S2 cell index.
41
+ */
42
+ export declare function getS2ChildIndex(s2Index: bigint, index: number): bigint;
43
+ //# sourceMappingURL=s2-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s2-token.d.ts","sourceRoot":"","sources":["../../src/s2-geometry/s2-token.ts"],"names":[],"mappings":"AAcA;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUzD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAkB1D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,MAAM,CAOlE;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAM9D;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKlD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAetE"}
@@ -0,0 +1,127 @@
1
+ // math.gl
2
+ // SPDX-License-Identifier: MIT and Apache-2.0
3
+ // Copyright (c) vis.gl contributors
4
+ // s2-geometry is a pure JavaScript port of Google/Niantic's S2 Geometry library
5
+ // which is perfect since it works in the browser.
6
+ const MAXIMUM_TOKEN_LENGTH = 16;
7
+ const MAXIMUM_S2_INDEX = (1n << 64n) - 1n;
8
+ const VALID_LOWEST_ON_BITS = 0x1555555555555555n;
9
+ const MAXIMUM_LEVEL = 30;
10
+ // INDEX CALCULATIONS
11
+ /**
12
+ * Given an S2 token (String) this function convert the token to 64 bit id (Index)
13
+ * 'X' is the empty cell
14
+ * https://github.com/google/s2-geometry-library-java/blob/c04b68bf3197a9c34082327eeb3aec7ab7c85da1/src/com/google/common/geometry/S2CellId.java#L439
15
+ */
16
+ export function getS2IndexFromToken(token) {
17
+ if (token === 'X') {
18
+ return 0n;
19
+ }
20
+ if (!isS2TokenValid(token)) {
21
+ throw new Error(`Invalid S2 token: ${token}`);
22
+ }
23
+ // pad token with zeros to make the length 16
24
+ const paddedToken = token.padEnd(MAXIMUM_TOKEN_LENGTH, '0');
25
+ return BigInt(`0x${paddedToken}`);
26
+ }
27
+ /**
28
+ * Convert a 64 bit number to a string token
29
+ * 'X' is the empty cell
30
+ */
31
+ export function getS2TokenFromIndex(cellId) {
32
+ if (cellId === 0n) {
33
+ return 'X';
34
+ }
35
+ if (!isS2IndexValid(cellId)) {
36
+ throw new Error(`Invalid S2 index: ${cellId}`);
37
+ }
38
+ let numZeroDigits = countTrailingZeros(cellId);
39
+ const remainder = numZeroDigits % 4;
40
+ numZeroDigits = (numZeroDigits - remainder) / 4;
41
+ const trailingZeroHexChars = numZeroDigits;
42
+ numZeroDigits *= 4;
43
+ const x = cellId >> BigInt(numZeroDigits);
44
+ const hexString = x.toString(16).replace(/0+$/, '');
45
+ const zeroString = Array(17 - trailingZeroHexChars - hexString.length).join('0');
46
+ return zeroString + hexString;
47
+ }
48
+ /**
49
+ * Returns whether a value is a valid non-empty 64-bit S2 cell index.
50
+ *
51
+ * @param s2Index - Candidate S2 cell index.
52
+ * @returns `true` when the face and level marker encode a valid S2 cell.
53
+ */
54
+ export function isS2IndexValid(s2Index) {
55
+ if (typeof s2Index !== 'bigint' || s2Index <= 0n || s2Index > MAXIMUM_S2_INDEX) {
56
+ return false;
57
+ }
58
+ const face = s2Index >> 61n;
59
+ const lowestOnBit = s2Index & -s2Index;
60
+ return face < 6n && (lowestOnBit & VALID_LOWEST_ON_BITS) !== 0n;
61
+ }
62
+ /**
63
+ * Returns whether a string is a canonical token for a non-empty S2 cell.
64
+ *
65
+ * The empty-cell sentinel `X` is supported by the conversion functions but is not a valid cell.
66
+ *
67
+ * @param token - Candidate hexadecimal S2 token.
68
+ * @returns `true` when the token canonically encodes a valid S2 cell.
69
+ */
70
+ export function isS2TokenValid(token) {
71
+ if (typeof token !== 'string' || !/^[0-9a-fA-F]{1,16}$/.test(token) || token.endsWith('0')) {
72
+ return false;
73
+ }
74
+ const paddedToken = token.padEnd(MAXIMUM_TOKEN_LENGTH, '0');
75
+ return isS2IndexValid(BigInt(`0x${paddedToken}`));
76
+ }
77
+ /**
78
+ * Returns the subdivision level encoded by an S2 cell index.
79
+ *
80
+ * @param s2Index - Valid non-empty S2 cell index.
81
+ * @returns The S2 level in the range `[0, 30]`.
82
+ */
83
+ export function getS2Level(s2Index) {
84
+ if (!isS2IndexValid(s2Index)) {
85
+ throw new Error(`Invalid S2 index: ${s2Index}`);
86
+ }
87
+ return (60 - countTrailingZeros(s2Index)) / 2;
88
+ }
89
+ /**
90
+ * Returns one of the four Hilbert-ordered children of an S2 cell.
91
+ *
92
+ * @param s2Index - Valid S2 cell index below level 30.
93
+ * @param index - Hilbert child position in the range `[0, 3]`.
94
+ * @returns The child S2 cell index.
95
+ */
96
+ export function getS2ChildIndex(s2Index, index) {
97
+ if (!isS2IndexValid(s2Index)) {
98
+ throw new Error(`Invalid S2 index: ${s2Index}`);
99
+ }
100
+ if (!Number.isInteger(index) || index < 0 || index > 3) {
101
+ throw new Error(`Invalid S2 child index: ${index}`);
102
+ }
103
+ if (getS2Level(s2Index) === MAXIMUM_LEVEL) {
104
+ throw new Error('Cannot subdivide an S2 leaf cell');
105
+ }
106
+ // Shift sentinel bit 2 positions to the right.
107
+ const newLsb = lsb(s2Index) >> 2n;
108
+ // Insert child index before the sentinel bit.
109
+ const childCellId = s2Index + BigInt(2 * index + 1 - 4) * newLsb;
110
+ return childCellId;
111
+ }
112
+ /**
113
+ * Return the lowest-numbered bit that is on for this cell id
114
+ * @private
115
+ */
116
+ function lsb(cellId) {
117
+ return cellId & -cellId; // eslint-disable-line
118
+ }
119
+ function countTrailingZeros(n) {
120
+ let count = 0;
121
+ while (n % 2n === 0n) {
122
+ n /= 2n;
123
+ count++;
124
+ }
125
+ return count;
126
+ }
127
+ //# sourceMappingURL=s2-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s2-token.js","sourceRoot":"","sources":["../../src/s2-geometry/s2-token.ts"],"names":[],"mappings":"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"}