# GeoTessera 0.7 out with efficient sampling and Zarr support

*2025-11-17 — note*


I've just released [geotessera 0.7](https://github.com/ucam-eo/geotessera/releases) to [pypi](https://pypi.org/project/geotessera) for our [TESSERA](https://anil.recoil.org/papers/2025-tessera)
geospatial foundation model, following on from the [first release](https://anil.recoil.org/notes/geotessera-python) earlier this year. To recap:

> TESSERA is a foundation model for Earth observation that processes Sentinel-1
> and Sentinel-2 satellite data to generate representation (embedding) maps. It
> compresses a full year of Sentinel-1 and Sentinel-2 data and learns useful
> temporal-spectral features.
> <cite>\-- [Temporal Embeddings of Surface Spectra for Earth Representation and Analysis](https://github.com/ucam-eo/tessera)</cite>

With this new release, there's convenient [documentation](http://geotessera.readthedocs.io) to show how you can freely access 150TB+
of CC-BY-licensed embeddings of the earth's surface. We've been getting a growing [influx of requests](https://github.com/ucam-eo/geotessera/issues?q=is%3Aissue%20label%3Aembedding-request) for diverse regions of the world, and so our focus for the next few
months is attaining complete coverage of our v1 model on the whole planet.


## Generating and storing the world's embeddings

A new [coverage map visualiser](https://github.com/ucam-eo/tessera-coverage-map/blob/main/tessera_coverage.png) tracks our progress towards complete global embeddings;
to complete the set, we have a giant inferencing task ahead of us. AMD kindly provided us access to an [MI300X cluster](https://www.amd.com/en/corporate/university-program/ai-hpc-cluster.html) for us to train the TESSERA models on, and now we are using our in-house [Dawn cluster](https://anil.recoil.org/videos/48a7ab10-3f49-4978-a00f-c26b64c2cae7) along with machines donated by [Tarides](https://tarides.com) and [Jane Street](https://www.tunbury.org/2025/03/27/dell-poweredge-r640/) to run every tile on earth through our pipeline. The
output of this is a very large set of 128 dimensional vectors in [numpy](https://www.nature.com/articles/s41586-020-2649-2) format,
which we then spatially sort and make available for download. You can [browse the tiles](https://dl2.geotessera.org) on our HTTP server, where you can see [one such tile](https://dl2.geotessera.org/v1/global_0.1_degree_representation/2024/grid_-0.05_12.75/) and associated[^1] checksums.

<a href="https://ucam-eo.github.io/tessera-coverage-map/"> <figure class="image-center"><img src="/images/geotessera-coverage-ui.webp" alt="The hourly refresh of the progress of our global embeddings for 2017-2024" title="The hourly refresh of the progress of our global embeddings for 2017-2024" loading="lazy" srcset="/images/geotessera-coverage-ui.768.webp 768w, /images/geotessera-coverage-ui.640.webp 640w, /images/geotessera-coverage-ui.480.webp 480w, /images/geotessera-coverage-ui.320.webp 320w, /images/geotessera-coverage-ui.2560.webp 2560w, /images/geotessera-coverage-ui.1920.webp 1920w, /images/geotessera-coverage-ui.1600.webp 1600w, /images/geotessera-coverage-ui.1440.webp 1440w, /images/geotessera-coverage-ui.1280.webp 1280w, /images/geotessera-coverage-ui.1024.webp 1024w"><figcaption>The hourly refresh of the progress of our global embeddings for 2017-2024</figcaption></figure> </a>

All pretty simple stuff -- it's just some floating point numbers! -- except for the sheer number of them. Each tile of vectors is around 160MB in size, and so we need around 250TB of storage per year, and we want them from 2017 through to 2024. And by the time we're done inferring all these, 2026 will be upon us and we'll need to generate _another_ 250TBs in short order for the 2025 seasons. Ultimately, to keep up with this we need to build a scalable, open and [federated](https://anil.recoil.org/papers/2025-fairground) pipeline to handle this, which the 0.7 geotessera release lays the groundwork for.

Earlier releases of geotessera used the [Pooch](https://pypi.org/project/pooch/) library as a registry for all the embeddings. Pooch is a very convenient Python library that handles the details of fetching, checksumming and caching, but is really designed for grabbing a few large datasets, for example from Zenodo. The [Tessera manifests repository for Pooch](https://github.com/ucam-eo/tessera-manifests) now has over a million files and takes minutes to initialise the data structures, which in turn makes using [GeoTessera interactively](https://github.com/ucam-eo/tessera-interactive-map) slow.

One lesson [Sadiq Jaffer](https://toao.com) and I learnt from building our [giant literature database](https://anil.recoil.org/papers/2025-evidence-tap) is how good the [Parquet](https://parquet.apache.org/) file format is. So in this 0.7 release, we switch from a text format to track all the tiles to a [couple of GeoParquet databases](https://dl2.geotessera.org/v1/). To help visualize this, I've created an [avsm/geotessera HuggingFace](https://huggingface.co/datasets/avsm/geotessera/viewer/registry?views%5B%5D=registry) dataset where you can browse the format, as well as an [interactive coverage map](https://ucam-eo.github.io/tessera-coverage-map/).

Now when you initialise GeoTessera 0.7+, it will download the two parquet
files instead of using the old git registry. The landmasks parquet rarely changes (it just provides the mapping
between ocean/land tiles and the relevant UTM projection). The registry
contains the tiles for all years, and weighs in around 100MB so far compressed.
In future releases, I'll probably split out them out to be per-year, which will
make them smaller again, but they're all in one place for convenience right now
as the size of the registry download is about the same as a single embedding
tile, so it's not hugely significant to optimise at this stage.

### Towards Zarr format instead of Numpy?

Hot on the heels of the 0.7.0 release, [Janne Mäyrä](https://www.syke.fi/fi/asiantuntijat/janne-mayra) submitted a PR to [add support](https://github.com/ucam-eo/geotessera/pull/94) for a
file format called [Zarr](https://zarr.dev/) which is a really optimised way to store tensors.

> Zarr is a community project to develop specifications and software for
> storage of large N-dimensional typed arrays, also commonly known as tensors.
> A particular focus of Zarr is to provide support for storage using
> distributed systems like cloud object stores, and to enable efficient I/O for
> parallel computing applications.
> 
> Zarr is motivated by the need for a simple, transparent, open, and
> community-driven format that supports high-throughput distributed I/O on
> different storage systems. Zarr data can be stored in any storage system that
> can be represented as a key-value store, including most commonly POSIX file
> systems and cloud object storage but also zip files as well as relational and
> document databases.
> 
> <cite>\-- [Zarr Homepage](https://zarr.dev/), 2025</cite>

This is exactly what we need given the giant storage requirements above, so
I've fixed up and merged this feature and included it into a [0.7.1 point
release](https://github.com/ucam-eo/geotessera/releases/tag/v0.7.1). I've not had much chance to actually play with the format yet, but
getting it into a release is the best place to start. I got one positive
message from [Andres Zuñiga-Gonzalez](https://ancazugo.github.io/) that he's been using Zarr already in his [Local Climate Zone](https://ancazugo.github.io/posts/2025-09-14-weekly-notes.html)
experiments.

## More convenient APIs for sampling

The other feature that's gone into the new library are higher level APIs to use
the embeddings. A very common usecase when building downstream tasks is to have
to sample embeddings for a set of labels, which are then used to train
classifiers. It's quite cumbersome to select these out by hand, particularly with
larger regions of interest.

There is now a new `sample_embeddings_at_points` library call
that extracts embedding values at arbitrary lon/lat coordinates and
groups points by tile for efficient batch processing. You can see this in action
in the new [geotessera-examples](https://github.com/ucam-eo/geotessera-examples)
repository where we're starting to put sample code for downstream tasks that
use geotessera.

The first one here is the code to detect solar panels worldwide, as demoed by
[Sadiq Jaffer](https://toao.com) in his recent [PROPL 25 talk](https://anil.recoil.org/notes/icfp25-propl).  Browse though the
[source code](https://github.com/ucam-eo/geotessera-examples/tree/main/solarpanel) and
give it a spin. The results can visualised using QGIS, and I'm working on a notebook
interface for this later.

<a href="/images/tessera-f1.webp"> <figure class="image-center"><img src="/images/tessera-f1.webp" alt="Parametric UMAP false colour visualisation of TESSERA embeddings for Cambridgeshire" title="Parametric UMAP false colour visualisation of TESSERA embeddings for Cambridgeshire" loading="lazy" srcset="/images/tessera-f1.768.webp 768w, /images/tessera-f1.640.webp 640w, /images/tessera-f1.480.webp 480w, /images/tessera-f1.320.webp 320w, /images/tessera-f1.1600.webp 1600w, /images/tessera-f1.1440.webp 1440w, /images/tessera-f1.1280.webp 1280w, /images/tessera-f1.1024.webp 1024w"><figcaption>Parametric UMAP false colour visualisation of TESSERA embeddings for Cambridgeshire</figcaption></figure> </a>

The second one is the [parametric UMAP script](https://github.com/ucam-eo/geotessera-examples/tree/main/pumap-viz) to do false colour visualizations of
any ROI. You can see a high-res "arty version" that has been contour traced using a pomap algorithm which [renders as a high-res SVG](http://www.cl.cam.ac.uk/~avsm2/cb2-pumap.svg) as well.

## Keep the embeddings requests coming\!

That's it for now with GeoTessera updates. Enjoy the new releases, and if you have any requests for embeddings please get them in [our queue](https://github.com/ucam-eo/geotessera/issues).

[Mark Elvers](https://www.tunbury.org/) is currently syncing our embeddings to [Scaleway](https://scaleway.com) via a [Ceph cluster we setup](https://www.tunbury.org/2025/11/03/cepfs-partition-setup/) for this purpose, and I'll be announcing even more federation options for TESSERA over the coming weeks. We're _really_ grateful to the outpouring of offers of help with our computational needs from our users and cloudy friends! And we also know that TESSERA doesn't have a proper homepage yet; we'll work on this right after the immediate embeddings bottleneck is handled for our current users (contributions from interested web designers are very welcome here).

[^1]: There are two numpy files in there because we store the quantized embeddings to save space. To dequantize them, the scales are multiplied to each of the bands in the main file. Geotessera takes [care of this](https://geotessera.readthedocs.io/en/latest/architecture.html#quantization-system) for you.
Synopsis: GeoTessera 0.7 switches to GeoParquet manifests for faster initialisation, adds Zarr tensor storage support, and provides new sampling APIs for building downstream tasks like solar panel detection.
Words: 1228
DOI: 10.59350/nagwp-tnw89

## Related

- [Celebrating a year of Tessera embeddings and releasing GeoTessera 0.10](https://anil.recoil.org/notes/geotessera-a-year-on) (note, 2026-08-27)
- [TESSERA: Temporal Embeddings of Surface Spectra for Earth Representation and Analysis](https://anil.recoil.org/papers/2025-tessera) (paper, 2026-06-01)
- [Streaming millions of TESSERA tiles over HTTP with Zarr v3](https://anil.recoil.org/notes/tessera-zarr-v3-layout) (note, 2026-03-14)
- [Earth Observation on a Budget: Finding Solar Farms with a 42k-Parameter Model](https://www.toao.com/blog/earth-observation-budget-solar-farms-tiny-model) (feed, 2026-01-14)
- [2025 Advent of Agentic Humps: Building a useful O(x)Caml library every day](https://anil.recoil.org/notes/aoah-2025) (note, 2025-12-26)
- [Publish, Review, Curate to upend scholarly publishing](https://anil.recoil.org/notes/coar-prc) (note, 2025-12-08)
- [Foundational AI for Ecosystem Resilience workshop](https://anil.recoil.org/notes/foundational-ecosystem-workshop) (note, 2025-12-03)
- [Programming for the Planet at ICFP/SPLASH 2025](https://anil.recoil.org/notes/icfp25-propl) (note, 2025-10-05)
- [AI-assisted Living Evidence Databases for Conservation Science](https://anil.recoil.org/papers/2025-evidence-tap) (paper, 2025-10-01)
- [A FAIR Case for a Live Computational Commons](https://anil.recoil.org/papers/2025-fairground) (paper, 2025-10-01)
- [GeoTessera Python library released for geospatial embeddings](https://anil.recoil.org/notes/geotessera-python) (note, 2025-08-31)
- [BBC interview about new Cambridge supercomputer](https://anil.recoil.org/videos/48a7ab10-3f49-4978-a00f-c26b64c2cae7) (video, 2023-11-02)
- [Remote Sensing of Nature](https://anil.recoil.org/projects/rsn) (project, 2023-01-01)

---
Canonical: https://anil.recoil.org/notes/geotessera-python-0-7
Type: note
License: CC BY 4.0 <https://creativecommons.org/licenses/by/4.0/>
Tags: tessera, spatial, ai, satellite
