Skip to main content

pySDP

PyPI Python versions CI Docs License: MIT

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.DatetimeIndex across Daily / Monthly / Yearly products. ds.sel(time="2019"), .resample, .groupby("time.year") all work.
  • 🚀 Dask-ready — lazy chunked reads via chunks="auto" (requires pysdp[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

Function Purpose
get_catalog() Discover SDP datasets (packaged snapshot, live, or STAC)
get_metadata() Per-dataset XML metadata as dict or lxml Element
get_dates() Available dates for a time-series product (regular or irregular)
browse() Visual thumbnail-grid catalog browser for Jupyter
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
report_issue() Open a prefilled GitHub Issue Form for a data-quality issue
known_issues() List open data-quality issues (cached, tidy DataFrame)

get_catalog() and browse() accept include_deprecated=True to surface deprecated products (which carry a NewVersionID column pointing at the replacement) and with_issue_counts=True to attach the OpenIssues count per dataset.

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_dates() pysdp.get_dates()
sdp_browse() pysdp.browse()
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()
sdp_report_issue() pysdp.report_issue()
sdp_known_issues() pysdp.known_issues()
SpatRaster xarray.Dataset
SpatVector / sf::sf geopandas.GeoDataFrame

Status & roadmap

v0.6.0 (current): tracks rSDP v0.6. Catalog discovery, lazy raster access, point/polygon extraction, bulk download, weekly drone imagery, irregular time-series (get_dates()), visual catalog browser (browse()), dataset version-control (deprecation + NewVersionID), and the data-products issue tracker (report_issue() / known_issues()). Tests and CI cover 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

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.

Metadata

Release files for pysdp 0.7.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pysdp 0.7.0
File Size Uploaded
pysdp-0.7.0.tar.gz 103.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pysdp 0.7.0
File Interpreter ABI Platform
pysdp-0.7.0-py3-none-any.whl Python 3 none any Details

Total release size: 168.3 kB

Release files / pysdp-0.7.0.tar.gz

Download URL pysdp-0.7.0.tar.gz
Size 103.8 kB
Tags Source
SHA-256 checksum
How to use checksums
ea1f7b60c34b006334bf3908321b58688bde5f3450730834a5ddc3f9c90a0f9f
BLAKE2b-256 checksum
How to use checksums
7607320a8f1f593ac39904d1762b5230504bd67febfb94efd60a175eb0779a82
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 17, 2026.

Transparency log

Release files / pysdp-0.7.0-py3-none-any.whl

Download URL pysdp-0.7.0-py3-none-any.whl
Size 64.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1df6ff00257eef87d1be706e6543804f0c0ea8e8deda22b4a4f6382d25703f66
BLAKE2b-256 checksum
How to use checksums
87e952ac9e066bdca7c27b55aa49311cb74f251c01af5d405d0d5e41ca516bdf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 17, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.7.0 This release

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.2.0

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page