The EEORasterDataset Abstraction
At the heart of Easy-EO is the eeo.core.EEORasterDataset class.
It represents a raster dataset as a chainable, in-memory object
that provides a high-level interface for geospatial raster processing,
analysis, and visualization.
Motivation
Geospatial libraries such as Rasterio expose powerful but low-level interfaces. Common workflows often require:
Explicit file handling
Manual reprojection and alignment
Careful tracking of metadata
Repeated reads and writes to disk
Easy-EO introduces a dataset-centric abstraction that:
Keeps raster data in memory by default
Returns new datasets from processing operations
Enables expressive, readable, chainable workflows
Defers disk I/O until explicitly requested
EEORasterDataset
The EEORasterDataset class is the fundamental object
used throughout Easy-EO. All raster operations operate on or return
instances of this class.
Internally, an EEORasterDataset wraps a raster backend (typically
Rasterio), but exposes only a curated, stable, high-level API.
Creating a Dataset
Datasets are typically created using the load_raster() helper:
from eeo import load_raster
ds = load_raster("image.tif")
Datasets may also be created from NumPy arrays:
from eeo import load_array
import numpy as np
array = np.random.rand(512, 512)
ds = load_array(array, crs=4326)
Note
Some operations (e.g., resampling, reprojection) require a Rasterio backend.
These operations must be performed on Rasterio-supported files loaded with
load_raster(), not on arrays loaded with load_array().
Dataset Metadata
Common raster metadata is exposed through explicit accessor methods:
get_crs()– Coordinate reference systemget_transform()– Affine transformget_shape()– Raster shape (height, width)get_bounds()– Spatial bounding boxget_width()– Raster widthget_height()– Raster heightget_count()– Number of bandsget_metadata()– Raster metadata dictionary
These methods intentionally mirror Rasterio concepts while keeping the public API stable and explicit.
Reading Raster Data
Raster values can be accessed as NumPy arrays using:
read()Read the full raster. Intended for single-band datasets.
get_band(idx)Read a single band (1-based indexing).
Example:
band1 = ds.get_band(1)
For multi-band datasets, get_band() is preferred to avoid loading
unnecessary data into memory.
Chainable Operations
Most processing functions in Easy-EO are chainable.
Operations such as clipping, algebra, normalization, and resampling
return new EEORasterDataset instances, enabling fluent workflows:
result = ds.clip_raster_with_bbox((0, 0, 1000, 1000))
.normalize_percentile(lower_percentile=2, upper_percentile=98)
.standardize()
Internally, these operations are implemented as standalone functions and
bound dynamically to EEORasterDataset using decorators.
Terminal Operations
Some operations are terminal, meaning they do not return a dataset.
These include:
Visualization functions
Explicit saving to disk
Terminal operations are intended to appear at the end of a chain:
ds.normalize_min_max().plot_raster()
Saving and Persistence
To persist a dataset to disk, use:
save_raster(path, driver="GTiff")
Example:
ds.normalize_min_max().save_raster("output.tif")
Until this method is called, datasets typically remain in memory.
Resource Management
Because EEORasterDataset may wrap open file handles or in-memory
datasets, resources should be released explicitly when no longer needed:
ds.close()
A __del__ fallback exists,
but explicit cleanup is recommended in long-running workflows.
Accessing the Underlying Data
Easy-EO does not restrict access to underlying raster representations.
Advanced users may:
Retrieve underlying dataset as NumPy arrays using
.read()or.get_band()Retrieve underlying dataset as Rasterio datasets using
.ds
This allows advanced users perform specific analyses which are not yet implemented in easy-eo.
Warning
Directly modifying the underlying dataset may invalidate assumptions made by Easy-EO. If metadata or geometry must be changed, prefer using provided preprocessing operations such as reprojection or resampling.
Summary
EEORasterDatasetis the central abstraction in Easy-EOProcessing functions return datasets to enable chaining
Visualization and saving are terminal operations
Raster data remains in memory until explicitly persisted
Low-level access remains available for advanced users