Skip to main content
Public Preview

RasterFlow reads and writes directly to S3-compatible locations. Inputs — an Area of Interest, a GDAL Raster Tile Index (GTI), a source Zarr store — are read from the URI you pass in, and every RasterFlow task takes a storage_uri input that controls where its outputs and intermediate data land. By default, that destination is your Organization’s Wherobots Managed Storage. Point storage_uri at a Storage Integration instead when you want RasterFlow output to live in your own S3 bucket, under your own retention and access rules.

Where RasterFlow writes

Reading outputs outside Wherobots. A Wherobots notebook can read Managed Storage directly. To read a task’s outputs from your own machine or systems, see Download a task run’s results, or write them to your own bucket with storage_uri.

Before you start

  • A Wherobots account. RasterFlow is available to every Organization with nothing to enable.
  • Outside a Wherobots notebook or job, a Wherobots API key, set as WHEROBOTS_API_KEY.
  • For the Python examples, Python 3.11 or later with wherobots-python-sdk. The API examples need only curl.
  • A storage integration that is already configured through the normal Wherobots setup flow. See S3 Storage Integration for the guided CloudFormation wizard.
  • Read & Write access on the integration if you intend to use the bucket as a RasterFlow destination. A Read integration can supply inputs only.
Runtime Restart Required After Data IntegrationTo use new storage integrations or catalogs in your notebooks, destroy the existing runtime and start a new one. Notebooks can only access storage integrations or catalogs that were created before the runtime started.

How RasterFlow authenticates to storage

You do not supply an IAM role, an access key, or a credential file to RasterFlow. Access is resolved per path, at the moment the task needs it:
RasterFlow matches the S3 path it is about to read or write against the storage scopes configured for your Organization, then mints short-lived AWS credentials scoped to that path and to the access mode it needs — read for inputs, read-write for destinations. Credentials are cached and refreshed before they expire, so long-running mosaic and inference tasks keep working without intervention.
Publicly readable S3 URIs are read anonymously — no storage integration and no Cloud Connection are involved. This is what lets you point gti_uri or aoi at an open dataset while writing results to your own private bucket.
Your Wherobots identity authorizes the task run (your API key, or your sign-in inside a Wherobots notebook or job), and RasterFlow resolves storage access on the server. Your code never holds AWS credentials, and the same code runs unchanged from a notebook, a script, or a scheduler.
Credential resolution is automatic, but the integration itself is not. RasterFlow can only reach buckets that an Admin has already added as a storage integration — it will not prompt you to create one.

Set a destination bucket

The examples on this page run RasterFlow through the Tasks API, in two tabs. Python uses the Wherobots Python SDK, and API calls the REST API with curl. Outside a Wherobots notebook or job, both need a Wherobots API key in WHEROBOTS_API_KEY. Each example starts a task run; to wait for it and read its results, see Get started and Run RasterFlow Tasks.
Pass storage_uri as an s3:// URI prefix. RasterFlow writes its outputs and intermediate data under that prefix.
The store URIs in the returned mosaic index point into the prefix you supplied, for example:
Every RasterFlow task accepts storage_uri: build_mosaics, build_gti_mosaics, run_mosaic_inference, run_cog_inference, the recipe and geometry inference tasks, run_mosaics_change, vectorize_mosaic, and build_zarr_multiscales. Get a task returns each task’s full input schema.
build_mosaics and build_gti_mosaics also accept an id input, which creates a deterministic output prefix under storage_uri instead of one named after the task run. Use it when you want a predictable, re-runnable output path.

Use different buckets for input and output

storage_uri is set per task run and applies only to that run’s output, so inputs and outputs are independent. A built-in dataset, a public tile index, or a store in a bucket you only read from can each be an input while everything you produce goes to your own bucket. That holds across the steps of a pipeline too. Each task reads the URI returned by the previous run and writes wherever you send it. This example follows the ChesapeakeRSC recipe: it filters the NAIP tile index for native 1-meter imagery from 2017 and uses a 1-meter output grid. Choose a date range with coverage for your AOI.
Every bucket you reference — whether as an input URI or as a storage_uri destination — needs to be either publicly readable or covered by a storage integration. Reading from one integrated bucket and writing to another is supported; reading from a bucket that has no integration is not.

Supported formats

RasterFlow reads and writes standard open formats at these locations. Supported examples include:
Mosaics, model predictions, and change-detection outputs are written as Zarr stores. build_zarr_multiscales reads a Zarr store and writes an optimized one.
Cloud Optimized GeoTIFFs are read as mosaic inputs through a GDAL Raster Tile Index with the build_gti_mosaics task.
Areas of Interest and tile indexes are read as GeoParquet. Mosaic index tables and vectorize_mosaic results are written as GeoParquet.
Non-spatial tabular inputs and outputs alongside your raster products.
RasterFlow writes mosaics, predictions, and vectorized results as files at these locations and doesn’t add them to a catalog. To query vectorized results as a table, load the GeoParquet output of the vectorize_mosaic task into an Iceberg table with WherobotsDB, for example in a Managed Catalog on an integrated bucket.

Enable map access to outputs in your bucket

