Native Python interface for the RMBL Spatial Data Platform
Project description
pySDP
Native Python interface for the RMBL Spatial Data Platform — curated, high-resolution geospatial datasets covering Western Colorado (USA) around Rocky Mountain Biological Laboratory.
Lazy cloud access. Standard scientific-Python types. Feature-parity port of the rSDP R package.
- 🌐 No downloads needed — open 1 GB COGs from S3 and extract point samples without a local copy. GDAL VSICURL handles the range reads.
- 🔄 Composable return types —
xarray.Dataset,geopandas.GeoDataFrame,pandas.DataFrame. No custom classes to learn; everything plugs into the PyData ecosystem. - 📅 Time-series aware — uniform
pandas.DatetimeIndexacross Daily / Monthly / Yearly products.ds.sel(time="2019"),.resample,.groupby("time.year")all work. - 🚀 Dask-ready — lazy chunked reads via
chunks="auto"(requirespysdp[dask]) let you scale to stacks that don't fit in memory.
📘 Full documentation: https://rmbl-sdp.github.io/pySDP/ 📖 Getting started • User guides • API reference
Install
pip install pysdp # core: catalog, raster, extraction, download
pip install "pysdp[dask]" # + lazy chunked reads via Dask
pip install "pysdp[stac]" # + pystac-client + odc-stac for STAC
pip install "pysdp[hub]" # + dask-gateway for JupyterHub clusters
pip install "pysdp[all]" # everything
Requires Python 3.11+. All core deps (rasterio, rioxarray, xarray, geopandas, pystac, scipy, ...) have wheels on PyPI for Linux, macOS (Intel + Apple Silicon), and Windows — no system GDAL install needed.
30-second tour
import pysdp
import geopandas as gpd
# Discover what's in the catalog
cat = pysdp.get_catalog(domains=["UG"], types=["Vegetation"])
cat[["CatalogID", "Product", "Resolution"]].head()
# Open a raster lazily — the 1 GB landcover COG stays on S3
landcover = pysdp.open_raster("R3D018")
# Sample at field sites (auto-reprojects to the raster's CRS)
sites = gpd.GeoDataFrame(
{"site": ["Roaring Judy", "Gothic", "Galena Lake"]},
geometry=gpd.points_from_xy(
[-106.853186, -106.988934, -107.072569],
[38.716995, 38.958446, 39.021644],
),
crs="EPSG:4326",
)
samples = pysdp.extract_points(landcover, sites)
samples
See the user guides for deeper walkthroughs — catalog discovery, raster wrangling, field-site sampling, and making publication-quality maps.
Public API
Seven functions cover the whole surface:
| Function | Purpose |
|---|---|
get_catalog() |
Discover SDP datasets (packaged snapshot, live, or STAC) |
get_metadata() |
Per-dataset XML metadata as dict or lxml Element |
open_raster() |
Lazy xarray.Dataset from an SDP cloud COG |
open_stack() |
Multi-product lazy stack (shared grid) |
extract_points() |
Sample values at point geometries |
extract_polygons() |
Zonal summaries over polygon geometries |
download() |
Bulk-fetch COGs to local disk |
Full signatures and examples: https://rmbl-sdp.github.io/pySDP/api/.
Coming from rSDP?
pySDP is a direct port with the same catalog, same vocabulary, and feature parity. The rSDP → pySDP mapping in SPEC §5 is the authoritative reference; the short version:
| rSDP (R) | pySDP (Python) |
|---|---|
sdp_get_catalog() |
pysdp.get_catalog() |
sdp_get_metadata() |
pysdp.get_metadata() |
sdp_get_raster() |
pysdp.open_raster() / pysdp.open_stack() |
sdp_extract_data(points) |
pysdp.extract_points() |
sdp_extract_data(polygons) |
pysdp.extract_polygons() |
download_data() |
pysdp.download() |
SpatRaster |
xarray.Dataset |
SpatVector / sf::sf |
geopandas.GeoDataFrame |
Status & roadmap
v0.1 (current): feature-complete port of rSDP v0.2. Catalog discovery, metadata, lazy raster access, point/polygon extraction, bulk download — all with tests and CI across Python 3.11 / 3.12 / 3.13 × Linux / macOS / Windows.
Upcoming (see ROADMAP.md for details):
- Phase 7 — JupyterHub + Dask Gateway integration (
pysdp.hub), GDAL cloud-tuning defaults - Phase 8a — Distributed extraction partition helpers + at-scale recipes
- Phase 8b — Polygon zonal stats + benchmark harness
Project documents
SPEC.md— v0.1 design specification (API, dependencies, phased plan)ROADMAP.md— post-v0.1 integrations (Hub, distributed extraction)CHANGELOG.md— release historydocs/contributing.md— development setup + PR workflow
License
MIT — see LICENSE.
Citation
pySDP is part of the infrastructure around the RMBL Spatial Data Platform. If it supports your research, please cite the SDP (citation guidance at https://www.rmbl.org/scientists/resources/spatial-data-platform/). A formal citation for pySDP itself will be added at the 0.1.0 stable release.
Acknowledgements
pySDP is developed by Ian Breckheimer and collaborators at Rocky Mountain Biological Laboratory. Built on the shoulders of giants: xarray, rioxarray, rasterio, geopandas, pystac, xvec, and odc-stac.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pysdp-0.1.1.tar.gz.
File metadata
- Download URL: pysdp-0.1.1.tar.gz
- Upload date:
- Size: 79.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6ec9a487d6a85932bf7ab52280b78038fa50474a68a6c81cbc108e6d7d230fce
|
|
| MD5 |
1ae8cbc3d1e8d468965947b057b393ac
|
|
| BLAKE2b-256 |
637b78a3775452e09c589c49d53ca3056dc6313e956d9208eacc4220356e2290
|
Provenance
The following attestation bundles were made for pysdp-0.1.1.tar.gz:
Publisher:
release.yml on rmbl-sdp/pySDP
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pysdp-0.1.1.tar.gz -
Subject digest:
6ec9a487d6a85932bf7ab52280b78038fa50474a68a6c81cbc108e6d7d230fce - Sigstore transparency entry: 1342861509
- Sigstore integration time:
-
Permalink:
rmbl-sdp/pySDP@4379d3c7e5e4d81595b813c323422e706dfc7c19 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/rmbl-sdp
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@4379d3c7e5e4d81595b813c323422e706dfc7c19 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pysdp-0.1.1-py3-none-any.whl.
File metadata
- Download URL: pysdp-0.1.1-py3-none-any.whl
- Upload date:
- Size: 46.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0e6a4b1a399d9ac1c6e85e8ff99b52cbdc998010834838afb50a4813cfe4843d
|
|
| MD5 |
7d935d8cae2235af937fae8f924f86f9
|
|
| BLAKE2b-256 |
cc9d24d7ba85fc4bf5c527919f2d59d504f1554c41e996bedf041be9c7d9b3d1
|
Provenance
The following attestation bundles were made for pysdp-0.1.1-py3-none-any.whl:
Publisher:
release.yml on rmbl-sdp/pySDP
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pysdp-0.1.1-py3-none-any.whl -
Subject digest:
0e6a4b1a399d9ac1c6e85e8ff99b52cbdc998010834838afb50a4813cfe4843d - Sigstore transparency entry: 1342861561
- Sigstore integration time:
-
Permalink:
rmbl-sdp/pySDP@4379d3c7e5e4d81595b813c323422e706dfc7c19 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/rmbl-sdp
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@4379d3c7e5e4d81595b813c323422e706dfc7c19 -
Trigger Event:
push
-
Statement type: