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.rasterviapkgutil.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.
Metadata
Release files for vibespatial-raster 0.1.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| vibespatial_raster-0.1.7.tar.gz | 387.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| vibespatial_raster-0.1.7-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 532.9 kB
Release files / vibespatial_raster-0.1.7.tar.gz
| Download URL | vibespatial_raster-0.1.7.tar.gz |
|---|---|
| Size | 387.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dd38244785e32feb2c8e6c2c65236399c9c1d3feaaafcde8bed278ef6136520c
|
|
BLAKE2b-256 checksum How to use checksums |
2c783ac4cbcda5dac41af2d953f296a45245b9a3934de96b5a5cd87a3a7cea7d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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 Apr 1, 2026.
Transparency logRelease files / vibespatial_raster-0.1.7-py3-none-any.whl
| Download URL | vibespatial_raster-0.1.7-py3-none-any.whl |
|---|---|
| Size | 145.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c62430fdd95b2723b83c87b23f5ece561307bca68c85d3b112c91668b686d7bb
|
|
BLAKE2b-256 checksum How to use checksums |
fa615c9d801aaad2d6a14d355a5f7fc013e4a804dec090757dc0325668796066
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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 Apr 1, 2026.
Transparency log