geolibre-wasm 0.5.3 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -65,10 +65,87 @@ const { exitCode, stdout, files } = await runTool("slope", {
65
65
  const slopeCog = files["slope.tif"]; // Uint8Array (Cloud Optimized GeoTIFF)
66
66
  ```
67
67
 
68
+ COG subsets can be extracted from a local file or an HTTP source. HTTP sources
69
+ use byte-range requests and do not download the full object:
70
+
71
+ ```js
72
+ const { files } = await runTool("extract_cog_subset", {
73
+ args: [
74
+ "--url=https://example.com/scene.cog.tif",
75
+ "--bbox=-122.55,37.70,-122.35,37.84",
76
+ "--bbox_crs=4326",
77
+ "--output_crs=3857",
78
+ "--resolution=10",
79
+ "--nodata=-9999",
80
+ "--output=/work/subset.tif",
81
+ ],
82
+ });
83
+ const subsetCog = files["subset.tif"];
84
+ ```
85
+
86
+ WMS subsets can be requested from a GetMap endpoint that supports GeoTIFF
87
+ responses:
88
+
89
+ ```js
90
+ const { files } = await runTool("extract_wms_subset", {
91
+ args: [
92
+ "--url=https://example.com/geoserver/wms",
93
+ "--layers=workspace:layer",
94
+ "--bbox=-122.55,37.70,-122.35,37.84",
95
+ "--bbox_crs=4326",
96
+ "--resolution=0.0001",
97
+ "--format=image/geotiff",
98
+ "--output=/work/wms_subset.tif",
99
+ ],
100
+ });
101
+ ```
102
+
103
+ XYZ tile subsets can be mosaicked from raster tiles and written as an RGB COG:
104
+
105
+ ```js
106
+ const { files } = await runTool("extract_xyz_tile_subset", {
107
+ args: [
108
+ "--url=https://tile.openstreetmap.org/{z}/{x}/{y}.png",
109
+ "--zoom=10",
110
+ "--bbox=-122.55,37.70,-122.35,37.84",
111
+ "--bbox_crs=4326",
112
+ "--width=512",
113
+ "--height=512",
114
+ "--output=/work/xyz_subset.tif",
115
+ ],
116
+ });
117
+ ```
118
+
119
+ For a local COG, upload/provide bytes through `input` and point `--input` at
120
+ the `/work` path:
121
+
122
+ ```js
123
+ const { files } = await runTool("extract_cog_subset", {
124
+ args: [
125
+ "--input=/work/local.cog.tif",
126
+ "--bbox=-122.55,37.70,-122.35,37.84",
127
+ "--bbox_crs=4326",
128
+ "--output=/work/subset.tif",
129
+ ],
130
+ input: { "local.cog.tif": localCogBytes },
131
+ });
132
+ ```
133
+
68
134
  Inputs are placed under `/work` (keyed by filename); any file a tool writes is
69
135
  returned in `files`. Raster outputs are Cloud Optimized GeoTIFFs; vector outputs
70
136
  are GeoJSON.
71
137
 
138
+ When `output_crs` is set, `resolution` is interpreted in output CRS units and
139
+ the subset is reprojected with nearest-neighbor resampling. Without
140
+ `output_crs`, the output usually stays on the source COG grid. Sources with
141
+ user-defined projection strings that cannot be written as EPSG metadata, such as
142
+ the NLCD sample, default to `bbox_crs` output so GIS viewers can place the
143
+ result. Outputs are Deflate-compressed by default. `nodata` overrides the output
144
+ nodata metadata and is used to fill pixels introduced during reprojection.
145
+ The subset writer preserves the source sample type for supported COG types
146
+ (`uint8`, `float32`, and `float64`); palette-indexed `uint8` rasters retain
147
+ their source ColorMap.
148
+
72
149
  ## API
73
150
 
74
151
  | Export | Description |
@@ -77,6 +154,9 @@ are GeoJSON.
77
154
  | `listTools(): Promise<string[]>` | Every available tool id. |
78
155
  | `listManifests(): Promise<ToolManifest[]>` | All tool manifests (parameter schemas), for building UIs offline. |
79
156
  | `runTool(tool, { args?, input? }): Promise<ToolResult>` | Run one tool over the in-memory filesystem. |
157
+ | `extractCogSubset(source, opts): Promise<Uint8Array>` | Extract a local or HTTP COG subset directly. |
158
+ | `extractWmsSubset(url, opts): Promise<Uint8Array>` | Request a WMS GeoTIFF subset and encode it as a COG. |
159
+ | `extractXyzTileSubset(url, opts): Promise<Uint8Array>` | Mosaic XYZ raster tiles and encode them as an RGB COG. |
80
160
 
81
161
  `ToolResult` is `{ exitCode: number, stdout: string[], files: Record<string, Uint8Array> }`.
82
162
 
package/geolibre-cli.wasm CHANGED
Binary file
@@ -79,6 +79,14 @@ export class CogBuilder {
79
79
  export class CogStream {
80
80
  free(): void;
81
81
  [Symbol.dispose](): void;
82
+ /**
83
+ * Reproject a bbox from `bbox_epsg` into this COG's dataset CRS.
84
+ *
85
+ * The COG projection string is preferred over its EPSG tag when available,
86
+ * because some user-defined projected GeoTIFFs expose only their geographic
87
+ * base EPSG code.
88
+ */
89
+ bbox_to_dataset_crs(bbox_epsg: number, bbox: Float64Array): Float64Array;
82
90
  /**
83
91
  * Bounding box `[min_x, min_y, max_x, max_y]` in the dataset CRS, or empty.
84
92
  */
@@ -115,6 +123,14 @@ export class CogStream {
115
123
  * Parse a COG's tile layout from front-of-file header bytes.
116
124
  */
117
125
  constructor(header_bytes: Uint8Array);
126
+ /**
127
+ * Reproject x,y coordinate pairs from this COG's dataset CRS to an EPSG CRS.
128
+ */
129
+ points_from_dataset_crs(dst_epsg: number, xy: Float64Array): Float64Array;
130
+ /**
131
+ * Reproject x,y coordinate pairs from an EPSG CRS into this COG's dataset CRS.
132
+ */
133
+ points_to_dataset_crs(src_epsg: number, xy: Float64Array): Float64Array;
118
134
  /**
119
135
  * `[offset, length]` byte range of the tile at `(col, row)` on `level`.
120
136
  */
@@ -128,6 +144,10 @@ export class CogStream {
128
144
  * EPSG code of the full-resolution level, if any.
129
145
  */
130
146
  readonly epsg: number | undefined;
147
+ /**
148
+ * True when the COG CRS is represented by a user-defined projection string.
149
+ */
150
+ readonly has_projection_string: boolean;
131
151
  /**
132
152
  * No-data sentinel, if declared.
133
153
  */
@@ -242,6 +262,58 @@ export class GeoTiffReader {
242
262
  readonly width: number;
243
263
  }
244
264
 
265
+ export class PmtilesExtractor {
266
+ free(): void;
267
+ [Symbol.dispose](): void;
268
+ /**
269
+ * Hand back the bytes of one `wanted_json()` range, identified by its
270
+ * offset. Ranges may be fed in any order.
271
+ */
272
+ feed(offset: number, bytes: Uint8Array): void;
273
+ /**
274
+ * Assemble the extracted archive. Consumes the extractor's buffers; the
275
+ * returned `Uint8Array` is a complete `.pmtiles` file.
276
+ */
277
+ finish(): Uint8Array;
278
+ /**
279
+ * Source archive header as JSON (`{}` until the first feed): zooms,
280
+ * bounds, tile type/compression, tile counts. Lets a UI validate the
281
+ * request and describe the source before committing to the download.
282
+ */
283
+ header_json(): string;
284
+ /**
285
+ * Plan an extraction of `min_zoom..=max_zoom` tiles intersecting the
286
+ * WGS84 bbox. Zooms are clamped to what the source archive contains once
287
+ * its header arrives; `min_zoom` 0 keeps the basemap usable zoomed out.
288
+ */
289
+ constructor(min_lon: number, min_lat: number, max_lon: number, max_lat: number, min_zoom: number, max_zoom: number);
290
+ /**
291
+ * Progress as JSON: `{"phase":"header|directories|data|done",
292
+ * "tiles_selected":n,"blobs_total":n,"data_bytes_total":n,
293
+ * "data_bytes_received":n,"estimated_output_bytes":n}`.
294
+ */
295
+ progress_json(): string;
296
+ /**
297
+ * Coalesce tile-data requests whose byte gap is at most this (default
298
+ * 65,536). Larger values trade overfetch for fewer HTTP round-trips.
299
+ */
300
+ set_max_range_gap(max_gap: number): void;
301
+ /**
302
+ * Cap on addressed tiles (default 2,000,000). Raise for huge desktop
303
+ * extracts; lower to fail fast in memory-constrained embeds.
304
+ */
305
+ set_max_tiles(max_tiles: number): void;
306
+ /**
307
+ * Outstanding byte ranges the host should fetch, as a JSON array of
308
+ * `{"offset":n,"length":n}`. Empty array when nothing is outstanding.
309
+ */
310
+ wanted_json(): string;
311
+ /**
312
+ * True once every needed range has been fed; `finish()` is then valid.
313
+ */
314
+ readonly done: boolean;
315
+ }
316
+
245
317
  /**
246
318
  * Install a panic hook so Rust panics surface as readable `console.error`
247
319
  * messages instead of an opaque `RuntimeError: unreachable`.
@@ -319,6 +391,20 @@ export function lidar_read_xyz(data: Uint8Array, format: string): Float64Array;
319
391
  */
320
392
  export function morans_i(points_xy: Float64Array, values: Float64Array, distance_threshold: number): string;
321
393
 
394
+ /**
395
+ * Reproject a bbox between two EPSG CRSs.
396
+ *
397
+ * Input and output order is `[min_x, min_y, max_x, max_y]`. The bbox edges are
398
+ * densified so projected extrema that fall along an edge are preserved better
399
+ * than a corner-only transform.
400
+ */
401
+ export function transform_bbox_epsg(src_epsg: number, dst_epsg: number, bbox: Float64Array): Float64Array;
402
+
403
+ /**
404
+ * Reproject x,y coordinate pairs between two EPSG CRSs.
405
+ */
406
+ export function transform_points_epsg(src_epsg: number, dst_epsg: number, xy: Float64Array): Float64Array;
407
+
322
408
  /**
323
409
  * Vector formats this build can read from memory (comma-separated).
324
410
  */
@@ -358,6 +444,7 @@ export interface InitOutput {
358
444
  readonly __wbg_cogbuilder_free: (a: number, b: number) => void;
359
445
  readonly __wbg_cogstream_free: (a: number, b: number) => void;
360
446
  readonly __wbg_geotiffreader_free: (a: number, b: number) => void;
447
+ readonly __wbg_pmtilesextractor_free: (a: number, b: number) => void;
361
448
  readonly cogbuilder_new: (a: number, b: number, c: number) => number;
362
449
  readonly cogbuilder_set_bigtiff: (a: number, b: number) => void;
363
450
  readonly cogbuilder_set_compression: (a: number, b: number, c: number, d: number) => void;
@@ -370,6 +457,7 @@ export interface InitOutput {
370
457
  readonly cogbuilder_write_f32: (a: number, b: number, c: number, d: number) => void;
371
458
  readonly cogbuilder_write_f64: (a: number, b: number, c: number, d: number) => void;
372
459
  readonly cogbuilder_write_u8: (a: number, b: number, c: number, d: number) => void;
460
+ readonly cogstream_bbox_to_dataset_crs: (a: number, b: number, c: number, d: number, e: number) => void;
373
461
  readonly cogstream_bounding_box: (a: number, b: number) => void;
374
462
  readonly cogstream_bounds_lonlat: (a: number, b: number) => void;
375
463
  readonly cogstream_center: (a: number, b: number) => void;
@@ -377,10 +465,13 @@ export interface InitOutput {
377
465
  readonly cogstream_decode_tile_f64: (a: number, b: number, c: number, d: number, e: number) => void;
378
466
  readonly cogstream_epsg: (a: number) => number;
379
467
  readonly cogstream_geo_transform: (a: number, b: number) => void;
468
+ readonly cogstream_has_projection_string: (a: number) => number;
380
469
  readonly cogstream_levels_json: (a: number, b: number) => void;
381
470
  readonly cogstream_new: (a: number, b: number, c: number) => void;
382
471
  readonly cogstream_nodata: (a: number, b: number) => void;
383
472
  readonly cogstream_num_levels: (a: number) => number;
473
+ readonly cogstream_points_from_dataset_crs: (a: number, b: number, c: number, d: number, e: number) => void;
474
+ readonly cogstream_points_to_dataset_crs: (a: number, b: number, c: number, d: number, e: number) => void;
384
475
  readonly cogstream_tile_range: (a: number, b: number, c: number, d: number, e: number) => void;
385
476
  readonly cogstream_tiles_for_window: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
386
477
  readonly convex_hull: (a: number, b: number, c: number) => void;
@@ -421,6 +512,17 @@ export interface InitOutput {
421
512
  readonly lidar_read_intensity: (a: number, b: number, c: number, d: number, e: number) => void;
422
513
  readonly lidar_read_xyz: (a: number, b: number, c: number, d: number, e: number) => void;
423
514
  readonly morans_i: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
515
+ readonly pmtilesextractor_done: (a: number) => number;
516
+ readonly pmtilesextractor_feed: (a: number, b: number, c: number, d: number, e: number) => void;
517
+ readonly pmtilesextractor_finish: (a: number, b: number) => void;
518
+ readonly pmtilesextractor_header_json: (a: number, b: number) => void;
519
+ readonly pmtilesextractor_new: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
520
+ readonly pmtilesextractor_progress_json: (a: number, b: number) => void;
521
+ readonly pmtilesextractor_set_max_range_gap: (a: number, b: number, c: number) => void;
522
+ readonly pmtilesextractor_set_max_tiles: (a: number, b: number, c: number) => void;
523
+ readonly pmtilesextractor_wanted_json: (a: number, b: number) => void;
524
+ readonly transform_bbox_epsg: (a: number, b: number, c: number, d: number, e: number) => void;
525
+ readonly transform_points_epsg: (a: number, b: number, c: number, d: number, e: number) => void;
424
526
  readonly vector_formats: (a: number) => void;
425
527
  readonly vector_info: (a: number, b: number, c: number, d: number, e: number) => void;
426
528
  readonly vector_to_geojson: (a: number, b: number, c: number, d: number, e: number) => void;
package/geolibre_wasm.js CHANGED
@@ -218,6 +218,36 @@ export class CogStream {
218
218
  const ptr = this.__destroy_into_raw();
219
219
  wasm.__wbg_cogstream_free(ptr, 0);
220
220
  }
221
+ /**
222
+ * Reproject a bbox from `bbox_epsg` into this COG's dataset CRS.
223
+ *
224
+ * The COG projection string is preferred over its EPSG tag when available,
225
+ * because some user-defined projected GeoTIFFs expose only their geographic
226
+ * base EPSG code.
227
+ * @param {number} bbox_epsg
228
+ * @param {Float64Array} bbox
229
+ * @returns {Float64Array}
230
+ */
231
+ bbox_to_dataset_crs(bbox_epsg, bbox) {
232
+ try {
233
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
234
+ const ptr0 = passArrayF64ToWasm0(bbox, wasm.__wbindgen_export2);
235
+ const len0 = WASM_VECTOR_LEN;
236
+ wasm.cogstream_bbox_to_dataset_crs(retptr, this.__wbg_ptr, bbox_epsg, ptr0, len0);
237
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
238
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
239
+ var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
240
+ var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);
241
+ if (r3) {
242
+ throw takeObject(r2);
243
+ }
244
+ var v2 = getArrayF64FromWasm0(r0, r1).slice();
245
+ wasm.__wbindgen_export(r0, r1 * 8, 8);
246
+ return v2;
247
+ } finally {
248
+ wasm.__wbindgen_add_to_stack_pointer(16);
249
+ }
250
+ }
221
251
  /**
222
252
  * Bounding box `[min_x, min_y, max_x, max_y]` in the dataset CRS, or empty.
223
253
  * @returns {Float64Array}
@@ -340,6 +370,14 @@ export class CogStream {
340
370
  wasm.__wbindgen_add_to_stack_pointer(16);
341
371
  }
342
372
  }
373
+ /**
374
+ * True when the COG CRS is represented by a user-defined projection string.
375
+ * @returns {boolean}
376
+ */
377
+ get has_projection_string() {
378
+ const ret = wasm.cogstream_has_projection_string(this.__wbg_ptr);
379
+ return ret !== 0;
380
+ }
343
381
  /**
344
382
  * JSON array describing every level: `[{level,width,height,tile_width,
345
383
  * tile_height,tiles_x,tiles_y,bands,bits_per_sample,sample_format,compression}]`.
@@ -407,6 +445,58 @@ export class CogStream {
407
445
  const ret = wasm.cogstream_num_levels(this.__wbg_ptr);
408
446
  return ret >>> 0;
409
447
  }
448
+ /**
449
+ * Reproject x,y coordinate pairs from this COG's dataset CRS to an EPSG CRS.
450
+ * @param {number} dst_epsg
451
+ * @param {Float64Array} xy
452
+ * @returns {Float64Array}
453
+ */
454
+ points_from_dataset_crs(dst_epsg, xy) {
455
+ try {
456
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
457
+ const ptr0 = passArrayF64ToWasm0(xy, wasm.__wbindgen_export2);
458
+ const len0 = WASM_VECTOR_LEN;
459
+ wasm.cogstream_points_from_dataset_crs(retptr, this.__wbg_ptr, dst_epsg, ptr0, len0);
460
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
461
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
462
+ var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
463
+ var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);
464
+ if (r3) {
465
+ throw takeObject(r2);
466
+ }
467
+ var v2 = getArrayF64FromWasm0(r0, r1).slice();
468
+ wasm.__wbindgen_export(r0, r1 * 8, 8);
469
+ return v2;
470
+ } finally {
471
+ wasm.__wbindgen_add_to_stack_pointer(16);
472
+ }
473
+ }
474
+ /**
475
+ * Reproject x,y coordinate pairs from an EPSG CRS into this COG's dataset CRS.
476
+ * @param {number} src_epsg
477
+ * @param {Float64Array} xy
478
+ * @returns {Float64Array}
479
+ */
480
+ points_to_dataset_crs(src_epsg, xy) {
481
+ try {
482
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
483
+ const ptr0 = passArrayF64ToWasm0(xy, wasm.__wbindgen_export2);
484
+ const len0 = WASM_VECTOR_LEN;
485
+ wasm.cogstream_points_to_dataset_crs(retptr, this.__wbg_ptr, src_epsg, ptr0, len0);
486
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
487
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
488
+ var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
489
+ var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);
490
+ if (r3) {
491
+ throw takeObject(r2);
492
+ }
493
+ var v2 = getArrayF64FromWasm0(r0, r1).slice();
494
+ wasm.__wbindgen_export(r0, r1 * 8, 8);
495
+ return v2;
496
+ } finally {
497
+ wasm.__wbindgen_add_to_stack_pointer(16);
498
+ }
499
+ }
410
500
  /**
411
501
  * `[offset, length]` byte range of the tile at `(col, row)` on `level`.
412
502
  * @param {number} level
@@ -981,6 +1071,225 @@ export class GeoTiffReader {
981
1071
  }
982
1072
  if (Symbol.dispose) GeoTiffReader.prototype[Symbol.dispose] = GeoTiffReader.prototype.free;
983
1073
 
1074
+ export class PmtilesExtractor {
1075
+ __destroy_into_raw() {
1076
+ const ptr = this.__wbg_ptr;
1077
+ this.__wbg_ptr = 0;
1078
+ PmtilesExtractorFinalization.unregister(this);
1079
+ return ptr;
1080
+ }
1081
+ free() {
1082
+ const ptr = this.__destroy_into_raw();
1083
+ wasm.__wbg_pmtilesextractor_free(ptr, 0);
1084
+ }
1085
+ /**
1086
+ * True once every needed range has been fed; `finish()` is then valid.
1087
+ * @returns {boolean}
1088
+ */
1089
+ get done() {
1090
+ const ret = wasm.pmtilesextractor_done(this.__wbg_ptr);
1091
+ return ret !== 0;
1092
+ }
1093
+ /**
1094
+ * Hand back the bytes of one `wanted_json()` range, identified by its
1095
+ * offset. Ranges may be fed in any order.
1096
+ * @param {number} offset
1097
+ * @param {Uint8Array} bytes
1098
+ */
1099
+ feed(offset, bytes) {
1100
+ try {
1101
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
1102
+ const ptr0 = passArray8ToWasm0(bytes, wasm.__wbindgen_export2);
1103
+ const len0 = WASM_VECTOR_LEN;
1104
+ wasm.pmtilesextractor_feed(retptr, this.__wbg_ptr, offset, ptr0, len0);
1105
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
1106
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
1107
+ if (r1) {
1108
+ throw takeObject(r0);
1109
+ }
1110
+ } finally {
1111
+ wasm.__wbindgen_add_to_stack_pointer(16);
1112
+ }
1113
+ }
1114
+ /**
1115
+ * Assemble the extracted archive. Consumes the extractor's buffers; the
1116
+ * returned `Uint8Array` is a complete `.pmtiles` file.
1117
+ * @returns {Uint8Array}
1118
+ */
1119
+ finish() {
1120
+ try {
1121
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
1122
+ wasm.pmtilesextractor_finish(retptr, this.__wbg_ptr);
1123
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
1124
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
1125
+ var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
1126
+ var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);
1127
+ if (r3) {
1128
+ throw takeObject(r2);
1129
+ }
1130
+ var v1 = getArrayU8FromWasm0(r0, r1).slice();
1131
+ wasm.__wbindgen_export(r0, r1 * 1, 1);
1132
+ return v1;
1133
+ } finally {
1134
+ wasm.__wbindgen_add_to_stack_pointer(16);
1135
+ }
1136
+ }
1137
+ /**
1138
+ * Source archive header as JSON (`{}` until the first feed): zooms,
1139
+ * bounds, tile type/compression, tile counts. Lets a UI validate the
1140
+ * request and describe the source before committing to the download.
1141
+ * @returns {string}
1142
+ */
1143
+ header_json() {
1144
+ let deferred2_0;
1145
+ let deferred2_1;
1146
+ try {
1147
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
1148
+ wasm.pmtilesextractor_header_json(retptr, this.__wbg_ptr);
1149
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
1150
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
1151
+ var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
1152
+ var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);
1153
+ var ptr1 = r0;
1154
+ var len1 = r1;
1155
+ if (r3) {
1156
+ ptr1 = 0; len1 = 0;
1157
+ throw takeObject(r2);
1158
+ }
1159
+ deferred2_0 = ptr1;
1160
+ deferred2_1 = len1;
1161
+ return getStringFromWasm0(ptr1, len1);
1162
+ } finally {
1163
+ wasm.__wbindgen_add_to_stack_pointer(16);
1164
+ wasm.__wbindgen_export(deferred2_0, deferred2_1, 1);
1165
+ }
1166
+ }
1167
+ /**
1168
+ * Plan an extraction of `min_zoom..=max_zoom` tiles intersecting the
1169
+ * WGS84 bbox. Zooms are clamped to what the source archive contains once
1170
+ * its header arrives; `min_zoom` 0 keeps the basemap usable zoomed out.
1171
+ * @param {number} min_lon
1172
+ * @param {number} min_lat
1173
+ * @param {number} max_lon
1174
+ * @param {number} max_lat
1175
+ * @param {number} min_zoom
1176
+ * @param {number} max_zoom
1177
+ */
1178
+ constructor(min_lon, min_lat, max_lon, max_lat, min_zoom, max_zoom) {
1179
+ try {
1180
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
1181
+ wasm.pmtilesextractor_new(retptr, min_lon, min_lat, max_lon, max_lat, min_zoom, max_zoom);
1182
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
1183
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
1184
+ var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
1185
+ if (r2) {
1186
+ throw takeObject(r1);
1187
+ }
1188
+ this.__wbg_ptr = r0;
1189
+ PmtilesExtractorFinalization.register(this, this.__wbg_ptr, this);
1190
+ return this;
1191
+ } finally {
1192
+ wasm.__wbindgen_add_to_stack_pointer(16);
1193
+ }
1194
+ }
1195
+ /**
1196
+ * Progress as JSON: `{"phase":"header|directories|data|done",
1197
+ * "tiles_selected":n,"blobs_total":n,"data_bytes_total":n,
1198
+ * "data_bytes_received":n,"estimated_output_bytes":n}`.
1199
+ * @returns {string}
1200
+ */
1201
+ progress_json() {
1202
+ let deferred2_0;
1203
+ let deferred2_1;
1204
+ try {
1205
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
1206
+ wasm.pmtilesextractor_progress_json(retptr, this.__wbg_ptr);
1207
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
1208
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
1209
+ var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
1210
+ var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);
1211
+ var ptr1 = r0;
1212
+ var len1 = r1;
1213
+ if (r3) {
1214
+ ptr1 = 0; len1 = 0;
1215
+ throw takeObject(r2);
1216
+ }
1217
+ deferred2_0 = ptr1;
1218
+ deferred2_1 = len1;
1219
+ return getStringFromWasm0(ptr1, len1);
1220
+ } finally {
1221
+ wasm.__wbindgen_add_to_stack_pointer(16);
1222
+ wasm.__wbindgen_export(deferred2_0, deferred2_1, 1);
1223
+ }
1224
+ }
1225
+ /**
1226
+ * Coalesce tile-data requests whose byte gap is at most this (default
1227
+ * 65,536). Larger values trade overfetch for fewer HTTP round-trips.
1228
+ * @param {number} max_gap
1229
+ */
1230
+ set_max_range_gap(max_gap) {
1231
+ try {
1232
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
1233
+ wasm.pmtilesextractor_set_max_range_gap(retptr, this.__wbg_ptr, max_gap);
1234
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
1235
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
1236
+ if (r1) {
1237
+ throw takeObject(r0);
1238
+ }
1239
+ } finally {
1240
+ wasm.__wbindgen_add_to_stack_pointer(16);
1241
+ }
1242
+ }
1243
+ /**
1244
+ * Cap on addressed tiles (default 2,000,000). Raise for huge desktop
1245
+ * extracts; lower to fail fast in memory-constrained embeds.
1246
+ * @param {number} max_tiles
1247
+ */
1248
+ set_max_tiles(max_tiles) {
1249
+ try {
1250
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
1251
+ wasm.pmtilesextractor_set_max_tiles(retptr, this.__wbg_ptr, max_tiles);
1252
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
1253
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
1254
+ if (r1) {
1255
+ throw takeObject(r0);
1256
+ }
1257
+ } finally {
1258
+ wasm.__wbindgen_add_to_stack_pointer(16);
1259
+ }
1260
+ }
1261
+ /**
1262
+ * Outstanding byte ranges the host should fetch, as a JSON array of
1263
+ * `{"offset":n,"length":n}`. Empty array when nothing is outstanding.
1264
+ * @returns {string}
1265
+ */
1266
+ wanted_json() {
1267
+ let deferred2_0;
1268
+ let deferred2_1;
1269
+ try {
1270
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
1271
+ wasm.pmtilesextractor_wanted_json(retptr, this.__wbg_ptr);
1272
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
1273
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
1274
+ var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
1275
+ var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);
1276
+ var ptr1 = r0;
1277
+ var len1 = r1;
1278
+ if (r3) {
1279
+ ptr1 = 0; len1 = 0;
1280
+ throw takeObject(r2);
1281
+ }
1282
+ deferred2_0 = ptr1;
1283
+ deferred2_1 = len1;
1284
+ return getStringFromWasm0(ptr1, len1);
1285
+ } finally {
1286
+ wasm.__wbindgen_add_to_stack_pointer(16);
1287
+ wasm.__wbindgen_export(deferred2_0, deferred2_1, 1);
1288
+ }
1289
+ }
1290
+ }
1291
+ if (Symbol.dispose) PmtilesExtractor.prototype[Symbol.dispose] = PmtilesExtractor.prototype.free;
1292
+
984
1293
  /**
985
1294
  * Install a panic hook so Rust panics surface as readable `console.error`
986
1295
  * messages instead of an opaque `RuntimeError: unreachable`.
@@ -1290,6 +1599,66 @@ export function morans_i(points_xy, values, distance_threshold) {
1290
1599
  }
1291
1600
  }
1292
1601
 
1602
+ /**
1603
+ * Reproject a bbox between two EPSG CRSs.
1604
+ *
1605
+ * Input and output order is `[min_x, min_y, max_x, max_y]`. The bbox edges are
1606
+ * densified so projected extrema that fall along an edge are preserved better
1607
+ * than a corner-only transform.
1608
+ * @param {number} src_epsg
1609
+ * @param {number} dst_epsg
1610
+ * @param {Float64Array} bbox
1611
+ * @returns {Float64Array}
1612
+ */
1613
+ export function transform_bbox_epsg(src_epsg, dst_epsg, bbox) {
1614
+ try {
1615
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
1616
+ const ptr0 = passArrayF64ToWasm0(bbox, wasm.__wbindgen_export2);
1617
+ const len0 = WASM_VECTOR_LEN;
1618
+ wasm.transform_bbox_epsg(retptr, src_epsg, dst_epsg, ptr0, len0);
1619
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
1620
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
1621
+ var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
1622
+ var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);
1623
+ if (r3) {
1624
+ throw takeObject(r2);
1625
+ }
1626
+ var v2 = getArrayF64FromWasm0(r0, r1).slice();
1627
+ wasm.__wbindgen_export(r0, r1 * 8, 8);
1628
+ return v2;
1629
+ } finally {
1630
+ wasm.__wbindgen_add_to_stack_pointer(16);
1631
+ }
1632
+ }
1633
+
1634
+ /**
1635
+ * Reproject x,y coordinate pairs between two EPSG CRSs.
1636
+ * @param {number} src_epsg
1637
+ * @param {number} dst_epsg
1638
+ * @param {Float64Array} xy
1639
+ * @returns {Float64Array}
1640
+ */
1641
+ export function transform_points_epsg(src_epsg, dst_epsg, xy) {
1642
+ try {
1643
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
1644
+ const ptr0 = passArrayF64ToWasm0(xy, wasm.__wbindgen_export2);
1645
+ const len0 = WASM_VECTOR_LEN;
1646
+ wasm.transform_points_epsg(retptr, src_epsg, dst_epsg, ptr0, len0);
1647
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
1648
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
1649
+ var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
1650
+ var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);
1651
+ if (r3) {
1652
+ throw takeObject(r2);
1653
+ }
1654
+ var v2 = getArrayF64FromWasm0(r0, r1).slice();
1655
+ wasm.__wbindgen_export(r0, r1 * 8, 8);
1656
+ return v2;
1657
+ } finally {
1658
+ wasm.__wbindgen_add_to_stack_pointer(16);
1659
+ }
1660
+ }
1661
+
1293
1662
  /**
1294
1663
  * Vector formats this build can read from memory (comma-separated).
1295
1664
  * @returns {string}
@@ -1496,6 +1865,9 @@ const CogStreamFinalization = (typeof FinalizationRegistry === 'undefined')
1496
1865
  const GeoTiffReaderFinalization = (typeof FinalizationRegistry === 'undefined')
1497
1866
  ? { register: () => {}, unregister: () => {} }
1498
1867
  : new FinalizationRegistry(ptr => wasm.__wbg_geotiffreader_free(ptr, 1));
1868
+ const PmtilesExtractorFinalization = (typeof FinalizationRegistry === 'undefined')
1869
+ ? { register: () => {}, unregister: () => {} }
1870
+ : new FinalizationRegistry(ptr => wasm.__wbg_pmtilesextractor_free(ptr, 1));
1499
1871
 
1500
1872
  function addHeapObject(obj) {
1501
1873
  if (heap_next === heap.length) heap.push(heap.length + 1);
Binary file