Skip to main content

GPU-first raster processing for vibespatial

Project description

vibespatial-raster

GPU-first raster processing for vibeSpatial. Custom NVRTC kernels and CCCL primitives for every operation — algebra, focal, zonal stats, labeling, rasterize, polygonize — with CPU fallbacks via scipy and rasterio.

[!WARNING] vibeSpatial-Raster is very early in development. Operations may be unoptimized or have multiple Host/Device transfers causing reduced performance. File an issue if you hit a problem!

Operations

Category Operations GPU Backend
IO GeoTIFF, COG, JPEG2000 read/write nvImageCodec (zero-copy decode to device)
Algebra add, subtract, multiply, divide, apply, where, classify CuPy element-wise
Focal convolution, Gaussian filter, slope, aspect NVRTC shared-memory stencil kernels
Zonal count, sum, mean, min, max, std, median CCCL segmented reduce
Rasterize vector-to-raster (point-in-polygon) NVRTC per-pixel PIP kernel
Label connected components (4/8 connectivity) NVRTC union-find
Morphology erode, dilate, open, close, sieve NVRTC tiled kernels
Polygonize raster-to-vector (marching squares) NVRTC classify + emit edges

Install

pip install vibespatial-raster            # core (CPU-only, scipy fallback)
pip install vibespatial-raster[io]        # + rasterio for GeoTIFF/COG
pip install vibespatial-raster[cu12]      # + CUDA 12, CuPy, nvImageCodec
pip install vibespatial-raster[cu13]      # + CUDA 13, CuPy, nvImageCodec

For development:

uv sync --group dev

Usage

from vibespatial.raster import read_raster, raster_slope, zonal_stats

# Read a GeoTIFF (GPU-native decode when available, rasterio fallback)
raster = read_raster("elevation.tif")

# Terrain analysis — NVRTC stencil kernels on GPU
slope = raster_slope(raster)

# Per-zone statistics — CCCL segmented reduce on GPU
stats = zonal_stats(zones, slope, ["mean", "max", "std"])

Connected components + polygonize

from vibespatial.raster import label_connected_components, sieve_filter, polygonize_to_gdf

labels = label_connected_components(binary_raster, connectivity=8)
labels = sieve_filter(labels, min_size=50)
gdf = polygonize_to_gdf(labels)

Zero-copy GPU pipeline

OwnedRasterArray tracks HOST/DEVICE residency. Move data to GPU once, then all operations stay on device:

from vibespatial.raster import from_numpy, raster_add

a = from_numpy(data_a, affine=affine, crs="EPSG:4326")
b = from_numpy(data_b, affine=affine, crs="EPSG:4326")
a.move_to("DEVICE")
b.move_to("DEVICE")

result = raster_add(a, b)  # no host-device round-trip

GPU-native IO

When nvImageCodec is available, read_raster() decodes GeoTIFF and JPEG2000 directly to GPU memory — no host copy, no rasterio:

raster = read_raster("large_image.tif")  # → OwnedRasterArray(DEVICE)

Architecture

  • Namespace package — installs as vibespatial.raster via pkgutil.extend_path, independent release cadence from core
  • Zero-copy NVRTC kernels — no cuCIM, no CuPy ndimage; all GPU ops are custom CCCL/NVRTC
  • OwnedRasterArray — mirrors core's OwnedGeometryArray (HOST/DEVICE residency, diagnostic events, nodata mask)
  • Dual IO — HYBRID path (rasterio on CPU) + GPU_NATIVE path (nvImageCodec direct-to-device)
  • CPU fallback — scipy.ndimage, rasterio.features for every operation; tests validate GPU against CPU

Test

uv run pytest                              # all CPU tests
uv run pytest -m gpu                       # GPU kernel tests (requires CUDA)
uv run pytest tests/test_raster_algebra.py # specific module

License

Apache 2.0 — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

vibespatial_raster-0.1.6.tar.gz (300.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

vibespatial_raster-0.1.6-py3-none-any.whl (110.9 kB view details)

Uploaded Python 3

File details

Details for the file vibespatial_raster-0.1.6.tar.gz.

File metadata

  • Download URL: vibespatial_raster-0.1.6.tar.gz
  • Upload date:
  • Size: 300.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for vibespatial_raster-0.1.6.tar.gz
Algorithm Hash digest
SHA256 b67ba3d0eefd185413b7efcc86cc6c241102be185b158c5201f7a86807132aa0
MD5 6f29e28bc2603bd6134d0a72c1beeba0
BLAKE2b-256 c1de65b744db495cd97abbc32e9aabf75bd729206b43e90a359d8aca9e1b7812

See more details on using hashes here.

Provenance

The following attestation bundles were made for vibespatial_raster-0.1.6.tar.gz:

Publisher: release.yml on jarmak-personal/vibeSpatial-Raster

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vibespatial_raster-0.1.6-py3-none-any.whl.

File metadata

File hashes

Hashes for vibespatial_raster-0.1.6-py3-none-any.whl
Algorithm Hash digest
SHA256 0a4be8d68b9baf553d2364342565344fdd495b1a52caf55e8ff6ab0e911b293c
MD5 8a5ff03c6467bfa78cc71f078cbe6d1d
BLAKE2b-256 3f7967511a786bb104471a17c0215f85ff6f223a1970833c1d2334bdeb162fd5

See more details on using hashes here.

Provenance

The following attestation bundles were made for vibespatial_raster-0.1.6-py3-none-any.whl:

Publisher: release.yml on jarmak-personal/vibeSpatial-Raster

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page