Cloud-optimized GeoTIFF ... Parallel I/O
Yet another attempt at creating a GeoTIFF reader, in Rust, with Python bindings.
cargo add --git https://github.com/weiji14/cog3pio.git
pip install git+https://github.com/weiji14/cog3pio.git
Tip
The API for this crate/library is still unstable and subject to change, so you may want to pin to a specific git commit using either:
cargo add --git https://github.com/weiji14/cog3pio.git --rev <sha>
pip install git+https://github.com/weiji14/cog3pio.git@<sha>
where <sha>
is a commit hashsum obtained from https://github.com/weiji14/cog3pio/commits/main
use std::io::Cursor;
use bytes::Bytes;
use cog3pio::io::geotiff::read_geotiff;
use ndarray::Array2;
use object_store::path::Path;
use object_store::{parse_url, GetResult, ObjectStore};
use tokio;
use url::Url;
#[tokio::main]
async fn main() {
let cog_url: &str =
"https://github.com/cogeotiff/rio-tiler/raw/6.4.0/tests/fixtures/cog_nodata_nan.tif";
let tif_url: Url = Url::parse(cog_url).unwrap();
let (store, location): (Box<dyn ObjectStore>, Path) = parse_url(&tif_url).unwrap();
let stream: Cursor<Bytes> = {
let result: GetResult = store.get(&location).await.unwrap();
let bytes: Bytes = result.bytes().await.unwrap();
Cursor::new(bytes)
};
let arr: Array2<f32> = read_geotiff(stream).unwrap();
assert_eq!(arr.dim(), (549, 549));
assert_eq!(arr[[500, 500]], 0.13482364);
}
import numpy as np
from cog3pio import read_geotiff
array: np.ndarray = read_geotiff(
path="https://github.com/cogeotiff/rio-tiler/raw/6.4.0/tests/fixtures/cog_nodata_nan.tif"
)
assert array.shape == (549, 549)
assert array.dtype == "float32"
Note
Currently, this crate/library only supports reading single-band float32 GeoTIFF files, i.e. multi-band and other dtypes (e.g. uint16) don't work yet. See roadmap below on future plans.
Short term (Q1 2024):
- Implement single-band GeoTIFF reader to
ndarray
- Multi-band reader (relying on
image-tiff
) - Read from remote storage (using
object-store
)
Medium term (Q2 2024):
- Integration with
xarray
as aBackendEntrypoint
- Parallel reader (TBD on multi-threaded or asynchronous)
- Direct-to-GPU loading