Skip to content

Commit

Permalink
remove cache layer (#1019)
Browse files Browse the repository at this point in the history
* remove cache layer

* Update src/titiler/xarray/README.md

Co-authored-by: Aimee Barciauskas <[email protected]>

* add tile example

---------

Co-authored-by: Aimee Barciauskas <[email protected]>
  • Loading branch information
vincentsarago and abarciauskas-bgse authored Nov 5, 2024
1 parent f50b400 commit df7bdf6
Show file tree
Hide file tree
Showing 11 changed files with 355 additions and 133 deletions.
5 changes: 5 additions & 0 deletions docs/mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,11 @@ nav:
- errors: api/titiler/mosaic/errors.md
- models:
- responses: api/titiler/mosaic/models/responses.md
- titiler.xarray:
- io: api/titiler/xarray/io.md
- dependencies: api/titiler/xarray/dependencies.md
- extensions: api/titiler/xarray/extensions.md
- factory: api/titiler/xarray/factory.md

- Deployment:
- Amazon Web Services:
Expand Down
184 changes: 125 additions & 59 deletions docs/src/advanced/endpoints_factories.md

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions docs/src/api/titiler/xarray/dependencies.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
::: titiler.xarray.dependencies
1 change: 1 addition & 0 deletions docs/src/api/titiler/xarray/extensions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
::: titiler.xarray.extensions
1 change: 1 addition & 0 deletions docs/src/api/titiler/xarray/factory.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
::: titiler.xarray.factory
1 change: 1 addition & 0 deletions docs/src/api/titiler/xarray/io.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
::: titiler.xarray.io
60 changes: 51 additions & 9 deletions src/titiler/xarray/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,29 +8,43 @@ Adds support for Xarray Dataset (NetCDF/Zarr) in Titiler.
$ python -m pip install -U pip

# From Pypi
$ python -m pip install titiler.xarray
$ python -m pip install "titiler.xarray[all]"

# Or from sources
$ git clone https://github.com/developmentseed/titiler.git
$ cd titiler && python -m pip install -e src/titiler/core -e src/titiler/xarray
$ cd titiler && python -m pip install -e src/titiler/core -e "src/titiler/xarray[all]"
```

## How To

```python
from fastapi import FastAPI

from titiler.xarray.extensions import VariablesExtension
from titiler.xarray.factory import TilerFactory

# Create a FastAPI application
app = FastAPI(
description="A lightweight Cloud Optimized GeoTIFF tile server",
)
openapi_url="/api",
docs_url="/api.html",
description="""Xarray based tiles server for MultiDimensional dataset (Zarr/NetCDF).
---
**Documentation**: <a href="https://developmentseed.org/titiler/" target="_blank">https://developmentseed.org/titiler/</a>
# Create a set of MosaicJSON endpoints
endpoint = TilerFactory()
**Source Code**: <a href="https://github.com/developmentseed/titiler" target="_blank">https://github.com/developmentseed/titiler</a>
# Register the Mosaic endpoints to the application
app.include_router(endpoint.router)
---
""",
)

md = TilerFactory(
router_prefix="/md",
extensions=[
VariablesExtension(),
],
)
app.include_router(md.router, prefix="/md", tags=["Multi Dimensional"])
```

## Package structure
Expand All @@ -41,6 +55,34 @@ titiler/
├── tests/ - Tests suite
└── titiler/xarray/ - `xarray` namespace package
├── dependencies.py - titiler-xarray dependencies
├── extentions.py - titiler-xarray extensions
├── io.py - titiler-xarray Readers
└── factory.py - endpoints factory
```

## Custom Dataset Opener

A default Dataset IO is provided within `titiler.xarray.Reader` class but will require optional dependencies (fsspec, zarr, h5netcdf, ...) to be installed with `python -m pip install "titiler.xarray[all]"`.
Dependencies are optional so the entire package size can be optimized to only include dependencies required by a given application.

```python
from titiler.xarray.io import Reader

import xarray
import h5netcdf # noqa

with Reader(
"tests/fixtures/dataset_2d.nc",
"dataset",
opener=xarray.open_dataset,
) as src:
print(src.ds)

>>> <xarray.Dataset> Size: 16MB
Dimensions: (x: 2000, y: 1000)
Coordinates:
* x (x) float64 16kB -170.0 -169.8 -169.7 -169.5 ... 169.5 169.7 169.8
* y (y) float64 8kB -80.0 -79.84 -79.68 -79.52 ... 79.52 79.68 79.84
Data variables:
dataset (y, x) float64 16MB ...
```
168 changes: 168 additions & 0 deletions src/titiler/xarray/notebooks/xarray_dataset_cache.ipynb

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions src/titiler/xarray/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ classifiers = [
dynamic = ["version"]
dependencies = [
"titiler.core==0.19.0.dev",
"rio-tiler>=7.2,<8.0",
"xarray",
"rioxarray",
]
Expand Down
30 changes: 1 addition & 29 deletions src/titiler/xarray/titiler/xarray/io.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
"""titiler.xarray.io"""

import pickle
from typing import Any, Callable, Dict, List, Optional, Protocol
from typing import Any, Callable, Dict, List, Optional
from urllib.parse import urlparse

import attr
Expand All @@ -12,36 +11,16 @@
from rio_tiler.io.xarray import XarrayReader


class CacheClient(Protocol):
"""CacheClient Protocol."""

def get(self, key: str) -> bytes:
"""Get key."""
...

def set(self, key: str, body: bytes) -> None:
"""Set key."""
...


def xarray_open_dataset( # noqa: C901
src_path: str,
group: Optional[Any] = None,
decode_times: Optional[bool] = True,
cache_client: Optional[CacheClient] = None,
) -> xarray.Dataset:
"""Open dataset."""
import aiohttp # noqa
import fsspec # noqa
import s3fs # noqa

# Generate cache key and attempt to fetch the dataset from cache
if cache_client:
cache_key = f"{src_path}_{group}" if group is not None else src_path
data_bytes = cache_client.get(cache_key)
if data_bytes:
return pickle.loads(data_bytes)

parsed = urlparse(src_path)
protocol = parsed.scheme or "file"
if protocol not in ["s3", "https", "http", "file"]:
Expand Down Expand Up @@ -102,11 +81,6 @@ def xarray_open_dataset( # noqa: C901

ds = xarray.open_zarr(file_handler, **xr_open_args)

if cache_client:
# Serialize the dataset to bytes using pickle
data_bytes = pickle.dumps(ds)
cache_client.set(cache_key, data_bytes)

return ds


Expand Down Expand Up @@ -219,7 +193,6 @@ class Reader(XarrayReader):

group: Optional[Any] = attr.ib(default=None)
decode_times: bool = attr.ib(default=False)
cache_client: Optional[CacheClient] = attr.ib(default=None)

# xarray.DataArray options
datetime: Optional[str] = attr.ib(default=None)
Expand All @@ -238,7 +211,6 @@ def __attrs_post_init__(self):
self.src_path,
group=self.group,
decode_times=self.decode_times,
cache_client=self.cache_client,
)

self.input = get_variable(
Expand Down
36 changes: 0 additions & 36 deletions src/titiler/xarray/titiler/xarray/main.py

This file was deleted.

0 comments on commit df7bdf6

Please sign in to comment.