@nika-js/onlymap 0.6.26 → 0.7.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/CHANGELOG.md +22 -0
- package/README.md +2 -2
- package/dist/{LercDecode.es-B4KknLMs.js → LercDecode.es-gFG_4xNk.js} +1 -1
- package/dist/{basemap-C4bmWq6M.js → basemap-oVln_CKU.js} +1 -1
- package/dist/elements/om-map.d.ts +9 -1
- package/dist/{geoparquet-BPMda753.js → geoparquet-CufpN8G1.js} +1 -1
- package/dist/{index-DtU_XhTX.js → index--zvhxlLl.js} +2 -2
- package/dist/{index-B5hsHnPl.js → index-CLe7spTj.js} +1 -1
- package/dist/{index-COuIQk2Z.js → index-CnwhAoQ5.js} +11283 -11046
- package/dist/{index-DMT_7aV3.js → index-DEIMxmvY.js} +1 -1
- package/dist/{index-DK5w4OxN.js → index-EXrBWGX7.js} +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/layer-registry.d.ts +10 -0
- package/dist/{lerc-BNW5A6zN.js → lerc-nHFgnN0N.js} +2 -2
- package/dist/onlymap.standalone.js +29352 -28617
- package/dist/onlymapjs.js +91 -89
- package/dist/{raster-eMqzBMQf.js → raster-CE4jsgUi.js} +1086 -799
- package/dist/raster-identify.d.ts +19 -0
- package/dist/{raster-pipeline-Dg-GSDP3.js → raster-pipeline-ghFqryqb.js} +665 -453
- package/dist/raster-pipeline.d.ts +109 -14
- package/dist/raster.d.ts +135 -1
- package/dist/react.js +253 -234
- package/dist/runtime-core.d.ts +23 -0
- package/dist/version.d.ts +1 -1
- package/dist/widget-layout.d.ts +18 -0
- package/dist/{zarr-Dv7OiUcg.js → zarr-DjEYckHG.js} +10 -3
- package/docs/design/cog-v2.md +223 -0
- package/llms.txt +2 -2
- package/onlymapjs.attributes.json +9 -0
- package/onlymapjs.html-data.json +24 -0
- package/package.json +1 -1
- package/skills/onlymapjs/SKILL.md +1 -1
- package/skills/onlymapjs/references/syntax.md +12 -7
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { w as
|
|
2
|
-
import { am as
|
|
3
|
-
function
|
|
4
|
-
const { projectedCorners: n } = e, { topLeft: s, topRight:
|
|
1
|
+
import { w as de } from "./mgrs-BY9bIvp4.js";
|
|
2
|
+
import { am as he, an as fe, ao as se, ap as oe, aq as me, b as pe, ar as ge, l as Z, as as ve, d as be, at as xe, au as Pe, av as ye, aw as ie } from "./index-CnwhAoQ5.js";
|
|
3
|
+
function Te(r, e, t) {
|
|
4
|
+
const { projectedCorners: n } = e, { topLeft: s, topRight: o, bottomRight: i, bottomLeft: a } = n, c = t(s[0], s[1]), u = t(o[0], o[1]), l = t(i[0], i[1]), h = t(a[0], a[1]), f = [
|
|
5
5
|
c,
|
|
6
6
|
u,
|
|
7
7
|
l,
|
|
8
|
-
|
|
8
|
+
h,
|
|
9
9
|
c
|
|
10
|
-
],
|
|
10
|
+
], d = [
|
|
11
11
|
(c[0] + l[0]) / 2,
|
|
12
12
|
(c[1] + l[1]) / 2
|
|
13
|
-
],
|
|
14
|
-
id: `${
|
|
13
|
+
], m = new he({
|
|
14
|
+
id: `${r}-label`,
|
|
15
15
|
data: [
|
|
16
16
|
{
|
|
17
|
-
position:
|
|
17
|
+
position: d,
|
|
18
18
|
text: `x=${e.index.x} y=${e.index.y} z=${e.index.z}`
|
|
19
19
|
}
|
|
20
20
|
],
|
|
@@ -25,8 +25,8 @@ function Pe(o, e, t) {
|
|
|
25
25
|
outlineColor: [0, 0, 0, 255],
|
|
26
26
|
fontSettings: { sdf: !0 }
|
|
27
27
|
});
|
|
28
|
-
return [new
|
|
29
|
-
id:
|
|
28
|
+
return [new fe({
|
|
29
|
+
id: r,
|
|
30
30
|
data: [f],
|
|
31
31
|
getPath: (g) => g,
|
|
32
32
|
getColor: [255, 0, 0, 255],
|
|
@@ -34,9 +34,9 @@ function Pe(o, e, t) {
|
|
|
34
34
|
getWidth: 2,
|
|
35
35
|
widthUnits: "pixels",
|
|
36
36
|
pickable: !1
|
|
37
|
-
}),
|
|
37
|
+
}), m];
|
|
38
38
|
}
|
|
39
|
-
const
|
|
39
|
+
const Le = [
|
|
40
40
|
[1 / 3, 1 / 3, 1 / 3],
|
|
41
41
|
// centroid
|
|
42
42
|
[0.5, 0.5, 0],
|
|
@@ -45,8 +45,8 @@ const xe = [
|
|
|
45
45
|
// edge 0–2
|
|
46
46
|
[0, 0.5, 0.5]
|
|
47
47
|
// edge 1–2
|
|
48
|
-
],
|
|
49
|
-
class
|
|
48
|
+
], we = 0.125;
|
|
49
|
+
class Oe {
|
|
50
50
|
reprojectors;
|
|
51
51
|
/** Width of the image in pixels */
|
|
52
52
|
width;
|
|
@@ -83,8 +83,8 @@ class Te {
|
|
|
83
83
|
_pendingLen;
|
|
84
84
|
constructor(e, t, n = t) {
|
|
85
85
|
this.reprojectors = e, this.width = t, this.height = n, this.uvs = [], this.exactOutputPositions = [], this.triangles = [], this._halfedges = [], this._candidatesUV = [], this._queueIndices = [], this._queue = [], this._errors = [], this._pending = [], this._pendingLen = 0;
|
|
86
|
-
const s = 1,
|
|
87
|
-
this._addTriangle(
|
|
86
|
+
const s = 1, o = 1, i = this._addPoint(0, 0), a = this._addPoint(s, 0), c = this._addPoint(0, o), u = this._addPoint(s, o), l = this._addTriangle(u, i, c, -1, -1, -1);
|
|
87
|
+
this._addTriangle(i, u, a, l, -1, -1), this._flush();
|
|
88
88
|
}
|
|
89
89
|
/**
|
|
90
90
|
* Refine the mesh until its maximum error gets below the given one
|
|
@@ -94,7 +94,7 @@ class Te {
|
|
|
94
94
|
*
|
|
95
95
|
* @return {[type]} [return description]
|
|
96
96
|
*/
|
|
97
|
-
run(e =
|
|
97
|
+
run(e = we, { maxIterations: t = 1e4 } = {}) {
|
|
98
98
|
if (e <= 0)
|
|
99
99
|
throw new Error("maxError must be positive");
|
|
100
100
|
let n = 0;
|
|
@@ -128,64 +128,64 @@ class Te {
|
|
|
128
128
|
* @return Doesn't return; instead modifies internal state.
|
|
129
129
|
*/
|
|
130
130
|
_findReprojectionCandidate(e) {
|
|
131
|
-
const t = 2 * this.triangles[e * 3 + 0], n = 2 * this.triangles[e * 3 + 1], s = 2 * this.triangles[e * 3 + 2],
|
|
132
|
-
let
|
|
133
|
-
for (const v of
|
|
134
|
-
const
|
|
135
|
-
|
|
131
|
+
const t = 2 * this.triangles[e * 3 + 0], n = 2 * this.triangles[e * 3 + 1], s = 2 * this.triangles[e * 3 + 2], o = this.uvs[t], i = this.uvs[t + 1], a = this.uvs[n], c = this.uvs[n + 1], u = this.uvs[s], l = this.uvs[s + 1], h = this.exactOutputPositions[t], f = this.exactOutputPositions[t + 1], d = this.exactOutputPositions[n], m = this.exactOutputPositions[n + 1], p = this.exactOutputPositions[s], g = this.exactOutputPositions[s + 1];
|
|
132
|
+
let P = 0, b = 0, x = 0;
|
|
133
|
+
for (const v of Le) {
|
|
134
|
+
const y = R(o, a, u, v[0], v[1], v[2]), w = R(i, c, l, v[0], v[1], v[2]), M = R(h, d, p, v[0], v[1], v[2]), j = R(f, m, g, v[0], v[1], v[2]), O = y * (this.width - 1), B = w * (this.height - 1), H = this.reprojectors.inverseReproject(M, j), W = this.reprojectors.inverseTransform(H[0], H[1]), le = O - W[0], ue = B - W[1], U = Math.hypot(le, ue);
|
|
135
|
+
U > P && (P = U, b = y, x = w);
|
|
136
136
|
}
|
|
137
|
-
(
|
|
137
|
+
(b === o && x === i || b === a && x === c || b === u && x === l) && (P = 0), this._candidatesUV[2 * e] = b, this._candidatesUV[2 * e + 1] = x, this._queuePush(e, P);
|
|
138
138
|
}
|
|
139
139
|
// process the next triangle in the queue, splitting it with a new point
|
|
140
140
|
_step() {
|
|
141
|
-
const e = this._queuePop(), t = e * 3 + 0, n = e * 3 + 1, s = e * 3 + 2,
|
|
142
|
-
if (D(c, u, l,
|
|
141
|
+
const e = this._queuePop(), t = e * 3 + 0, n = e * 3 + 1, s = e * 3 + 2, o = this.triangles[t], i = this.triangles[n], a = this.triangles[s], c = this.uvs[2 * o], u = this.uvs[2 * o + 1], l = this.uvs[2 * i], h = this.uvs[2 * i + 1], f = this.uvs[2 * a], d = this.uvs[2 * a + 1], m = this._candidatesUV[2 * e], p = this._candidatesUV[2 * e + 1], g = this._addPoint(m, p);
|
|
142
|
+
if (D(c, u, l, h, m, p) === 0)
|
|
143
143
|
this._handleCollinear(g, t);
|
|
144
|
-
else if (D(l,
|
|
144
|
+
else if (D(l, h, f, d, m, p) === 0)
|
|
145
145
|
this._handleCollinear(g, n);
|
|
146
|
-
else if (D(f,
|
|
146
|
+
else if (D(f, d, c, u, m, p) === 0)
|
|
147
147
|
this._handleCollinear(g, s);
|
|
148
148
|
else {
|
|
149
|
-
const
|
|
150
|
-
this._legalize(v), this._legalize(
|
|
149
|
+
const P = this._halfedges[t], b = this._halfedges[n], x = this._halfedges[s], v = this._addTriangle(o, i, g, P, -1, -1, t), y = this._addTriangle(i, a, g, b, -1, v + 1), w = this._addTriangle(a, o, g, x, v + 2, y + 1);
|
|
150
|
+
this._legalize(v), this._legalize(y), this._legalize(w);
|
|
151
151
|
}
|
|
152
152
|
}
|
|
153
153
|
// add coordinates for a new vertex
|
|
154
154
|
_addPoint(e, t) {
|
|
155
155
|
const n = this.uvs.length >> 1;
|
|
156
156
|
this.uvs.push(e, t);
|
|
157
|
-
const s = e * (this.width - 1),
|
|
158
|
-
return this.exactOutputPositions.push(
|
|
157
|
+
const s = e * (this.width - 1), o = t * (this.height - 1), i = this.reprojectors.forwardTransform(s, o), a = this.reprojectors.forwardReproject(i[0], i[1]);
|
|
158
|
+
return this.exactOutputPositions.push(a[0], a[1]), n;
|
|
159
159
|
}
|
|
160
160
|
// add or update a triangle in the mesh
|
|
161
|
-
_addTriangle(e, t, n, s,
|
|
162
|
-
const c =
|
|
163
|
-
return this.triangles[
|
|
161
|
+
_addTriangle(e, t, n, s, o, i, a = this.triangles.length) {
|
|
162
|
+
const c = a / 3;
|
|
163
|
+
return this.triangles[a + 0] = e, this.triangles[a + 1] = t, this.triangles[a + 2] = n, this._halfedges[a + 0] = s, this._halfedges[a + 1] = o, this._halfedges[a + 2] = i, s >= 0 && (this._halfedges[s] = a + 0), o >= 0 && (this._halfedges[o] = a + 1), i >= 0 && (this._halfedges[i] = a + 2), this._candidatesUV[2 * c + 0] = 0, this._candidatesUV[2 * c + 1] = 0, this._queueIndices[c] = -1, this._pending[this._pendingLen++] = c, a;
|
|
164
164
|
}
|
|
165
165
|
_legalize(e) {
|
|
166
166
|
const t = this._halfedges[e];
|
|
167
167
|
if (t < 0)
|
|
168
168
|
return;
|
|
169
|
-
const n = e - e % 3, s = t - t % 3,
|
|
170
|
-
if (!
|
|
169
|
+
const n = e - e % 3, s = t - t % 3, o = n + (e + 1) % 3, i = n + (e + 2) % 3, a = s + (t + 2) % 3, c = s + (t + 1) % 3, u = this.triangles[i], l = this.triangles[e], h = this.triangles[o], f = this.triangles[a], d = this.uvs;
|
|
170
|
+
if (!Me(d[2 * u], d[2 * u + 1], d[2 * l], d[2 * l + 1], d[2 * h], d[2 * h + 1], d[2 * f], d[2 * f + 1]))
|
|
171
171
|
return;
|
|
172
|
-
const
|
|
172
|
+
const m = this._halfedges[o], p = this._halfedges[i], g = this._halfedges[a], P = this._halfedges[c];
|
|
173
173
|
this._queueRemove(n / 3), this._queueRemove(s / 3);
|
|
174
|
-
const
|
|
175
|
-
this._legalize(
|
|
174
|
+
const b = this._addTriangle(u, f, h, -1, g, m, n), x = this._addTriangle(f, u, l, b, p, P, s);
|
|
175
|
+
this._legalize(b + 1), this._legalize(x + 2);
|
|
176
176
|
}
|
|
177
177
|
// handle a case where new vertex is on the edge of a triangle
|
|
178
178
|
_handleCollinear(e, t) {
|
|
179
|
-
const n = t - t % 3, s = n + (t + 1) % 3,
|
|
180
|
-
if (
|
|
181
|
-
const
|
|
182
|
-
this._legalize(
|
|
179
|
+
const n = t - t % 3, s = n + (t + 1) % 3, o = n + (t + 2) % 3, i = this.triangles[o], a = this.triangles[t], c = this.triangles[s], u = this._halfedges[s], l = this._halfedges[o], h = this._halfedges[t];
|
|
180
|
+
if (h < 0) {
|
|
181
|
+
const w = this._addTriangle(e, i, a, -1, l, -1, n), M = this._addTriangle(i, e, c, w, -1, u);
|
|
182
|
+
this._legalize(w + 1), this._legalize(M + 2);
|
|
183
183
|
return;
|
|
184
184
|
}
|
|
185
|
-
const f =
|
|
185
|
+
const f = h - h % 3, d = f + (h + 2) % 3, m = f + (h + 1) % 3, p = this.triangles[d], g = this._halfedges[d], P = this._halfedges[m];
|
|
186
186
|
this._queueRemove(f / 3);
|
|
187
|
-
const
|
|
188
|
-
this._legalize(
|
|
187
|
+
const b = this._addTriangle(i, a, e, l, -1, -1, n), x = this._addTriangle(a, p, e, P, -1, b + 1, f), v = this._addTriangle(p, c, e, g, -1, x + 1), y = this._addTriangle(c, i, e, u, b + 2, v + 1);
|
|
188
|
+
this._legalize(b), this._legalize(x), this._legalize(v), this._legalize(y);
|
|
189
189
|
}
|
|
190
190
|
// priority queue methods
|
|
191
191
|
_queuePush(e, t) {
|
|
@@ -219,8 +219,8 @@ class Te {
|
|
|
219
219
|
_queueSwap(e, t) {
|
|
220
220
|
const n = this._queue[e], s = this._queue[t];
|
|
221
221
|
this._queue[e] = s, this._queue[t] = n, this._queueIndices[n] = t, this._queueIndices[s] = e;
|
|
222
|
-
const
|
|
223
|
-
this._errors[e] = this._errors[t], this._errors[t] =
|
|
222
|
+
const o = this._errors[e];
|
|
223
|
+
this._errors[e] = this._errors[t], this._errors[t] = o;
|
|
224
224
|
}
|
|
225
225
|
_queueUp(e) {
|
|
226
226
|
let t = e;
|
|
@@ -237,26 +237,26 @@ class Te {
|
|
|
237
237
|
const s = 2 * n + 1;
|
|
238
238
|
if (s >= t || s < 0)
|
|
239
239
|
break;
|
|
240
|
-
const
|
|
241
|
-
let
|
|
242
|
-
if (
|
|
240
|
+
const o = s + 1;
|
|
241
|
+
let i = s;
|
|
242
|
+
if (o < t && this._queueLess(o, s) && (i = o), !this._queueLess(i, n))
|
|
243
243
|
break;
|
|
244
|
-
this._queueSwap(n,
|
|
244
|
+
this._queueSwap(n, i), n = i;
|
|
245
245
|
}
|
|
246
246
|
return n > e;
|
|
247
247
|
}
|
|
248
248
|
}
|
|
249
|
-
function D(
|
|
250
|
-
return (t - s) * (e -
|
|
249
|
+
function D(r, e, t, n, s, o) {
|
|
250
|
+
return (t - s) * (e - o) - (n - o) * (r - s);
|
|
251
251
|
}
|
|
252
|
-
function
|
|
253
|
-
const c =
|
|
254
|
-
return c * (
|
|
252
|
+
function Me(r, e, t, n, s, o, i, a) {
|
|
253
|
+
const c = r - i, u = e - a, l = t - i, h = n - a, f = s - i, d = o - a, m = c * c + u * u, p = l * l + h * h, g = f * f + d * d;
|
|
254
|
+
return c * (h * g - p * d) - u * (l * g - p * f) + m * (l * d - h * f) < 0;
|
|
255
255
|
}
|
|
256
|
-
function
|
|
257
|
-
return n *
|
|
256
|
+
function R(r, e, t, n, s, o) {
|
|
257
|
+
return n * r + s * e + o * t;
|
|
258
258
|
}
|
|
259
|
-
const
|
|
259
|
+
const ae = {
|
|
260
260
|
name: "create-texture-unorm",
|
|
261
261
|
inject: {
|
|
262
262
|
"fs:#decl": "uniform sampler2D textureName;",
|
|
@@ -267,10 +267,10 @@ const se = {
|
|
|
267
267
|
`
|
|
268
268
|
)
|
|
269
269
|
},
|
|
270
|
-
getUniforms: (
|
|
271
|
-
textureName:
|
|
270
|
+
getUniforms: (r) => ({
|
|
271
|
+
textureName: r.textureName
|
|
272
272
|
})
|
|
273
|
-
},
|
|
273
|
+
}, je = (
|
|
274
274
|
/* glsl */
|
|
275
275
|
`#version 300 es
|
|
276
276
|
#define SHADER_NAME simple-mesh-layer-fs
|
|
@@ -304,8 +304,8 @@ void main(void) {
|
|
|
304
304
|
fragColor = vec4(lightColor, color.a * layer.opacity);
|
|
305
305
|
}
|
|
306
306
|
`
|
|
307
|
-
),
|
|
308
|
-
...
|
|
307
|
+
), Ae = {
|
|
308
|
+
...se.defaultProps,
|
|
309
309
|
// Note: putting `image` in defaultProps causes Maplibre to fail to render
|
|
310
310
|
// labels in interleaved mode 🤷♂️
|
|
311
311
|
// image: { type: "image", value: null, async: true },
|
|
@@ -318,12 +318,12 @@ void main(void) {
|
|
|
318
318
|
specularColor: [0, 0, 0]
|
|
319
319
|
}
|
|
320
320
|
};
|
|
321
|
-
class
|
|
321
|
+
class Ce extends se {
|
|
322
322
|
static layerName = "mesh-texture-layer";
|
|
323
|
-
static defaultProps =
|
|
323
|
+
static defaultProps = Ae;
|
|
324
324
|
_resolveRenderPipeline() {
|
|
325
325
|
const { image: e, renderPipeline: t } = this.props;
|
|
326
|
-
return [...e ? [{ module:
|
|
326
|
+
return [...e ? [{ module: ae, props: { textureName: e } }] : [], ...t ?? []];
|
|
327
327
|
}
|
|
328
328
|
updateState(e) {
|
|
329
329
|
this.hasRenderPipelineChanged(e) && (e.changeFlags.extensionsChanged = !0), super.updateState(e);
|
|
@@ -333,11 +333,11 @@ class je extends ee {
|
|
|
333
333
|
const { oldProps: t, props: n } = e;
|
|
334
334
|
if (!!t.image != !!n.image)
|
|
335
335
|
return !0;
|
|
336
|
-
const s = t.renderPipeline ?? [],
|
|
337
|
-
if (s.length !==
|
|
336
|
+
const s = t.renderPipeline ?? [], o = n.renderPipeline ?? [];
|
|
337
|
+
if (s.length !== o.length)
|
|
338
338
|
return !0;
|
|
339
|
-
for (let
|
|
340
|
-
if (s[
|
|
339
|
+
for (let i = 0; i < s.length; i++)
|
|
340
|
+
if (s[i]?.module.name !== o[i]?.module.name)
|
|
341
341
|
return !0;
|
|
342
342
|
return !1;
|
|
343
343
|
}
|
|
@@ -349,7 +349,7 @@ class je extends ee {
|
|
|
349
349
|
...e,
|
|
350
350
|
// Override upstream's fragment shader with our copy with modified
|
|
351
351
|
// injection points
|
|
352
|
-
fs:
|
|
352
|
+
fs: je,
|
|
353
353
|
modules: t
|
|
354
354
|
};
|
|
355
355
|
}
|
|
@@ -362,7 +362,7 @@ class je extends ee {
|
|
|
362
362
|
super.draw(e);
|
|
363
363
|
}
|
|
364
364
|
}
|
|
365
|
-
const
|
|
365
|
+
const Re = 0.125, k = [
|
|
366
366
|
[252, 73, 163],
|
|
367
367
|
// pink
|
|
368
368
|
[255, 51, 204],
|
|
@@ -407,7 +407,7 @@ const we = 0.125, U = [
|
|
|
407
407
|
// turquoise
|
|
408
408
|
[0, 204, 255]
|
|
409
409
|
// cyan
|
|
410
|
-
],
|
|
410
|
+
], ze = {
|
|
411
411
|
// A prop with `type: "image"` gets converted to a texture automatically by
|
|
412
412
|
// deck.gl (as long as async: true)
|
|
413
413
|
image: { type: "image", value: null, async: !0 },
|
|
@@ -415,27 +415,27 @@ const we = 0.125, U = [
|
|
|
415
415
|
debug: !1,
|
|
416
416
|
debugOpacity: 0.5
|
|
417
417
|
};
|
|
418
|
-
class
|
|
418
|
+
class Be extends oe {
|
|
419
419
|
static layerName = "RasterLayer";
|
|
420
|
-
static defaultProps =
|
|
420
|
+
static defaultProps = ze;
|
|
421
421
|
initializeState() {
|
|
422
422
|
this.setState({});
|
|
423
423
|
}
|
|
424
424
|
updateState(e) {
|
|
425
425
|
super.updateState(e);
|
|
426
|
-
const { props: t, oldProps: n, changeFlags: s } = e,
|
|
427
|
-
(!!s.dataChanged || t.width !== n.width || t.height !== n.height ||
|
|
426
|
+
const { props: t, oldProps: n, changeFlags: s } = e, o = t.reprojectionFns.forwardTransform !== n.reprojectionFns?.forwardTransform || t.reprojectionFns.inverseTransform !== n.reprojectionFns?.inverseTransform || t.reprojectionFns.forwardReproject !== n.reprojectionFns?.forwardReproject || t.reprojectionFns.inverseReproject !== n.reprojectionFns?.inverseReproject;
|
|
427
|
+
(!!s.dataChanged || t.width !== n.width || t.height !== n.height || o || t.maxError !== n.maxError) && this._generateMesh();
|
|
428
428
|
}
|
|
429
429
|
_generateMesh() {
|
|
430
|
-
const { width: e, height: t, reprojectionFns: n, maxError: s =
|
|
431
|
-
|
|
432
|
-
const { indices:
|
|
430
|
+
const { width: e, height: t, reprojectionFns: n, maxError: s = Re } = this.props, o = new Oe(n, e + 1, t + 1);
|
|
431
|
+
o.run(s);
|
|
432
|
+
const { indices: i, positions: a, texCoords: c } = De(o);
|
|
433
433
|
this.setState({
|
|
434
|
-
reprojector:
|
|
434
|
+
reprojector: o,
|
|
435
435
|
mesh: {
|
|
436
|
-
indices: { value:
|
|
436
|
+
indices: { value: i, size: 1 },
|
|
437
437
|
attributes: {
|
|
438
|
-
POSITION: { value:
|
|
438
|
+
POSITION: { value: a, size: 3 },
|
|
439
439
|
TEXCOORD_0: { value: c, size: 2 }
|
|
440
440
|
}
|
|
441
441
|
}
|
|
@@ -443,23 +443,23 @@ class Ce extends te {
|
|
|
443
443
|
}
|
|
444
444
|
renderDebugLayer() {
|
|
445
445
|
const { reprojector: e } = this.state, { debugOpacity: t } = this.props;
|
|
446
|
-
return e ? new
|
|
446
|
+
return e ? new me(this.getSubLayerProps({
|
|
447
447
|
id: "polygon",
|
|
448
448
|
// https://deck.gl/docs/developer-guide/performance#supply-binary-blobs-to-the-data-prop
|
|
449
449
|
// This `data` gets passed into `getPolygon` with the row index.
|
|
450
450
|
data: { reprojector: e, length: e.triangles.length / 3 },
|
|
451
|
-
getPolygon: (n, { index: s, data:
|
|
452
|
-
const
|
|
451
|
+
getPolygon: (n, { index: s, data: o }) => {
|
|
452
|
+
const i = o.reprojector.triangles, a = e.exactOutputPositions, c = i[s * 3], u = i[s * 3 + 1], l = i[s * 3 + 2];
|
|
453
453
|
return [
|
|
454
|
-
[
|
|
455
|
-
[
|
|
456
|
-
[
|
|
457
|
-
[
|
|
454
|
+
[a[c * 2], a[c * 2 + 1]],
|
|
455
|
+
[a[u * 2], a[u * 2 + 1]],
|
|
456
|
+
[a[l * 2], a[l * 2 + 1]],
|
|
457
|
+
[a[c * 2], a[c * 2 + 1]]
|
|
458
458
|
];
|
|
459
459
|
},
|
|
460
|
-
getFillColor: (n, { index: s, target:
|
|
461
|
-
const
|
|
462
|
-
return
|
|
460
|
+
getFillColor: (n, { index: s, target: o }) => {
|
|
461
|
+
const i = k[s % k.length];
|
|
462
|
+
return o[0] = i[0], o[1] = i[1], o[2] = i[2], o[3] = 255, o;
|
|
463
463
|
},
|
|
464
464
|
getLineColor: [0, 0, 0],
|
|
465
465
|
getLineWidth: 1,
|
|
@@ -472,7 +472,7 @@ class Ce extends te {
|
|
|
472
472
|
const { mesh: e } = this.state, { debug: t, image: n, renderPipeline: s } = this.props;
|
|
473
473
|
if (!e || !n && (s?.length ?? 0) === 0)
|
|
474
474
|
return null;
|
|
475
|
-
const
|
|
475
|
+
const i = [new Ce(this.getSubLayerProps({
|
|
476
476
|
id: "raster",
|
|
477
477
|
image: n,
|
|
478
478
|
renderPipeline: s,
|
|
@@ -490,23 +490,23 @@ class Ce extends te {
|
|
|
490
490
|
getColor: [255, 255, 255]
|
|
491
491
|
}))];
|
|
492
492
|
if (t) {
|
|
493
|
-
const
|
|
494
|
-
|
|
493
|
+
const a = this.renderDebugLayer();
|
|
494
|
+
a && i.push(a);
|
|
495
495
|
}
|
|
496
|
-
return
|
|
496
|
+
return i;
|
|
497
497
|
}
|
|
498
498
|
}
|
|
499
|
-
function
|
|
500
|
-
const e =
|
|
501
|
-
for (let
|
|
502
|
-
t[
|
|
499
|
+
function De(r) {
|
|
500
|
+
const e = r.uvs.length / 2, t = new Float32Array(e * 3), n = new Float32Array(r.uvs);
|
|
501
|
+
for (let o = 0; o < e; o++)
|
|
502
|
+
t[o * 3] = r.exactOutputPositions[o * 2], t[o * 3 + 1] = r.exactOutputPositions[o * 2 + 1], t[o * 3 + 2] = 0;
|
|
503
503
|
return {
|
|
504
|
-
indices: new Uint32Array(
|
|
504
|
+
indices: new Uint32Array(r.triangles),
|
|
505
505
|
positions: t,
|
|
506
506
|
texCoords: n
|
|
507
507
|
};
|
|
508
508
|
}
|
|
509
|
-
class
|
|
509
|
+
class jt {
|
|
510
510
|
levels;
|
|
511
511
|
projectTo3857;
|
|
512
512
|
projectFrom3857;
|
|
@@ -519,49 +519,49 @@ class ft {
|
|
|
519
519
|
this.levels = e.levels, this.projectTo3857 = e.projectTo3857, this.projectFrom3857 = e.projectFrom3857, this.projectTo4326 = e.projectTo4326, this.projectFrom4326 = e.projectFrom4326, this.projectedBounds = e.levels[0].projectedBounds;
|
|
520
520
|
}
|
|
521
521
|
}
|
|
522
|
-
function
|
|
523
|
-
return [1, 0,
|
|
522
|
+
function Ie(r, e) {
|
|
523
|
+
return [1, 0, r, 0, 1, e];
|
|
524
524
|
}
|
|
525
|
-
function
|
|
526
|
-
return [
|
|
525
|
+
function At(r, e = r) {
|
|
526
|
+
return [r, 0, 0, 0, e, 0];
|
|
527
527
|
}
|
|
528
|
-
function
|
|
528
|
+
function L([r, e, t, n, s, o], i, a) {
|
|
529
529
|
return [
|
|
530
|
-
|
|
531
|
-
n *
|
|
530
|
+
r * i + e * a + t,
|
|
531
|
+
n * i + s * a + o
|
|
532
532
|
];
|
|
533
533
|
}
|
|
534
|
-
function
|
|
534
|
+
function Xe([r, e, t, n, s, o], [i, a, c, u, l, h]) {
|
|
535
535
|
return [
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
n *
|
|
540
|
-
n *
|
|
541
|
-
n * c + s *
|
|
536
|
+
r * i + e * u,
|
|
537
|
+
r * a + e * l,
|
|
538
|
+
r * c + e * h + t,
|
|
539
|
+
n * i + s * u,
|
|
540
|
+
n * a + s * l,
|
|
541
|
+
n * c + s * h + o
|
|
542
542
|
];
|
|
543
543
|
}
|
|
544
|
-
function q([
|
|
545
|
-
const
|
|
546
|
-
if (
|
|
544
|
+
function q([r, e, t, n, s, o]) {
|
|
545
|
+
const i = r * s - e * n;
|
|
546
|
+
if (i === 0)
|
|
547
547
|
throw new Error("Cannot invert degenerate transform");
|
|
548
|
-
const
|
|
548
|
+
const a = 1 / i, c = s * a, u = -e * a, l = -n * a, h = r * a;
|
|
549
549
|
return [
|
|
550
550
|
c,
|
|
551
551
|
u,
|
|
552
|
-
-t * c -
|
|
552
|
+
-t * c - o * u,
|
|
553
553
|
l,
|
|
554
|
-
|
|
555
|
-
-t * l -
|
|
554
|
+
h,
|
|
555
|
+
-t * l - o * h
|
|
556
556
|
];
|
|
557
557
|
}
|
|
558
|
-
function
|
|
559
|
-
return
|
|
558
|
+
function Ee(r) {
|
|
559
|
+
return r[0];
|
|
560
560
|
}
|
|
561
|
-
function
|
|
562
|
-
return
|
|
561
|
+
function Se(r) {
|
|
562
|
+
return r[4];
|
|
563
563
|
}
|
|
564
|
-
class
|
|
564
|
+
class Ct {
|
|
565
565
|
tileWidth;
|
|
566
566
|
tileHeight;
|
|
567
567
|
matrixWidth;
|
|
@@ -576,49 +576,49 @@ class mt {
|
|
|
576
576
|
_invAffine;
|
|
577
577
|
constructor(e) {
|
|
578
578
|
this._affine = e.affine, this._invAffine = q(e.affine), this.tileWidth = e.tileWidth, this.tileHeight = e.tileHeight, this.matrixWidth = Math.ceil(e.arrayWidth / e.tileWidth), this.matrixHeight = Math.ceil(e.arrayHeight / e.tileHeight);
|
|
579
|
-
const t =
|
|
579
|
+
const t = Ee(e.affine), n = Se(e.affine);
|
|
580
580
|
this.metersPerPixel = Math.sqrt(Math.abs(t * n)) * e.mpu;
|
|
581
581
|
const s = [
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
],
|
|
582
|
+
L(e.affine, 0, 0),
|
|
583
|
+
L(e.affine, e.arrayWidth, 0),
|
|
584
|
+
L(e.affine, 0, e.arrayHeight),
|
|
585
|
+
L(e.affine, e.arrayWidth, e.arrayHeight)
|
|
586
|
+
], o = s.map(([a]) => a), i = s.map(([, a]) => a);
|
|
587
587
|
this.projectedBounds = [
|
|
588
|
-
Math.min(...
|
|
589
|
-
Math.min(...
|
|
590
|
-
Math.max(...
|
|
591
|
-
Math.max(...
|
|
588
|
+
Math.min(...o),
|
|
589
|
+
Math.min(...i),
|
|
590
|
+
Math.max(...o),
|
|
591
|
+
Math.max(...i)
|
|
592
592
|
];
|
|
593
593
|
}
|
|
594
594
|
projectedTileCorners(e, t) {
|
|
595
|
-
const n = this.tileWidth, s = this.tileHeight,
|
|
595
|
+
const n = this.tileWidth, s = this.tileHeight, o = this._affine;
|
|
596
596
|
return {
|
|
597
|
-
topLeft:
|
|
598
|
-
topRight:
|
|
599
|
-
bottomLeft:
|
|
600
|
-
bottomRight:
|
|
597
|
+
topLeft: L(o, e * n, t * s),
|
|
598
|
+
topRight: L(o, (e + 1) * n, t * s),
|
|
599
|
+
bottomLeft: L(o, e * n, (t + 1) * s),
|
|
600
|
+
bottomRight: L(o, (e + 1) * n, (t + 1) * s)
|
|
601
601
|
};
|
|
602
602
|
}
|
|
603
603
|
tileTransform(e, t) {
|
|
604
|
-
const n =
|
|
604
|
+
const n = Ie(e * this.tileWidth, t * this.tileHeight), s = Xe(this._affine, n), o = q(s);
|
|
605
605
|
return {
|
|
606
|
-
forwardTransform: (
|
|
607
|
-
inverseTransform: (
|
|
606
|
+
forwardTransform: (i, a) => L(s, i, a),
|
|
607
|
+
inverseTransform: (i, a) => L(o, i, a)
|
|
608
608
|
};
|
|
609
609
|
}
|
|
610
610
|
crsBoundsToTileRange(e, t, n, s) {
|
|
611
|
-
const
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
],
|
|
617
|
-
return { minCol:
|
|
611
|
+
const o = this._invAffine, i = [
|
|
612
|
+
L(o, e, t),
|
|
613
|
+
L(o, n, t),
|
|
614
|
+
L(o, e, s),
|
|
615
|
+
L(o, n, s)
|
|
616
|
+
], a = i.map(([y]) => y), c = i.map(([, y]) => y), u = Math.min(...a), l = Math.max(...a), h = Math.min(...c), f = Math.max(...c), d = this.tileWidth, m = this.tileHeight, p = this.matrixWidth - 1, g = this.matrixHeight - 1, P = Math.max(0, Math.floor(u / d)), b = Math.min(p, Math.floor(l / d)), x = Math.max(0, Math.floor(h / m)), v = Math.min(g, Math.floor(f / m));
|
|
617
|
+
return { minCol: P, maxCol: b, minRow: x, maxRow: v };
|
|
618
618
|
}
|
|
619
619
|
}
|
|
620
|
-
function
|
|
621
|
-
switch (
|
|
620
|
+
function Rt(r, { semiMajorAxis: e } = {}) {
|
|
621
|
+
switch (r = r.toLowerCase(), r) {
|
|
622
622
|
case "m":
|
|
623
623
|
case "metre":
|
|
624
624
|
case "meter":
|
|
@@ -629,62 +629,62 @@ function gt(o, { semiMajorAxis: e } = {}) {
|
|
|
629
629
|
case "us survey foot":
|
|
630
630
|
return 1200 / 3937;
|
|
631
631
|
}
|
|
632
|
-
if (
|
|
632
|
+
if (r === "degree") {
|
|
633
633
|
if (e === void 0)
|
|
634
634
|
throw new Error("CRS with degrees unit requires ellipsoid semi-major-axis");
|
|
635
635
|
return 2 * Math.PI * e / 360;
|
|
636
636
|
}
|
|
637
|
-
throw new Error(`Unsupported CRS units: ${
|
|
637
|
+
throw new Error(`Unsupported CRS units: ${r} when computing metersPerUnit.`);
|
|
638
638
|
}
|
|
639
|
-
function
|
|
640
|
-
const e =
|
|
639
|
+
function Ne(r) {
|
|
640
|
+
const e = de(r);
|
|
641
641
|
return e.projName === "longlat" && (!e.units || e.units === "unknown") && (e.units = "degree", e.to_meter = void 0), e;
|
|
642
642
|
}
|
|
643
|
-
const
|
|
644
|
-
async function
|
|
645
|
-
const e = `EPSG:${
|
|
643
|
+
const V = /* @__PURE__ */ new Map();
|
|
644
|
+
async function zt(r) {
|
|
645
|
+
const e = `EPSG:${r}`, t = V.get(e);
|
|
646
646
|
if (t !== void 0)
|
|
647
647
|
return t;
|
|
648
|
-
const n = await
|
|
649
|
-
return
|
|
648
|
+
const n = await Fe(r), s = Ne(n);
|
|
649
|
+
return V.set(e, s), s;
|
|
650
650
|
}
|
|
651
|
-
async function
|
|
652
|
-
const e = `https://epsg.io/${
|
|
651
|
+
async function Fe(r) {
|
|
652
|
+
const e = `https://epsg.io/${r}.json`, t = await fetch(e);
|
|
653
653
|
if (!t.ok)
|
|
654
654
|
throw new Error(`Failed to fetch PROJJSON from ${e}`);
|
|
655
655
|
return await t.json();
|
|
656
656
|
}
|
|
657
|
-
function
|
|
658
|
-
const { densifyPts:
|
|
659
|
-
let u = 1 / 0, l = 1 / 0,
|
|
660
|
-
for (let
|
|
661
|
-
const
|
|
662
|
-
for (let
|
|
663
|
-
const x =
|
|
664
|
-
v < u && (u = v),
|
|
657
|
+
function X(r, e, t, n, s, o = {}) {
|
|
658
|
+
const { densifyPts: i = 21 } = o, a = [e, n, n, e], c = [t, t, s, s];
|
|
659
|
+
let u = 1 / 0, l = 1 / 0, h = -1 / 0, f = -1 / 0;
|
|
660
|
+
for (let d = 0; d < 4; d++) {
|
|
661
|
+
const m = a[d], p = c[d], g = a[(d + 1) % 4], P = c[(d + 1) % 4];
|
|
662
|
+
for (let b = 0; b <= i; b++) {
|
|
663
|
+
const x = b / (i + 1), [v, y] = r(m + (g - m) * x, p + (P - p) * x);
|
|
664
|
+
v < u && (u = v), y < l && (l = y), v > h && (h = v), y > f && (f = y);
|
|
665
665
|
}
|
|
666
666
|
}
|
|
667
|
-
return [u, l,
|
|
667
|
+
return [u, l, h, f];
|
|
668
668
|
}
|
|
669
|
-
const
|
|
670
|
-
function
|
|
671
|
-
const t =
|
|
669
|
+
const G = 6378137, Y = 85.05112877980659;
|
|
670
|
+
function He(r, e) {
|
|
671
|
+
const t = r * Math.PI * G / 180, n = e * Math.PI / 180, s = Math.log(Math.tan(Math.PI / 4 + n / 2)) * G;
|
|
672
672
|
return [t, s];
|
|
673
673
|
}
|
|
674
|
-
function
|
|
674
|
+
function Bt(r, e) {
|
|
675
675
|
return (t, n) => {
|
|
676
|
-
const [s,
|
|
677
|
-
if (Number.isFinite(s) && Number.isFinite(
|
|
678
|
-
return [s,
|
|
679
|
-
const [
|
|
680
|
-
return
|
|
676
|
+
const [s, o] = r(t, n);
|
|
677
|
+
if (Number.isFinite(s) && Number.isFinite(o))
|
|
678
|
+
return [s, o];
|
|
679
|
+
const [i, a] = e(t, n), c = Math.max(-Y, Math.min(Y, a));
|
|
680
|
+
return He(i, c);
|
|
681
681
|
};
|
|
682
682
|
}
|
|
683
|
-
const
|
|
684
|
-
class
|
|
683
|
+
const We = 65536;
|
|
684
|
+
class ce {
|
|
685
685
|
entries = /* @__PURE__ */ new Map();
|
|
686
686
|
maxEntries;
|
|
687
|
-
constructor({ maxEntries: e =
|
|
687
|
+
constructor({ maxEntries: e = We } = {}) {
|
|
688
688
|
this.maxEntries = Math.max(0, e);
|
|
689
689
|
}
|
|
690
690
|
/** Number of cached entries. */
|
|
@@ -696,14 +696,14 @@ class re {
|
|
|
696
696
|
* is marked most-recently-used. Returns `undefined` on a miss.
|
|
697
697
|
*/
|
|
698
698
|
get(e, t, n) {
|
|
699
|
-
const s = `${e}/${t}/${n}`,
|
|
700
|
-
if (
|
|
701
|
-
return this.entries.delete(s), this.entries.set(s,
|
|
699
|
+
const s = `${e}/${t}/${n}`, o = this.entries.get(s);
|
|
700
|
+
if (o !== void 0)
|
|
701
|
+
return this.entries.delete(s), this.entries.set(s, o), o;
|
|
702
702
|
}
|
|
703
703
|
/** Store the bounding volume for tile `(z, x, y)` as most-recently-used. */
|
|
704
704
|
set(e, t, n, s) {
|
|
705
|
-
const
|
|
706
|
-
this.entries.delete(
|
|
705
|
+
const o = `${e}/${t}/${n}`;
|
|
706
|
+
this.entries.delete(o), this.entries.set(o, s);
|
|
707
707
|
}
|
|
708
708
|
/**
|
|
709
709
|
* If the cache is over its soft cap, drop least-recently-used entries down to
|
|
@@ -721,7 +721,7 @@ class re {
|
|
|
721
721
|
this.entries.delete(s);
|
|
722
722
|
}
|
|
723
723
|
}
|
|
724
|
-
const
|
|
724
|
+
const J = 512, Ue = [
|
|
725
725
|
[0.5, 0.5],
|
|
726
726
|
// center
|
|
727
727
|
[0, 0],
|
|
@@ -732,7 +732,7 @@ const G = 512, Ne = [
|
|
|
732
732
|
// top-right
|
|
733
733
|
[1, 1]
|
|
734
734
|
// bottom-right
|
|
735
|
-
],
|
|
735
|
+
], Ze = Ue.concat([
|
|
736
736
|
[0, 0.5],
|
|
737
737
|
// left edge
|
|
738
738
|
[0.5, 0],
|
|
@@ -741,8 +741,8 @@ const G = 512, Ne = [
|
|
|
741
741
|
// right edge
|
|
742
742
|
[0.5, 1]
|
|
743
743
|
// bottom edge
|
|
744
|
-
]),
|
|
745
|
-
class
|
|
744
|
+
]), E = 6378137, S = 2 * Math.PI * E, K = S / 2, Q = 85.05112877980659;
|
|
745
|
+
class z {
|
|
746
746
|
/** Index across a row */
|
|
747
747
|
x;
|
|
748
748
|
/** Index down a column */
|
|
@@ -785,10 +785,10 @@ class R {
|
|
|
785
785
|
const e = this.descriptor.levels.length - 1;
|
|
786
786
|
if (this.z >= e)
|
|
787
787
|
return this._children = null, null;
|
|
788
|
-
const t = this.z + 1, n = this.descriptor.levels[t], s = this.level.projectedTileCorners(this.x, this.y),
|
|
788
|
+
const t = this.z + 1, n = this.descriptor.levels[t], s = this.level.projectedTileCorners(this.x, this.y), o = _e(s), { minCol: i, maxCol: a, minRow: c, maxRow: u } = n.crsBoundsToTileRange(...o), l = [], { descriptor: h } = this;
|
|
789
789
|
for (let f = c; f <= u; f++)
|
|
790
|
-
for (let
|
|
791
|
-
l.push(new
|
|
790
|
+
for (let d = i; d <= a; d++)
|
|
791
|
+
l.push(new z(d, f, t, { descriptor: h }));
|
|
792
792
|
this._children = l.length > 0 ? l : null;
|
|
793
793
|
}
|
|
794
794
|
return this._children;
|
|
@@ -813,21 +813,21 @@ class R {
|
|
|
813
813
|
*/
|
|
814
814
|
update(e) {
|
|
815
815
|
this.childVisible = !1, this.selected = !1;
|
|
816
|
-
const { viewport: t, cullingVolume: n, elevationBounds: s, minZ:
|
|
817
|
-
if (c && !this.insideBounds(c, f) || n.computeVisibility(
|
|
816
|
+
const { viewport: t, cullingVolume: n, elevationBounds: s, minZ: o, maxZ: i = this.descriptor.levels.length - 1, project: a, bounds: c, pixelRatio: u, boundingVolumeCache: l } = e, { boundingVolume: h, commonSpaceBounds: f } = this.getBoundingVolume(s, a, l);
|
|
817
|
+
if (c && !this.insideBounds(c, f) || n.computeVisibility(h) < 0)
|
|
818
818
|
return !1;
|
|
819
|
-
const
|
|
820
|
-
if (!this.childVisible && this.z >=
|
|
821
|
-
const
|
|
822
|
-
if (this.level.metersPerPixel * u /
|
|
819
|
+
const m = this.children;
|
|
820
|
+
if (!this.childVisible && this.z >= o) {
|
|
821
|
+
const p = Qe(h, t.zoom);
|
|
822
|
+
if (this.level.metersPerPixel * u / p <= 1 || this.z >= i || m === null && this.z >= o)
|
|
823
823
|
return this.selected = !0, !0;
|
|
824
824
|
}
|
|
825
|
-
if (
|
|
825
|
+
if (m && m.length > 0) {
|
|
826
826
|
this.selected = !1;
|
|
827
|
-
let
|
|
828
|
-
for (const g of
|
|
829
|
-
g.update(e) && (
|
|
830
|
-
return this.childVisible =
|
|
827
|
+
let p = !1;
|
|
828
|
+
for (const g of m)
|
|
829
|
+
g.update(e) && (p = !0);
|
|
830
|
+
return this.childVisible = p, p;
|
|
831
831
|
}
|
|
832
832
|
return !0;
|
|
833
833
|
}
|
|
@@ -852,8 +852,8 @@ class R {
|
|
|
852
852
|
* @returns true if tile overlaps the bounds
|
|
853
853
|
*/
|
|
854
854
|
insideBounds(e, t) {
|
|
855
|
-
const [n, s,
|
|
856
|
-
return
|
|
855
|
+
const [n, s, o, i] = e, [a, c, u, l] = t;
|
|
856
|
+
return a < o && u > n && c < i && l > s;
|
|
857
857
|
}
|
|
858
858
|
/**
|
|
859
859
|
* The 3D bounding volume for this tile in deck.gl's common coordinate space,
|
|
@@ -868,8 +868,8 @@ class R {
|
|
|
868
868
|
const s = n.get(this.z, this.x, this.y);
|
|
869
869
|
if (s && s.zRange[0] === e[0] && s.zRange[1] === e[1])
|
|
870
870
|
return s;
|
|
871
|
-
const
|
|
872
|
-
return n.set(this.z, this.x, this.y, { zRange: e, ...
|
|
871
|
+
const o = this.computeBoundingVolume(e, t);
|
|
872
|
+
return n.set(this.z, this.x, this.y, { zRange: e, ...o }), o;
|
|
873
873
|
}
|
|
874
874
|
/**
|
|
875
875
|
* Compute (without caching) the 3D bounding volume for this tile in deck.gl's
|
|
@@ -879,7 +879,7 @@ class R {
|
|
|
879
879
|
* tiling is already in EPSG:3857.
|
|
880
880
|
*/
|
|
881
881
|
computeBoundingVolume(e, t) {
|
|
882
|
-
return t &&
|
|
882
|
+
return t && be(!1, "TODO: implement getBoundingVolume in Globe view"), this._getGenericBoundingVolume(e);
|
|
883
883
|
}
|
|
884
884
|
/**
|
|
885
885
|
* Generic case - sample reference points and reproject to Web Mercator, then
|
|
@@ -887,157 +887,157 @@ class R {
|
|
|
887
887
|
*
|
|
888
888
|
*/
|
|
889
889
|
_getGenericBoundingVolume(e) {
|
|
890
|
-
const [t, n] = e, s = this.level.projectedTileCorners(this.x, this.y),
|
|
891
|
-
for (const
|
|
892
|
-
|
|
893
|
-
let c = Number.POSITIVE_INFINITY, u = Number.POSITIVE_INFINITY, l = Number.NEGATIVE_INFINITY,
|
|
894
|
-
for (const [
|
|
895
|
-
|
|
896
|
-
const f = [c, u, l,
|
|
890
|
+
const [t, n] = e, s = this.level.projectedTileCorners(this.x, this.y), i = qe(Ze, s, this.descriptor.projectTo3857, this.descriptor.projectTo4326).map((d) => Ve(d)), a = [];
|
|
891
|
+
for (const d of i)
|
|
892
|
+
a.push([d[0], d[1], t]), t !== n && a.push([d[0], d[1], n]);
|
|
893
|
+
let c = Number.POSITIVE_INFINITY, u = Number.POSITIVE_INFINITY, l = Number.NEGATIVE_INFINITY, h = Number.NEGATIVE_INFINITY;
|
|
894
|
+
for (const [d, m] of i)
|
|
895
|
+
d < c && (c = d), m < u && (u = m), d > l && (l = d), m > h && (h = m);
|
|
896
|
+
const f = [c, u, l, h];
|
|
897
897
|
return {
|
|
898
|
-
boundingVolume:
|
|
898
|
+
boundingVolume: xe(a),
|
|
899
899
|
commonSpaceBounds: f
|
|
900
900
|
};
|
|
901
901
|
}
|
|
902
902
|
}
|
|
903
|
-
function
|
|
903
|
+
function ke(r, e) {
|
|
904
904
|
return (t, n) => {
|
|
905
|
-
const [s,
|
|
906
|
-
if (Number.isFinite(s) && Number.isFinite(
|
|
907
|
-
return [s,
|
|
908
|
-
const [
|
|
909
|
-
return [l,
|
|
905
|
+
const [s, o] = r(t, n);
|
|
906
|
+
if (Number.isFinite(s) && Number.isFinite(o))
|
|
907
|
+
return [s, o];
|
|
908
|
+
const [i, a] = e(t, n), u = Math.max(-Q, Math.min(Q, a)) * Math.PI / 180, l = i * Math.PI * E / 180, h = Math.log(Math.tan(Math.PI / 4 + u / 2)) * E;
|
|
909
|
+
return [l, h];
|
|
910
910
|
};
|
|
911
911
|
}
|
|
912
|
-
function
|
|
913
|
-
const { topLeft: s, topRight:
|
|
914
|
-
for (const [l,
|
|
915
|
-
const [f,
|
|
916
|
-
u.push(c(f,
|
|
912
|
+
function qe(r, e, t, n) {
|
|
913
|
+
const { topLeft: s, topRight: o, bottomLeft: i, bottomRight: a } = e, c = ke(t, n), u = [];
|
|
914
|
+
for (const [l, h] of r) {
|
|
915
|
+
const [f, d] = $e(s, o, i, a, l, h);
|
|
916
|
+
u.push(c(f, d));
|
|
917
917
|
}
|
|
918
918
|
return u;
|
|
919
919
|
}
|
|
920
|
-
function
|
|
921
|
-
const t = Math.max(-
|
|
920
|
+
function Ve([r, e]) {
|
|
921
|
+
const t = Math.max(-K, Math.min(K, e));
|
|
922
922
|
return [
|
|
923
|
-
(
|
|
924
|
-
(t /
|
|
923
|
+
(r / S + 0.5) * J,
|
|
924
|
+
(t / S + 0.5) * J
|
|
925
925
|
];
|
|
926
926
|
}
|
|
927
|
-
const
|
|
928
|
-
function
|
|
929
|
-
const { descriptor: e, viewport: t, datasetWgs84Bounds: n } =
|
|
930
|
-
if (s.matrixWidth * s.matrixHeight <=
|
|
931
|
-
for (let
|
|
932
|
-
for (let
|
|
933
|
-
|
|
934
|
-
return
|
|
927
|
+
const Ge = 100;
|
|
928
|
+
function Ye(r) {
|
|
929
|
+
const { descriptor: e, viewport: t, datasetWgs84Bounds: n } = r, s = e.levels[0], o = [];
|
|
930
|
+
if (s.matrixWidth * s.matrixHeight <= Ge) {
|
|
931
|
+
for (let m = 0; m < s.matrixHeight; m++)
|
|
932
|
+
for (let p = 0; p < s.matrixWidth; p++)
|
|
933
|
+
o.push(new z(p, m, 0, { descriptor: e }));
|
|
934
|
+
return o;
|
|
935
935
|
}
|
|
936
|
-
const
|
|
937
|
-
Math.max(n[0],
|
|
938
|
-
Math.max(n[1],
|
|
939
|
-
Math.min(n[2],
|
|
940
|
-
Math.min(n[3],
|
|
936
|
+
const a = t.getBounds(), c = [
|
|
937
|
+
Math.max(n[0], a[0]),
|
|
938
|
+
Math.max(n[1], a[1]),
|
|
939
|
+
Math.min(n[2], a[2]),
|
|
940
|
+
Math.min(n[3], a[3])
|
|
941
941
|
];
|
|
942
942
|
if (c[0] > c[2] || c[1] > c[3])
|
|
943
|
-
return
|
|
944
|
-
const [u, l,
|
|
945
|
-
for (let
|
|
946
|
-
for (let
|
|
947
|
-
|
|
948
|
-
return
|
|
943
|
+
return o;
|
|
944
|
+
const [u, l, h, f] = X(e.projectFrom4326, c[0], c[1], c[2], c[3]), d = s.crsBoundsToTileRange(u, l, h, f);
|
|
945
|
+
for (let m = d.minRow; m <= d.maxRow; m++)
|
|
946
|
+
for (let p = d.minCol; p <= d.maxCol; p++)
|
|
947
|
+
o.push(new z(p, m, 0, { descriptor: e }));
|
|
948
|
+
return o;
|
|
949
949
|
}
|
|
950
|
-
function
|
|
951
|
-
const { viewport: t, maxZ: n, zRange: s, wgs84Bounds:
|
|
952
|
-
|
|
953
|
-
const c = t instanceof
|
|
950
|
+
function Je(r, e) {
|
|
951
|
+
const { viewport: t, maxZ: n, zRange: s, wgs84Bounds: o, pixelRatio: i = 1 } = e, a = e.boundingVolumeCache ?? new ce();
|
|
952
|
+
a.sweep();
|
|
953
|
+
const c = t instanceof pe && t.resolution ? t.projectPosition : null, u = Object.values(t.getFrustumPlanes()).map(({ normal: O, distance: B }) => new ge(O.clone().negate(), B)), l = new ve(u), h = t.distanceScales.unitsPerMeter[2], f = s && s[0] * h || 0, d = s && s[1] * h || 0, m = 0, [p, g, P, b] = o, x = Z([p, g]), v = Z([P, b]), y = [
|
|
954
954
|
x[0],
|
|
955
955
|
x[1],
|
|
956
956
|
v[0],
|
|
957
957
|
v[1]
|
|
958
|
-
],
|
|
959
|
-
descriptor:
|
|
958
|
+
], w = Ye({
|
|
959
|
+
descriptor: r,
|
|
960
960
|
viewport: t,
|
|
961
|
-
datasetWgs84Bounds:
|
|
962
|
-
}),
|
|
961
|
+
datasetWgs84Bounds: o
|
|
962
|
+
}), M = {
|
|
963
963
|
viewport: t,
|
|
964
964
|
project: c,
|
|
965
965
|
cullingVolume: l,
|
|
966
|
-
elevationBounds: [f,
|
|
967
|
-
minZ:
|
|
966
|
+
elevationBounds: [f, d],
|
|
967
|
+
minZ: m,
|
|
968
968
|
maxZ: n,
|
|
969
|
-
bounds:
|
|
970
|
-
pixelRatio:
|
|
971
|
-
boundingVolumeCache:
|
|
969
|
+
bounds: y,
|
|
970
|
+
pixelRatio: i,
|
|
971
|
+
boundingVolumeCache: a
|
|
972
972
|
};
|
|
973
|
-
for (const O of
|
|
974
|
-
O.update(
|
|
975
|
-
const
|
|
976
|
-
for (const O of
|
|
977
|
-
O.getSelected(
|
|
978
|
-
return
|
|
973
|
+
for (const O of w)
|
|
974
|
+
O.update(M);
|
|
975
|
+
const j = [];
|
|
976
|
+
for (const O of w)
|
|
977
|
+
O.getSelected(j);
|
|
978
|
+
return j;
|
|
979
979
|
}
|
|
980
|
-
function
|
|
981
|
-
return 40075016686e-3 * Math.cos(
|
|
980
|
+
function Ke(r, e) {
|
|
981
|
+
return 40075016686e-3 * Math.cos(r * Math.PI / 180) / 2 ** (e + 8);
|
|
982
982
|
}
|
|
983
|
-
function
|
|
984
|
-
const [t, n] =
|
|
985
|
-
return
|
|
983
|
+
function Qe(r, e) {
|
|
984
|
+
const [t, n] = Pe(r.center);
|
|
985
|
+
return Ke(n, e);
|
|
986
986
|
}
|
|
987
|
-
function
|
|
988
|
-
const s = [
|
|
989
|
-
return [Math.min(...s), Math.min(...
|
|
987
|
+
function _e({ topLeft: r, topRight: e, bottomLeft: t, bottomRight: n }) {
|
|
988
|
+
const s = [r[0], e[0], t[0], n[0]], o = [r[1], e[1], t[1], n[1]];
|
|
989
|
+
return [Math.min(...s), Math.min(...o), Math.max(...s), Math.max(...o)];
|
|
990
990
|
}
|
|
991
|
-
function
|
|
992
|
-
const
|
|
991
|
+
function $e(r, e, t, n, s, o) {
|
|
992
|
+
const i = (1 - s) * (1 - o), a = s * (1 - o), c = (1 - s) * o, u = s * o;
|
|
993
993
|
return [
|
|
994
|
-
|
|
995
|
-
|
|
994
|
+
r[0] * i + e[0] * a + t[0] * c + n[0] * u,
|
|
995
|
+
r[1] * i + e[1] * a + t[1] * c + n[1] * u
|
|
996
996
|
];
|
|
997
997
|
}
|
|
998
|
-
function
|
|
999
|
-
const t =
|
|
998
|
+
function et(r, e) {
|
|
999
|
+
const t = r.length;
|
|
1000
1000
|
if (t < 2)
|
|
1001
|
-
return
|
|
1002
|
-
const { getCenter: n, reference: s } = e,
|
|
1001
|
+
return r;
|
|
1002
|
+
const { getCenter: n, reference: s } = e, o = s[0], i = s[1], a = new Float64Array(t);
|
|
1003
1003
|
for (let l = 0; l < t; l++) {
|
|
1004
|
-
const
|
|
1005
|
-
|
|
1004
|
+
const h = n(r[l]), f = h[0] - o, d = h[1] - i;
|
|
1005
|
+
a[l] = f * f + d * d;
|
|
1006
1006
|
}
|
|
1007
1007
|
const c = new Uint32Array(t);
|
|
1008
1008
|
for (let l = 0; l < t; l++)
|
|
1009
1009
|
c[l] = l;
|
|
1010
|
-
c.sort((l,
|
|
1011
|
-
const u =
|
|
1010
|
+
c.sort((l, h) => a[l] - a[h]);
|
|
1011
|
+
const u = r.slice();
|
|
1012
1012
|
for (let l = 0; l < t; l++)
|
|
1013
|
-
|
|
1014
|
-
return
|
|
1013
|
+
r[l] = u[c[l]];
|
|
1014
|
+
return r;
|
|
1015
1015
|
}
|
|
1016
|
-
function
|
|
1017
|
-
const [n, s,
|
|
1018
|
-
(n +
|
|
1019
|
-
(s +
|
|
1016
|
+
function tt(r, e, t) {
|
|
1017
|
+
const [n, s, o, i] = e.getBounds(), a = [
|
|
1018
|
+
(n + o) / 2,
|
|
1019
|
+
(s + i) / 2
|
|
1020
1020
|
];
|
|
1021
|
-
return
|
|
1022
|
-
reference:
|
|
1021
|
+
return et(r, {
|
|
1022
|
+
reference: a,
|
|
1023
1023
|
getCenter: t
|
|
1024
1024
|
});
|
|
1025
1025
|
}
|
|
1026
|
-
class
|
|
1026
|
+
class nt extends ye {
|
|
1027
1027
|
descriptor;
|
|
1028
1028
|
wgs84Bounds;
|
|
1029
1029
|
getPixelRatio;
|
|
1030
1030
|
boundingVolumeCache;
|
|
1031
1031
|
constructor(e, t, { getPixelRatio: n, maxBoundingVolumeCacheSize: s } = {}) {
|
|
1032
|
-
super(e), this.descriptor = t, this.getPixelRatio = n ?? (() => 1), this.boundingVolumeCache = new
|
|
1032
|
+
super(e), this.descriptor = t, this.getPixelRatio = n ?? (() => 1), this.boundingVolumeCache = new ce({
|
|
1033
1033
|
maxEntries: s
|
|
1034
1034
|
});
|
|
1035
|
-
const
|
|
1035
|
+
const o = X(this.descriptor.projectTo4326, ...this.descriptor.projectedBounds), i = 85.0511287798066;
|
|
1036
1036
|
this.wgs84Bounds = [
|
|
1037
|
-
|
|
1038
|
-
Math.max(
|
|
1039
|
-
|
|
1040
|
-
Math.min(
|
|
1037
|
+
o[0],
|
|
1038
|
+
Math.max(o[1], -i),
|
|
1039
|
+
o[2],
|
|
1040
|
+
Math.min(o[3], i)
|
|
1041
1041
|
];
|
|
1042
1042
|
}
|
|
1043
1043
|
/**
|
|
@@ -1061,15 +1061,15 @@ class _e extends ve {
|
|
|
1061
1061
|
const { viewport: t, minZoom: n } = e;
|
|
1062
1062
|
if (typeof n == "number" && t.zoom < n)
|
|
1063
1063
|
return [];
|
|
1064
|
-
const s = this.descriptor.levels.length - 1,
|
|
1064
|
+
const s = this.descriptor.levels.length - 1, o = typeof e.maxZoom == "number" ? Math.min(e.maxZoom, s) : s, i = Je(this.descriptor, {
|
|
1065
1065
|
viewport: t,
|
|
1066
|
-
maxZ:
|
|
1066
|
+
maxZ: o,
|
|
1067
1067
|
zRange: e.zRange ?? null,
|
|
1068
1068
|
wgs84Bounds: this.wgs84Bounds,
|
|
1069
1069
|
pixelRatio: this.getPixelRatio(),
|
|
1070
1070
|
boundingVolumeCache: this.boundingVolumeCache
|
|
1071
1071
|
});
|
|
1072
|
-
return this.sortTileIndicesByDistance(
|
|
1072
|
+
return this.sortTileIndicesByDistance(i, t);
|
|
1073
1073
|
}
|
|
1074
1074
|
/**
|
|
1075
1075
|
* Sort tile indices by ascending distance from the viewport center in
|
|
@@ -1084,12 +1084,12 @@ class _e extends ve {
|
|
|
1084
1084
|
if (e.length <= n)
|
|
1085
1085
|
return e;
|
|
1086
1086
|
const s = this.descriptor;
|
|
1087
|
-
return
|
|
1088
|
-
const { x:
|
|
1087
|
+
return tt(e, t, (o) => {
|
|
1088
|
+
const { x: i, y: a, z: c } = o, { topLeft: u, bottomRight: l } = s.levels[c].projectedTileCorners(i, a), h = [
|
|
1089
1089
|
(u[0] + l[0]) / 2,
|
|
1090
1090
|
(u[1] + l[1]) / 2
|
|
1091
1091
|
];
|
|
1092
|
-
return s.projectTo4326(
|
|
1092
|
+
return s.projectTo4326(h[0], h[1]);
|
|
1093
1093
|
});
|
|
1094
1094
|
}
|
|
1095
1095
|
getTileId(e) {
|
|
@@ -1098,7 +1098,7 @@ class _e extends ve {
|
|
|
1098
1098
|
getParentIndex(e) {
|
|
1099
1099
|
if (e.z === 0)
|
|
1100
1100
|
return e;
|
|
1101
|
-
const t = this.descriptor.levels[e.z], n = this.descriptor.levels[e.z - 1], s = n.metersPerPixel * n.tileWidth,
|
|
1101
|
+
const t = this.descriptor.levels[e.z], n = this.descriptor.levels[e.z - 1], s = n.metersPerPixel * n.tileWidth, o = n.metersPerPixel * n.tileHeight, i = t.metersPerPixel * t.tileWidth, a = t.metersPerPixel * t.tileHeight, c = s / i, u = o / a;
|
|
1102
1102
|
return {
|
|
1103
1103
|
x: Math.floor(e.x / c),
|
|
1104
1104
|
y: Math.floor(e.y / u),
|
|
@@ -1109,47 +1109,47 @@ class _e extends ve {
|
|
|
1109
1109
|
return e.z;
|
|
1110
1110
|
}
|
|
1111
1111
|
getTileMetadata(e) {
|
|
1112
|
-
const { x: t, y: n, z: s } = e,
|
|
1112
|
+
const { x: t, y: n, z: s } = e, o = this.descriptor.levels[s], { tileHeight: i, tileWidth: a } = o, { topLeft: c, topRight: u, bottomLeft: l, bottomRight: h } = o.projectedTileCorners(t, n), f = {
|
|
1113
1113
|
topLeft: c,
|
|
1114
1114
|
topRight: u,
|
|
1115
1115
|
bottomLeft: l,
|
|
1116
|
-
bottomRight:
|
|
1117
|
-
},
|
|
1118
|
-
Math.min(c[0], u[0], l[0],
|
|
1119
|
-
Math.min(c[1], u[1], l[1],
|
|
1120
|
-
Math.max(c[0], u[0], l[0],
|
|
1121
|
-
Math.max(c[1], u[1], l[1],
|
|
1122
|
-
], [
|
|
1116
|
+
bottomRight: h
|
|
1117
|
+
}, d = [
|
|
1118
|
+
Math.min(c[0], u[0], l[0], h[0]),
|
|
1119
|
+
Math.min(c[1], u[1], l[1], h[1]),
|
|
1120
|
+
Math.max(c[0], u[0], l[0], h[0]),
|
|
1121
|
+
Math.max(c[1], u[1], l[1], h[1])
|
|
1122
|
+
], [m, p, g, P] = X(this.descriptor.projectTo4326, ...d), { forwardTransform: b, inverseTransform: x } = o.tileTransform(t, n);
|
|
1123
1123
|
return {
|
|
1124
1124
|
bbox: {
|
|
1125
|
-
west:
|
|
1126
|
-
south:
|
|
1125
|
+
west: m,
|
|
1126
|
+
south: p,
|
|
1127
1127
|
east: g,
|
|
1128
|
-
north:
|
|
1128
|
+
north: P
|
|
1129
1129
|
},
|
|
1130
1130
|
projectedBbox: {
|
|
1131
|
-
left:
|
|
1132
|
-
bottom:
|
|
1133
|
-
right:
|
|
1134
|
-
top:
|
|
1131
|
+
left: d[0],
|
|
1132
|
+
bottom: d[1],
|
|
1133
|
+
right: d[2],
|
|
1134
|
+
top: d[3]
|
|
1135
1135
|
},
|
|
1136
1136
|
projectedCorners: f,
|
|
1137
|
-
tileWidth:
|
|
1138
|
-
tileHeight:
|
|
1139
|
-
forwardTransform:
|
|
1137
|
+
tileWidth: a,
|
|
1138
|
+
tileHeight: i,
|
|
1139
|
+
forwardTransform: b,
|
|
1140
1140
|
inverseTransform: x
|
|
1141
1141
|
};
|
|
1142
1142
|
}
|
|
1143
1143
|
}
|
|
1144
|
-
const
|
|
1145
|
-
...
|
|
1144
|
+
const N = 512, rt = 40075016686e-3, _ = N / rt, st = {
|
|
1145
|
+
...ie.defaultProps,
|
|
1146
1146
|
maxError: 0.125,
|
|
1147
1147
|
debug: !1,
|
|
1148
1148
|
debugOpacity: 0.5
|
|
1149
1149
|
};
|
|
1150
|
-
class
|
|
1150
|
+
class Dt extends oe {
|
|
1151
1151
|
static layerName = "RasterTileLayer";
|
|
1152
|
-
static defaultProps =
|
|
1152
|
+
static defaultProps = st;
|
|
1153
1153
|
/**
|
|
1154
1154
|
* The currently effective {@link RasterTilesetDescriptor}.
|
|
1155
1155
|
*
|
|
@@ -1202,7 +1202,7 @@ class xt extends te {
|
|
|
1202
1202
|
*/
|
|
1203
1203
|
_renderDebug(e, t) {
|
|
1204
1204
|
const n = this._tilesetDescriptor();
|
|
1205
|
-
return n ?
|
|
1205
|
+
return n ? Te(`${this.id}-${e.id}-bounds`, e, n.projectTo4326) : [];
|
|
1206
1206
|
}
|
|
1207
1207
|
renderLayers() {
|
|
1208
1208
|
const e = this._tilesetDescriptor(), t = this._getTileDataCallback(), n = this._renderTileCallback();
|
|
@@ -1210,56 +1210,56 @@ class xt extends te {
|
|
|
1210
1210
|
}
|
|
1211
1211
|
_renderTileLayer(e, t, n) {
|
|
1212
1212
|
const s = this.context.device;
|
|
1213
|
-
class
|
|
1214
|
-
constructor(
|
|
1215
|
-
super(
|
|
1213
|
+
class o extends nt {
|
|
1214
|
+
constructor(w) {
|
|
1215
|
+
super(w, e, {
|
|
1216
1216
|
getPixelRatio: () => {
|
|
1217
|
-
const
|
|
1218
|
-
return O ?
|
|
1217
|
+
const M = s.getDefaultCanvasContext(), [j] = M.getDrawingBufferSize(), [O] = M.getCSSSize();
|
|
1218
|
+
return O ? j / O : 1;
|
|
1219
1219
|
}
|
|
1220
1220
|
});
|
|
1221
1221
|
}
|
|
1222
1222
|
}
|
|
1223
|
-
const { tileSize:
|
|
1224
|
-
return new
|
|
1223
|
+
const { tileSize: i, zoomOffset: a, maxZoom: c, minZoom: u, extent: l, debounceTime: h, maxCacheSize: f, maxCacheByteSize: d, maxRequests: m, refinementStrategy: p, updateTriggers: g, onTileError: P, onTileLoad: b, onTileUnload: x, onViewportLoad: v } = this.props;
|
|
1224
|
+
return new ie({
|
|
1225
1225
|
id: `raster-tile-layer-${this.id}`,
|
|
1226
|
-
TilesetClass:
|
|
1227
|
-
getTileData: (
|
|
1228
|
-
renderSubLayers: (
|
|
1226
|
+
TilesetClass: o,
|
|
1227
|
+
getTileData: (y) => this._wrapGetTileData(y, t),
|
|
1228
|
+
renderSubLayers: (y) => this._renderSubLayers(y, e, n),
|
|
1229
1229
|
updateTriggers: {
|
|
1230
1230
|
renderSubLayers: g?.renderTile
|
|
1231
1231
|
},
|
|
1232
|
-
tileSize:
|
|
1233
|
-
zoomOffset:
|
|
1232
|
+
tileSize: i,
|
|
1233
|
+
zoomOffset: a,
|
|
1234
1234
|
maxZoom: c,
|
|
1235
1235
|
minZoom: u,
|
|
1236
1236
|
extent: l,
|
|
1237
|
-
debounceTime:
|
|
1237
|
+
debounceTime: h,
|
|
1238
1238
|
maxCacheSize: f,
|
|
1239
|
-
maxCacheByteSize:
|
|
1240
|
-
maxRequests:
|
|
1241
|
-
refinementStrategy:
|
|
1242
|
-
onTileError:
|
|
1243
|
-
onTileLoad:
|
|
1239
|
+
maxCacheByteSize: d,
|
|
1240
|
+
maxRequests: m,
|
|
1241
|
+
refinementStrategy: p,
|
|
1242
|
+
onTileError: P,
|
|
1243
|
+
onTileLoad: b,
|
|
1244
1244
|
onTileUnload: x,
|
|
1245
1245
|
onViewportLoad: v
|
|
1246
1246
|
});
|
|
1247
1247
|
}
|
|
1248
1248
|
async _wrapGetTileData(e, t) {
|
|
1249
|
-
const { signal: n } = e, s = this.props.signal,
|
|
1249
|
+
const { signal: n } = e, s = this.props.signal, o = s && n ? AbortSignal.any([s, n]) : s ?? n, i = {
|
|
1250
1250
|
device: this.context.device,
|
|
1251
|
-
signal:
|
|
1251
|
+
signal: o
|
|
1252
1252
|
};
|
|
1253
|
-
return t(e,
|
|
1253
|
+
return t(e, i);
|
|
1254
1254
|
}
|
|
1255
1255
|
_renderSubLayers(e, t, n) {
|
|
1256
|
-
const { maxError: s, debug:
|
|
1256
|
+
const { maxError: s, debug: o, debugOpacity: i } = this.props, a = e.tile, c = o ? this._renderDebug(a, e.data ?? null) : [];
|
|
1257
1257
|
if (!e.data)
|
|
1258
1258
|
return c;
|
|
1259
|
-
const { forwardTransform: u, inverseTransform: l } =
|
|
1260
|
-
if (!
|
|
1259
|
+
const { forwardTransform: u, inverseTransform: l } = a, h = n(e.data);
|
|
1260
|
+
if (!h)
|
|
1261
1261
|
return c;
|
|
1262
|
-
const { image: f, renderPipeline:
|
|
1262
|
+
const { image: f, renderPipeline: d } = h, { width: m, height: p } = e.data, g = this.context.viewport.resolution !== void 0, P = g ? {
|
|
1263
1263
|
forwardTransform: u,
|
|
1264
1264
|
inverseTransform: l,
|
|
1265
1265
|
forwardReproject: t.projectTo4326,
|
|
@@ -1269,17 +1269,17 @@ class xt extends te {
|
|
|
1269
1269
|
inverseTransform: l,
|
|
1270
1270
|
forwardReproject: t.projectTo3857,
|
|
1271
1271
|
inverseReproject: t.projectFrom3857
|
|
1272
|
-
},
|
|
1272
|
+
}, b = g ? {} : {
|
|
1273
1273
|
coordinateSystem: "cartesian",
|
|
1274
|
-
coordinateOrigin: [
|
|
1274
|
+
coordinateOrigin: [N / 2, N / 2, 0],
|
|
1275
1275
|
// biome-ignore format: array
|
|
1276
1276
|
modelMatrix: [
|
|
1277
|
-
|
|
1277
|
+
_,
|
|
1278
1278
|
0,
|
|
1279
1279
|
0,
|
|
1280
1280
|
0,
|
|
1281
1281
|
0,
|
|
1282
|
-
|
|
1282
|
+
_,
|
|
1283
1283
|
0,
|
|
1284
1284
|
0,
|
|
1285
1285
|
0,
|
|
@@ -1292,23 +1292,23 @@ class xt extends te {
|
|
|
1292
1292
|
1
|
|
1293
1293
|
]
|
|
1294
1294
|
};
|
|
1295
|
-
return [new
|
|
1295
|
+
return [new Be(this.getSubLayerProps({
|
|
1296
1296
|
id: `${e.id}-raster`,
|
|
1297
|
-
width:
|
|
1298
|
-
height:
|
|
1297
|
+
width: m,
|
|
1298
|
+
height: p,
|
|
1299
1299
|
// Passing `image: undefined` explicitly would trip isAsyncPropLoading
|
|
1300
1300
|
// and cause a transient black flash (see issue #376).
|
|
1301
1301
|
...f !== void 0 && { image: f },
|
|
1302
|
-
renderPipeline:
|
|
1302
|
+
renderPipeline: d,
|
|
1303
1303
|
maxError: s,
|
|
1304
|
-
reprojectionFns:
|
|
1305
|
-
debug:
|
|
1306
|
-
debugOpacity:
|
|
1307
|
-
...
|
|
1304
|
+
reprojectionFns: P,
|
|
1305
|
+
debug: o,
|
|
1306
|
+
debugOpacity: i,
|
|
1307
|
+
...b
|
|
1308
1308
|
})), ...c];
|
|
1309
1309
|
}
|
|
1310
1310
|
}
|
|
1311
|
-
const C = "colormap",
|
|
1311
|
+
const C = "colormap", ot = {
|
|
1312
1312
|
name: C,
|
|
1313
1313
|
fs: `uniform ${C}Uniforms {
|
|
1314
1314
|
int colormapIndex;
|
|
@@ -1334,12 +1334,12 @@ uniform sampler2DArray colormapTexture;
|
|
|
1334
1334
|
colormapIndex: "i32",
|
|
1335
1335
|
reversed: "f32"
|
|
1336
1336
|
},
|
|
1337
|
-
getUniforms: (
|
|
1338
|
-
colormapTexture:
|
|
1339
|
-
colormapIndex:
|
|
1340
|
-
reversed:
|
|
1337
|
+
getUniforms: (r) => ({
|
|
1338
|
+
colormapTexture: r.colormapTexture,
|
|
1339
|
+
colormapIndex: r.colormapIndex ?? 0,
|
|
1340
|
+
reversed: r.reversed ?? !1
|
|
1341
1341
|
})
|
|
1342
|
-
},
|
|
1342
|
+
}, I = {
|
|
1343
1343
|
accent: 0,
|
|
1344
1344
|
afmhot: 1,
|
|
1345
1345
|
algae: 2,
|
|
@@ -1447,12 +1447,77 @@ uniform sampler2DArray colormapTexture;
|
|
|
1447
1447
|
ylgnbu: 104,
|
|
1448
1448
|
ylorbr: 105,
|
|
1449
1449
|
ylorrd: 106
|
|
1450
|
+
}, T = "compositeBands", it = {
|
|
1451
|
+
name: T,
|
|
1452
|
+
// Texture samplers — declared via inject, bound via getUniforms
|
|
1453
|
+
inject: {
|
|
1454
|
+
"fs:#decl": (
|
|
1455
|
+
/* glsl */
|
|
1456
|
+
`
|
|
1457
|
+
uniform sampler2D band0;
|
|
1458
|
+
uniform sampler2D band1;
|
|
1459
|
+
uniform sampler2D band2;
|
|
1460
|
+
uniform sampler2D band3;
|
|
1461
|
+
|
|
1462
|
+
vec2 compositeBands_applyUv(vec2 uv, vec4 transform) {
|
|
1463
|
+
return uv * transform.zw + transform.xy;
|
|
1464
|
+
}
|
|
1465
|
+
|
|
1466
|
+
float compositeBands_sampleSlot(int slot, vec2 uv) {
|
|
1467
|
+
if (slot == 0) return texture(band0, compositeBands_applyUv(uv, ${T}.uvTransform0)).r;
|
|
1468
|
+
if (slot == 1) return texture(band1, compositeBands_applyUv(uv, ${T}.uvTransform1)).r;
|
|
1469
|
+
if (slot == 2) return texture(band2, compositeBands_applyUv(uv, ${T}.uvTransform2)).r;
|
|
1470
|
+
if (slot == 3) return texture(band3, compositeBands_applyUv(uv, ${T}.uvTransform3)).r;
|
|
1471
|
+
return 0.0;
|
|
1472
|
+
}
|
|
1473
|
+
`
|
|
1474
|
+
),
|
|
1475
|
+
"fs:DECKGL_FILTER_COLOR": (
|
|
1476
|
+
/* glsl */
|
|
1477
|
+
`
|
|
1478
|
+
float r = ${T}.channelMap.r >= 0 ? compositeBands_sampleSlot(${T}.channelMap.r, geometry.uv) : 0.0;
|
|
1479
|
+
float g = ${T}.channelMap.g >= 0 ? compositeBands_sampleSlot(${T}.channelMap.g, geometry.uv) : 0.0;
|
|
1480
|
+
float b = ${T}.channelMap.b >= 0 ? compositeBands_sampleSlot(${T}.channelMap.b, geometry.uv) : 0.0;
|
|
1481
|
+
float a = ${T}.channelMap.a >= 0 ? compositeBands_sampleSlot(${T}.channelMap.a, geometry.uv) : 1.0;
|
|
1482
|
+
color = vec4(r, g, b, a);
|
|
1483
|
+
`
|
|
1484
|
+
)
|
|
1485
|
+
},
|
|
1486
|
+
// Scalar uniforms — declared via fs uniform block + uniformTypes
|
|
1487
|
+
fs: `uniform ${T}Uniforms {
|
|
1488
|
+
vec4 uvTransform0;
|
|
1489
|
+
vec4 uvTransform1;
|
|
1490
|
+
vec4 uvTransform2;
|
|
1491
|
+
vec4 uvTransform3;
|
|
1492
|
+
ivec4 channelMap;
|
|
1493
|
+
} ${T};
|
|
1494
|
+
`,
|
|
1495
|
+
uniformTypes: {
|
|
1496
|
+
uvTransform0: "vec4<f32>",
|
|
1497
|
+
uvTransform1: "vec4<f32>",
|
|
1498
|
+
uvTransform2: "vec4<f32>",
|
|
1499
|
+
uvTransform3: "vec4<f32>",
|
|
1500
|
+
channelMap: "vec4<i32>"
|
|
1501
|
+
},
|
|
1502
|
+
getUniforms: (r) => ({
|
|
1503
|
+
// Texture bindings
|
|
1504
|
+
band0: r.band0,
|
|
1505
|
+
band1: r.band1,
|
|
1506
|
+
band2: r.band2,
|
|
1507
|
+
band3: r.band3,
|
|
1508
|
+
// Scalar uniforms (uniform block)
|
|
1509
|
+
uvTransform0: r.uvTransform0 ?? [0, 0, 1, 1],
|
|
1510
|
+
uvTransform1: r.uvTransform1 ?? [0, 0, 1, 1],
|
|
1511
|
+
uvTransform2: r.uvTransform2 ?? [0, 0, 1, 1],
|
|
1512
|
+
uvTransform3: r.uvTransform3 ?? [0, 0, 1, 1],
|
|
1513
|
+
channelMap: r.channelMap ?? [0, 1, 2, -1]
|
|
1514
|
+
})
|
|
1450
1515
|
};
|
|
1451
|
-
function
|
|
1516
|
+
function at(r, e) {
|
|
1452
1517
|
if (e.width !== 256)
|
|
1453
1518
|
throw new Error(`Expected a 256-pixel-wide colormap sprite, got width ${e.width}.`);
|
|
1454
1519
|
const t = new Uint8Array(e.data.buffer, e.data.byteOffset, e.data.byteLength);
|
|
1455
|
-
return
|
|
1520
|
+
return r.createTexture({
|
|
1456
1521
|
dimension: "2d-array",
|
|
1457
1522
|
format: "rgba8unorm",
|
|
1458
1523
|
width: 256,
|
|
@@ -1471,32 +1536,32 @@ function nt(o, e) {
|
|
|
1471
1536
|
}
|
|
1472
1537
|
});
|
|
1473
1538
|
}
|
|
1474
|
-
async function
|
|
1475
|
-
const e = await
|
|
1539
|
+
async function ct(r) {
|
|
1540
|
+
const e = await lt(r);
|
|
1476
1541
|
try {
|
|
1477
|
-
return
|
|
1542
|
+
return ut(e);
|
|
1478
1543
|
} finally {
|
|
1479
1544
|
e.close();
|
|
1480
1545
|
}
|
|
1481
1546
|
}
|
|
1482
|
-
async function
|
|
1483
|
-
if (
|
|
1484
|
-
return
|
|
1485
|
-
const e = new Blob([
|
|
1547
|
+
async function lt(r) {
|
|
1548
|
+
if (r instanceof ImageBitmap)
|
|
1549
|
+
return r;
|
|
1550
|
+
const e = new Blob([r]);
|
|
1486
1551
|
return createImageBitmap(e);
|
|
1487
1552
|
}
|
|
1488
|
-
function
|
|
1489
|
-
const t = new OffscreenCanvas(
|
|
1553
|
+
function ut(r) {
|
|
1554
|
+
const t = new OffscreenCanvas(r.width, r.height).getContext("2d");
|
|
1490
1555
|
if (!t)
|
|
1491
1556
|
throw new Error("Failed to obtain 2D context for decoding the colormap sprite.");
|
|
1492
|
-
return t.drawImage(
|
|
1557
|
+
return t.drawImage(r, 0, 0), t.getImageData(0, 0, r.width, r.height);
|
|
1493
1558
|
}
|
|
1494
|
-
const
|
|
1559
|
+
const F = "nodata", dt = `uniform ${F}Uniforms {
|
|
1495
1560
|
float value;
|
|
1496
|
-
} ${
|
|
1497
|
-
`,
|
|
1498
|
-
name:
|
|
1499
|
-
fs:
|
|
1561
|
+
} ${F};
|
|
1562
|
+
`, ht = {
|
|
1563
|
+
name: F,
|
|
1564
|
+
fs: dt,
|
|
1500
1565
|
inject: {
|
|
1501
1566
|
"fs:DECKGL_FILTER_COLOR": (
|
|
1502
1567
|
/* glsl */
|
|
@@ -1510,21 +1575,21 @@ const N = "nodata", it = `uniform ${N}Uniforms {
|
|
|
1510
1575
|
uniformTypes: {
|
|
1511
1576
|
value: "f32"
|
|
1512
1577
|
},
|
|
1513
|
-
getUniforms: (
|
|
1514
|
-
value:
|
|
1578
|
+
getUniforms: (r) => ({
|
|
1579
|
+
value: r.value
|
|
1515
1580
|
})
|
|
1516
|
-
},
|
|
1517
|
-
name:
|
|
1518
|
-
fs: `uniform ${
|
|
1581
|
+
}, A = "linearRescale", ft = {
|
|
1582
|
+
name: A,
|
|
1583
|
+
fs: `uniform ${A}Uniforms {
|
|
1519
1584
|
float rescaleMin;
|
|
1520
1585
|
float rescaleMax;
|
|
1521
|
-
} ${
|
|
1586
|
+
} ${A};
|
|
1522
1587
|
`,
|
|
1523
1588
|
inject: {
|
|
1524
1589
|
"fs:DECKGL_FILTER_COLOR": (
|
|
1525
1590
|
/* glsl */
|
|
1526
1591
|
`
|
|
1527
|
-
color.rgb = clamp((color.rgb - ${
|
|
1592
|
+
color.rgb = clamp((color.rgb - ${A}.rescaleMin) / (${A}.rescaleMax - ${A}.rescaleMin), 0.0, 1.0);
|
|
1528
1593
|
`
|
|
1529
1594
|
)
|
|
1530
1595
|
},
|
|
@@ -1532,54 +1597,201 @@ const N = "nodata", it = `uniform ${N}Uniforms {
|
|
|
1532
1597
|
rescaleMin: "f32",
|
|
1533
1598
|
rescaleMax: "f32"
|
|
1534
1599
|
},
|
|
1535
|
-
getUniforms: (
|
|
1536
|
-
rescaleMin:
|
|
1537
|
-
rescaleMax:
|
|
1600
|
+
getUniforms: (r) => ({
|
|
1601
|
+
rescaleMin: r.rescaleMin ?? 0,
|
|
1602
|
+
rescaleMax: r.rescaleMax ?? 1
|
|
1538
1603
|
})
|
|
1539
|
-
}, lt = "data:image/png;base64,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", _ = /* @__PURE__ */ new WeakMap();
|
|
1540
|
-
function
|
|
1541
|
-
const e =
|
|
1604
|
+
}, mt = "data:image/png;base64,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", $ = /* @__PURE__ */ new WeakMap();
|
|
1605
|
+
function It(r) {
|
|
1606
|
+
const e = $.get(r);
|
|
1542
1607
|
if (e) return e;
|
|
1543
1608
|
const t = (async () => {
|
|
1544
|
-
const n = await (await fetch(
|
|
1545
|
-
return
|
|
1609
|
+
const n = await (await fetch(mt)).arrayBuffer();
|
|
1610
|
+
return at(r, await ct(n));
|
|
1546
1611
|
})();
|
|
1547
|
-
return
|
|
1612
|
+
return $.set(r, t), t;
|
|
1613
|
+
}
|
|
1614
|
+
const ee = /* @__PURE__ */ new Set();
|
|
1615
|
+
function pt(r) {
|
|
1616
|
+
return r in I ? I[r] : (ee.has(r) || (ee.add(r), console.warn(`[onlymapjs] raster: unknown colormap "${r}" — falling back to gray.`)), I.gray);
|
|
1617
|
+
}
|
|
1618
|
+
const te = /* @__PURE__ */ new Set();
|
|
1619
|
+
function gt(r, e) {
|
|
1620
|
+
const t = e >= 3 ? [0, 1, 2] : [0];
|
|
1621
|
+
if (r == null) return t;
|
|
1622
|
+
const n = typeof r == "number" ? [r] : r;
|
|
1623
|
+
if (!(Array.isArray(n) && (n.length === 1 || n.length === 3) && n.every((o) => Number.isInteger(o) && o >= 1 && o <= e))) {
|
|
1624
|
+
const o = JSON.stringify(r);
|
|
1625
|
+
return te.has(o) || (te.add(o), console.warn(`[onlymapjs] raster: bands=${o} is not a 1-based band or [r,g,b] triple within this source's ${e} band(s) — using the default.`)), t;
|
|
1626
|
+
}
|
|
1627
|
+
return n.map((o) => o - 1);
|
|
1628
|
+
}
|
|
1629
|
+
function Xt(r, e, t, n) {
|
|
1630
|
+
const s = t * r.width + e, o = [];
|
|
1631
|
+
if (r.layout === "band-separate")
|
|
1632
|
+
for (let i = 0; i < n; i++) o.push(Number(r.bands[i][s]));
|
|
1633
|
+
else {
|
|
1634
|
+
const { data: i, count: a } = r;
|
|
1635
|
+
for (let c = 0; c < n; c++) o.push(Number(i[s * a + c]));
|
|
1636
|
+
}
|
|
1637
|
+
return o;
|
|
1638
|
+
}
|
|
1639
|
+
function vt(r, e) {
|
|
1640
|
+
if (r.layout === "band-separate") {
|
|
1641
|
+
const i = r.bands[e];
|
|
1642
|
+
return i instanceof Float32Array ? i : Float32Array.from(i);
|
|
1643
|
+
}
|
|
1644
|
+
const { data: t, count: n } = r, s = r.width * r.height, o = new Float32Array(s);
|
|
1645
|
+
for (let i = 0; i < s; i++) o[i] = t[i * n + e];
|
|
1646
|
+
return o;
|
|
1548
1647
|
}
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1648
|
+
function bt(r, e) {
|
|
1649
|
+
const t = new Set(e);
|
|
1650
|
+
if (r.array)
|
|
1651
|
+
for (const [s, o] of r.bandTextures)
|
|
1652
|
+
t.has(s) || (o.destroy(), r.bandTextures.delete(s));
|
|
1653
|
+
for (const s of t) {
|
|
1654
|
+
if (r.bandTextures.has(s) || !r.array) continue;
|
|
1655
|
+
const o = vt(r.array, s);
|
|
1656
|
+
r.bandTextures.set(
|
|
1657
|
+
s,
|
|
1658
|
+
r.device.createTexture({
|
|
1659
|
+
data: o,
|
|
1660
|
+
format: "r32float",
|
|
1661
|
+
width: r.width,
|
|
1662
|
+
height: r.height,
|
|
1663
|
+
// NEAREST sampling: OES_texture_float_linear isn't universal.
|
|
1664
|
+
sampler: { minFilter: "nearest", magFilter: "nearest" }
|
|
1665
|
+
})
|
|
1666
|
+
);
|
|
1667
|
+
}
|
|
1668
|
+
const n = r.bandTextures.values().next().value;
|
|
1669
|
+
return e.map((s) => r.bandTextures.get(s) ?? n);
|
|
1552
1670
|
}
|
|
1553
|
-
function
|
|
1554
|
-
const
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1671
|
+
function Et(r) {
|
|
1672
|
+
for (const e of r.bandTextures.values()) e.destroy();
|
|
1673
|
+
r.bandTextures.clear(), r.array = null;
|
|
1674
|
+
}
|
|
1675
|
+
const xt = {
|
|
1676
|
+
name: "perBandRescale",
|
|
1677
|
+
fs: `uniform perBandRescaleUniforms {
|
|
1678
|
+
vec3 minV;
|
|
1679
|
+
vec3 maxV;
|
|
1680
|
+
} perBandRescale;
|
|
1681
|
+
`,
|
|
1682
|
+
inject: {
|
|
1683
|
+
"fs:DECKGL_FILTER_COLOR": (
|
|
1684
|
+
/* glsl */
|
|
1685
|
+
`
|
|
1686
|
+
color.rgb = clamp((color.rgb - perBandRescale.minV) / (perBandRescale.maxV - perBandRescale.minV), 0.0, 1.0);
|
|
1687
|
+
`
|
|
1688
|
+
)
|
|
1689
|
+
},
|
|
1690
|
+
uniformTypes: { minV: "vec3<f32>", maxV: "vec3<f32>" },
|
|
1691
|
+
getUniforms: (r) => ({
|
|
1692
|
+
minV: r.minV ?? [0, 0, 0],
|
|
1693
|
+
maxV: r.maxV ?? [255, 255, 255]
|
|
1694
|
+
})
|
|
1695
|
+
}, Pt = {
|
|
1696
|
+
name: "stretchGamma",
|
|
1697
|
+
fs: `uniform stretchGammaUniforms {
|
|
1698
|
+
float mode;
|
|
1699
|
+
float invGamma;
|
|
1700
|
+
} stretchGamma;
|
|
1701
|
+
`,
|
|
1702
|
+
inject: {
|
|
1703
|
+
"fs:DECKGL_FILTER_COLOR": (
|
|
1704
|
+
/* glsl */
|
|
1705
|
+
`
|
|
1706
|
+
if (stretchGamma.mode > 0.5 && stretchGamma.mode < 1.5) {
|
|
1707
|
+
color.rgb = log(1.0 + 9.0 * color.rgb) / log(10.0);
|
|
1708
|
+
} else if (stretchGamma.mode > 1.5) {
|
|
1709
|
+
color.rgb = sqrt(color.rgb);
|
|
1710
|
+
}
|
|
1711
|
+
color.rgb = pow(color.rgb, vec3(stretchGamma.invGamma));
|
|
1712
|
+
`
|
|
1713
|
+
)
|
|
1714
|
+
},
|
|
1715
|
+
uniformTypes: { mode: "f32", invGamma: "f32" },
|
|
1716
|
+
getUniforms: (r) => ({
|
|
1717
|
+
mode: r.mode ?? 0,
|
|
1718
|
+
invGamma: r.invGamma ?? 1
|
|
1719
|
+
})
|
|
1720
|
+
}, ne = /* @__PURE__ */ new Set();
|
|
1721
|
+
function yt(r) {
|
|
1722
|
+
return r == null || r === "" || r === "linear" ? 0 : r === "log" ? 1 : r === "sqrt" ? 2 : (ne.has(r) || (ne.add(r), console.warn(`[onlymapjs] raster: stretch="${r}" is not linear|log|sqrt — using linear.`)), 0);
|
|
1723
|
+
}
|
|
1724
|
+
const re = /* @__PURE__ */ new Set();
|
|
1725
|
+
function Tt(r) {
|
|
1726
|
+
return r == null ? 1 : Number.isFinite(r) && r > 0 ? r : (re.has(r) || (re.add(r), console.warn(`[onlymapjs] raster: gamma=${r} — a power-law exponent must be > 0; ignoring.`)), 1);
|
|
1727
|
+
}
|
|
1728
|
+
function Lt(r, e) {
|
|
1729
|
+
const t = (i, a) => i == null ? a : typeof i == "number" || Array.isArray(i) && i.length === 3 && i.every((c) => typeof c == "number" && Number.isFinite(c)) && e.length === 3 ? i : Array.isArray(i) && typeof i[0] == "number" ? i[0] : a, n = t(r.rescaleMin, 0), s = t(r.rescaleMax, 255);
|
|
1730
|
+
if (typeof n == "number" && typeof s == "number") return { kind: "scalar", min: n, max: s };
|
|
1731
|
+
const o = (i) => typeof i == "number" ? [i, i, i] : i;
|
|
1732
|
+
return { kind: "per-band", minV: o(n), maxV: o(s) };
|
|
1733
|
+
}
|
|
1734
|
+
function wt(r, e) {
|
|
1735
|
+
if (r.length === 1) {
|
|
1736
|
+
const t = e(r[0]);
|
|
1737
|
+
return [t, t, t, -1];
|
|
1738
|
+
}
|
|
1739
|
+
return [e(r[0]), e(r[1]), e(r[2]), -1];
|
|
1740
|
+
}
|
|
1741
|
+
function St(r, e) {
|
|
1742
|
+
const t = gt(e.bands, r.bandCount), n = bt(r, t), s = [...new Set(t)], o = (f) => s.indexOf(f), i = (f) => {
|
|
1743
|
+
const d = s[f];
|
|
1744
|
+
return d === void 0 ? n[0] : r.bandTextures.get(d) ?? n[0];
|
|
1745
|
+
}, a = [
|
|
1746
|
+
// Base-texture insurance: CompositeBands rewrites the color wholesale,
|
|
1747
|
+
// but the underlying raster mesh expects a bound base texture — slot-0's
|
|
1748
|
+
// band doubles as it (harmless; immediately overwritten).
|
|
1749
|
+
{ module: ae, props: { textureName: n[0] } },
|
|
1750
|
+
{
|
|
1751
|
+
module: it,
|
|
1752
|
+
props: {
|
|
1753
|
+
band0: i(0),
|
|
1754
|
+
band1: i(1),
|
|
1755
|
+
band2: i(2),
|
|
1756
|
+
band3: i(3),
|
|
1757
|
+
channelMap: wt(t, o)
|
|
1758
|
+
}
|
|
1759
|
+
}
|
|
1760
|
+
], c = e.nodataOverride ?? r.nodata;
|
|
1761
|
+
c != null && Number.isFinite(c) && a.push({ module: ht, props: { value: c } });
|
|
1762
|
+
const u = Lt(e, t);
|
|
1763
|
+
u.kind === "scalar" ? a.push({ module: ft, props: { rescaleMin: u.min, rescaleMax: u.max } }) : a.push({ module: xt, props: { minV: u.minV, maxV: u.maxV } });
|
|
1764
|
+
const l = yt(e.stretch), h = Tt(e.gamma);
|
|
1765
|
+
return (l !== 0 || h !== 1) && a.push({ module: Pt, props: { mode: l, invGamma: 1 / h } }), t.length === 1 && a.push({
|
|
1766
|
+
module: ot,
|
|
1767
|
+
props: {
|
|
1768
|
+
colormapTexture: r.colormapTexture,
|
|
1769
|
+
colormapIndex: pt(e.colormap ?? "gray"),
|
|
1770
|
+
reversed: e.reverse === !0
|
|
1771
|
+
}
|
|
1772
|
+
}), { renderPipeline: a };
|
|
1566
1773
|
}
|
|
1567
1774
|
export {
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1775
|
+
Ct as A,
|
|
1776
|
+
ot as C,
|
|
1777
|
+
ht as F,
|
|
1778
|
+
Dt as R,
|
|
1779
|
+
L as a,
|
|
1780
|
+
ae as b,
|
|
1781
|
+
Xe as c,
|
|
1782
|
+
jt as d,
|
|
1783
|
+
zt as e,
|
|
1784
|
+
Bt as f,
|
|
1785
|
+
Et as g,
|
|
1786
|
+
Xt as h,
|
|
1580
1787
|
q as i,
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1788
|
+
St as j,
|
|
1789
|
+
It as k,
|
|
1790
|
+
bt as l,
|
|
1791
|
+
Rt as m,
|
|
1792
|
+
vt as n,
|
|
1793
|
+
Ne as p,
|
|
1794
|
+
gt as r,
|
|
1795
|
+
At as s,
|
|
1796
|
+
Ie as t
|
|
1585
1797
|
};
|