/fuse Endpoint — Zarr & GeoTIFF Output
Overview
The /fuse endpoint fuses topobathymetric data on-demand and returns it in your choice of:
Zarr (ZIP archive) — preferred for streaming and cross-platform use, especially Julia
GeoTIFF — traditional raster format
API
GET /fuse?bbox=west,south,east,north&resolution=30&format=zarr
Query Parameters
Parameter |
Type |
Required |
Default |
Description |
|---|---|---|---|---|
|
string |
* |
— |
Bounding box as |
|
float |
* |
— |
Bounding box west (longitude) |
|
float |
* |
— |
Bounding box south (latitude) |
|
float |
* |
— |
Bounding box east (longitude) |
|
float |
* |
— |
Bounding box north (latitude) |
|
float |
no |
30.0 |
Output resolution in meters |
|
string |
no |
|
Output format: |
Note: Provide either bbox or all four (west, south, east, north). West < East and South < North are enforced.
Response
Zarr (ZIP Archive)
HTTP/1.1 200 OK
Content-Type: application/zip
Content-Disposition: attachment; filename=fused.zarr.zip
[binary zip file containing Zarr store]
The ZIP archive contains:
elevation/— fused DEM array (float32)source_elevation/— per-pixel provider ID (uint32, optional).zattrs— metadata (JSON).zgroup— Zarr group metadata
Zarr Metadata (.zattrs)
{
"crs": "EPSG:4326",
"bbox": [-73.85, 40.78, -73.72, 40.82],
"resolution_m": 10.0,
"vertical_datum": "NAVD88",
"policy": "wlis.yaml",
"providers_used": ["gebco_2025", "usgs_3dep", "noaa_topobathy"],
"created": "2026-03-08T14:23:45.123456+00:00",
"provenance_dict": {
"1": {"provider": "gebco_2025", "product": "sub_ice_topo_bathymetry"},
"2": {"provider": "usgs_3dep", "product": "1m"},
...
}
}
GeoTIFF
HTTP/1.1 200 OK
Content-Type: image/tiff
[binary GeoTIFF file]
Returns a single-band GeoTIFF with elevation data. CRS and geotransform are embedded.
Examples
Julia (Zarr)
using Zarr, Downloads
# Download fused elevation as Zarr
url = "http://localhost:9595/fuse?bbox=-73.85,40.78,-73.72,40.82&resolution=10&format=zarr"
filepath = "fused.zarr.zip"
Downloads.download(url, filepath)
# Open and read into memory
store = Zarr.zopen(filepath)
elevation = store["elevation"][:, :]
metadata = store.attrs
println("CRS: $(metadata["crs"])")
println("Providers: $(metadata["providers_used"])")
Python
import requests
import zarr
import xarray as xr
from pathlib import Path
url = "http://localhost:9595/fuse?bbox=-73.85,40.78,-73.72,40.82&format=zarr"
response = requests.get(url)
# Save and read Zarr
Path("fused.zarr.zip").write_bytes(response.content)
store = zarr.ZipStore("fused.zarr.zip", mode="r")
ds = xr.open_dataset(store, engine="zarr")
print(ds)
store.close()
cURL (GeoTIFF)
curl "http://localhost:9595/fuse?bbox=-73.85,40.78,-73.72,40.82&format=geotiff" \
-o fused.tif
gdalinfo fused.tif
POST /fuse — Dynamic Policy Override
The POST variant accepts a JSON body and supports dynamic policy switching,
allowing you to override the server’s default fusion policy per request.
POST /fuse
Content-Type: application/json
Request Body
Field |
Type |
Required |
Default |
Description |
|---|---|---|---|---|
|
|
yes |
— |
Bounding box in WGS84 decimal degrees |
|
float |
no |
30.0 |
Output resolution in meters |
|
string |
no |
|
Output format: |
|
string |
no |
null |
Raw YAML policy content to override default fusion |
|
string |
no |
null |
Name of a server-side policy (reserved, not yet implemented) |
When policy_yaml is provided, it takes precedence over both policy_name
and the server’s default policy. The raw YAML string is parsed and used as
the fusion policy for that request only.
Example — custom policy
import requests, yaml
# Define a minimal custom policy inline
policy = {
"name": "Simple GEBCO+CUDEM",
"crs": "EPSG:4326",
"variables": [{
"name": "elevation",
"steps": [
{"provider": "gebco_2025", "operator": "overwrite"},
{"provider": "ncei_cudem", "operator": "overwrite"},
]
}]
}
resp = requests.post("http://localhost:9595/fuse", json={
"bbox": [-73.85, 40.78, -73.72, 40.82],
"resolution": 30,
"format": "zarr",
"policy_yaml": yaml.dump(policy),
})
Cache behavior
Custom policies are cached separately from the server default. The cache key is a SHA256 hash of the policy content + bbox + resolution, so:
Two requests with the same custom YAML hit the same cache entry.
A custom policy request never collides with a default policy request.
Modifying a single line in the YAML produces a different cache key.
Cached results live at ~/.cache/topobathysim/fused_zarr/{hash}.zarr.
Error Handling
Status |
Reason |
|---|---|
|
Invalid bbox parameters, ordering, format, or missing values |
|
Fusion returned no elevation data (bbox outside valid area) |
|
Runtime fusion error |
Performance Notes
Zarr is chunked and supports streaming access via fsspec (future enhancement)
GeoTIFF returns a single monolithic file
Default resolution is 30m; increase for faster response times
Results are cached in
~/.cache/topobathysim/fused_zarr/by policy, bbox, and resolution