Wherobots-GL — the renderer behind the Wherobots Cloud Map page and the notebook Map widget — loads outputs by URL, in the browser. Outputs in Wherobots Managed Storage work with no extra setup. Outputs in your own bucket have to be reachable with the credentials in play and allow cross-origin browser requests (CORS).

Before you visualize

Confirm that:
  • The output path points at the intended bucket and AWS region.
  • The output objects exist and the identity used for visualization can read them.
  • The bucket’s CORS policy allows requests from the Wherobots Cloud origins.
  • The policy permits GET and HEAD requests.
  • The policy allows the Range request header and exposes the ETag and Content-Range response headers. Wherobots-GL uses partial reads to stream raster data efficiently rather than downloading whole stores.
Setting up CORS has a ready-to-paste Amazon S3 policy that satisfies all of these, including the Wherobots Cloud origins and the full set of exposed headers.

Validate access

Two different things have to be true, and they are checked separately:
Go to Organization Settings > Storage and use … > Verify Access. Wherobots checks read access, and write access for a Read & Write integration.This confirms RasterFlow can reach the bucket. It exercises the storage integration, not the browser.
Verify Access does not test the cross-origin path, so a bucket that verifies cleanly can still fail to render. Confirm CORS by opening the output URL on the Map page — a CORS failure shows up as a blank layer and a blocked request in your browser’s developer console.
Resolve both before sharing an output URL with someone else.

Troubleshooting visualization

Cause: The browser is blocked from reading the output.Solution:
  • Update the bucket’s CORS policy using Setting up CORS, then retry.
  • Confirm the policy includes the Wherobots Cloud origins, GET and HEAD methods, Range as an allowed request header, and ETag and Content-Range among the exposed response headers.
Cause: The output location and the bucket’s region do not match, or the bucket is configured for a different region than expected.Solution:
  • Verify the output location, bucket name, and AWS region.
  • Re-run the task with a corrected storage_uri, or republish the output to a bucket in the expected region.
Cause: The output is not where you think it is, or the identity used for visualization cannot read it.Solution:
  • Print the output URI from the run’s results rather than reconstructing the path by hand.
  • Confirm the identity used for visualization has read access to that prefix.
  • Do not put long-lived cloud access keys into browser-based configuration. Use short-lived credentials or scoped access instead — in a notebook, pass them with Map(..., aws_credentials={...}) as shown in Visualize RasterFlow Outputs.

Security guidance

Grant only the minimum permissions needed to read the output objects. Keep write and administrative permissions out of anything browser-accessible, and scope temporary credentials to the relevant bucket and prefix.

Download task run results

To download a task’s output to your machine with only your API key, request short-lived, read-only AWS credentials for its URI, then copy it. This works for any RasterFlow task, whether the output is a single file, such as a mosaic index, or a directory, such as vector results.
Python
  • The credentials cover only that output’s prefix and expire after about an hour. Request new ones for each output.
  • Zarr stores (output_uri from Build Multiscales) can be large. To read part of one instead of copying all of it, pass the same fs to your reader, such as xarray.open_zarr(fs.get_mapper(output_uri)).
  • With the REST API, POST https://api.cloud.wherobots.com/storage/credentials with {"path": "<output URI>", "access_mode": "read"} returns the same credentials.

Troubleshooting

Cause: The integration exists but does not grant the access the task needs. The run’s error_message (errorMessage in the REST API) names the path it could not reach.Solution:
  • Confirm the integration is Read & Write if you are using the bucket as a storage_uri destination. A Read integration cannot receive output.
  • If you read the outputs from a notebook, start a new runtime. Notebooks can only reach integrations that existed when the runtime started.
  • Re-verify the integration from Organization Settings > Storage using … > Verify Access.
Cause: The task ran without storage_uri, so its output is in Wherobots Managed Storage, which your own AWS credentials can’t read.Solution:
  • Read the output from a Wherobots notebook, or open it on the Map page.
  • Download the existing output with temporary storage credentials. For future runs, set storage_uri to a bucket you can read if you want the outputs there.
Cause: The bucket is private and has no storage integration, so RasterFlow falls back to anonymous access and is denied.Solution:
  • Add a storage integration for the bucket, or copy the input into a bucket that already has one.
  • Verify the URI itself, including any .zarr or .parquet suffix, by printing it before the call.
Cause: The bucket name contains periods, which storage integrations do not support.Solution:
  • Use a bucket whose name has no periods — s3://my-bucket rather than s3://my.bucket.name. See Limitations.

Usage and best practices

  • Choose where to store outputs: You can download Managed Storage results with temporary credentials. Set storage_uri when you want future outputs in your own bucket.
  • Separate prefixes by stage: Distinct prefixes for mosaics, predictions, and vectors make outputs easy to find and easy to expire independently.
  • Read public imagery directly: Anonymous access means there is no reason to copy an open dataset into your bucket before mosaicking it.
  • Parameterize the destination: Reading storage_uri from configuration keeps one script usable across environments.
  • Set CORS once, up front: Add the CORS policy when you add the storage integration, so outputs are viewable on the map the first time you open one.

Next steps

Set up S3 Storage Integration

Create the integration that grants Wherobots access to your bucket.

Run a task

See the full request and response for starting a RasterFlow task run.

Build Multiscales

Add overview levels to a Zarr store so it can be visualized interactively.

API reference

For detailed API documentation, see: