GPU-accelerated coordinate projection library
Project description
vibeProj
GPU-accelerated coordinate projection library. Extracted from RAPIDS cuProj, re-engineered as a pure Python + CuPy package, and expanded from 1 to 24 projections — each with a fused NVRTC kernel that runs the full transform pipeline in a single GPU kernel launch.
[!WARNING] vibeProj 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!
Performance
On an RTX 4090 vs i9-13900k, 1M coordinates: (Note: datacenter GPUs will see far higher speedups due to better double precision performance)
| Projection | GPU | vs CPU |
|---|---|---|
| Transverse Mercator / UTM | 0.49 ms | 278x |
| Lambert Conformal Conic | 0.53 ms | 96x |
| Albers Equal Area | 0.27 ms | 141x |
| Web Mercator | 0.15 ms | 123x |
| Equal Earth | 0.43 ms | 144x |
| Plate Carrée | 0.04 ms | 311x |
| Oblique Mercator (Hotine) | 0.76 ms | 115x |
| Krovak | 2.08 ms | 173x |
All 24 projections run in under 3 ms at 1M coordinates. See full benchmark in the repo.
Supported Projections
| Projection | Internal Name | EPSG Examples |
|---|---|---|
| Transverse Mercator / UTM | tmerc |
32601–32760, 27700 |
| Web Mercator | webmerc |
3857 |
| Mercator (ellipsoidal) | merc |
3395 |
| Lambert Conformal Conic | lcc |
2154 |
| Albers Equal Area | aea |
5070 |
| Polar Stereographic | stere |
3031, 3413 |
| Lambert Azimuthal Equal Area | laea |
3035 |
| Oblique Stereographic | sterea |
28992 |
| Plate Carrée | eqc |
4087 |
| Sinusoidal | sinu |
— |
| Equal Earth | eqearth |
8857 |
| Cylindrical Equal Area | cea |
6933 |
| Orthographic | ortho |
— |
| Gnomonic | gnom |
— |
| Mollweide | moll |
— |
| Robinson | robin |
— |
| Winkel Tripel | wintri |
— |
| Natural Earth | natearth |
— |
| Azimuthal Equidistant | aeqd |
— |
| Geostationary Satellite | geos |
— |
| Oblique Mercator (Hotine) | omerc |
3375 |
| Krovak | krovak |
5514 |
| Eckert IV | eck4 |
— |
| Eckert VI | eck6 |
— |
Install
pip install vibeproj # CPU-only (NumPy fallback)
pip install vibeproj[cu12] # CUDA 12
pip install vibeproj[cu13] # CUDA 13
For development:
uv sync # CPU-only
uv sync --extra cu12 # CUDA 12
uv sync --extra cu13 # CUDA 13
Usage
from vibeproj import Transformer
# Default: always_xy=True — (lon, lat) order, matches shapely/geopandas
t = Transformer.from_crs("EPSG:4326", "EPSG:32631")
x, y = t.transform(2.0, 49.0) # (lon, lat) in, (easting, northing) out
# always_xy=False: native CRS axis order (matches pyproj default)
t = Transformer.from_crs("EPSG:4326", "EPSG:32631", always_xy=False)
x, y = t.transform(49.0, 2.0) # (lat, lon) in, (easting, northing) out
Cross-datum transforms (Helmert)
# Cross-datum: Helmert 7/15-parameter shift applied automatically
t = Transformer.from_crs("EPSG:4326", "EPSG:27700") # WGS84 → OSGB36
x, y = t.transform(-0.1278, 51.5074)
# With ellipsoidal height — z is transformed through the ECEF intermediate
x, y, z = t.transform(-0.1278, 51.5074, z=45.0)
# Same-datum: z passes through unchanged, zero overhead
t = Transformer.from_crs("EPSG:4326", "EPSG:32631")
x, y, z = t.transform(2.0, 49.0, z=45.0) # z == 45.0
Grid-based datum shifts (NTv2, NADCON) are not yet supported. When the best available transformation is grid-only, vibeProj warns and proceeds without a datum shift — use pyproj directly for grid-based accuracy.
Integration with CPU libraries
vibeProj works with popular geospatial Python libraries. GPU acceleration is automatic when CuPy is installed; otherwise it falls back to NumPy transparently.
- GeoPandas — bulk GeoDataFrame reprojection
- Rasterio — GPU-accelerated raster coordinate grids
- Shapely — geometry transforms via
shapely.transform()
vibeSpatial Integration (zero-copy GPU)
# Pre-allocated output, no intermediate allocations, stays on GPU
t = Transformer.from_crs(src_crs, dst_crs, always_xy=True)
new_x = cp.empty_like(buf.x)
new_y = cp.empty_like(buf.y)
t.transform_buffers(buf.x, buf.y, out_x=new_x, out_y=new_y)
# 3D: z is transformed through Helmert when crossing datums
new_z = cp.empty_like(buf.z)
t.transform_buffers(buf.x, buf.y, buf.z, out_x=new_x, out_y=new_y, out_z=new_z)
transform_buffers() accepts pre-allocated CuPy output arrays, writes results directly into them, and returns the same objects. No host round-trip, no intermediate allocation. Designed for vibeSpatial's OwnedGeometryArray coordinate buffers.
Architecture
- Pure Python + CuPy — no compiled extensions, no CMake
- Fused NVRTC kernels — each projection's full pipeline (axis swap, deg/rad, central meridian, projection math, scale/offset) runs in a single CUDA kernel launch via CuPy
RawKernel - NumPy fallback — all projections work on CPU when CuPy is unavailable
- Helmert datum shifts — 7/15-parameter (time-dependent) datum transformation with 3D ellipsoidal height support, runs on its own GPU kernel
- pyproj for CRS metadata — EPSG codes resolved via pyproj, transform math is ours
- fp64 I/O — input/output arrays always double precision (ADR-0002 compliant)
- Auto GPU detection — queries
SingleToDoublePrecisionPerfRatioto classify consumer vs datacenter GPU
Test
uv run pytest # all tests (251 total)
uv run pytest tests/test_fused_kernels.py # GPU kernel tests (requires CuPy)
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 vibeproj-0.1.8.tar.gz.
File metadata
- Download URL: vibeproj-0.1.8.tar.gz
- Upload date:
- Size: 172.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5c22b7c8d777abac98df37afa1e97b284f4d8af7661318f7dac1547c562e87a9
|
|
| MD5 |
1b0363f96c6969d3d8d31f2c8f2b2865
|
|
| BLAKE2b-256 |
3ff79670a394b3b4afc2563b9f72f48e0d90dd743b118765382a80c7633066cf
|
Provenance
The following attestation bundles were made for vibeproj-0.1.8.tar.gz:
Publisher:
release.yml on jarmak-personal/vibeProj
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vibeproj-0.1.8.tar.gz -
Subject digest:
5c22b7c8d777abac98df37afa1e97b284f4d8af7661318f7dac1547c562e87a9 - Sigstore transparency entry: 1183193361
- Sigstore integration time:
-
Permalink:
jarmak-personal/vibeProj@dc59e1900547ec39fff7fa501489852fe4555de0 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/jarmak-personal
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@dc59e1900547ec39fff7fa501489852fe4555de0 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file vibeproj-0.1.8-py3-none-any.whl.
File metadata
- Download URL: vibeproj-0.1.8-py3-none-any.whl
- Upload date:
- Size: 86.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1f156e98eb1a5b3ea11fe47c2f07fbce6d19954aa9d483dbb84d2136c3a4ecf7
|
|
| MD5 |
7d2c39181afaa798e28468476b75a5cf
|
|
| BLAKE2b-256 |
689ea2e3f10f3366798f8419e1706b4cb9e4bde607b6d6dab3d2294d12c944b2
|
Provenance
The following attestation bundles were made for vibeproj-0.1.8-py3-none-any.whl:
Publisher:
release.yml on jarmak-personal/vibeProj
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vibeproj-0.1.8-py3-none-any.whl -
Subject digest:
1f156e98eb1a5b3ea11fe47c2f07fbce6d19954aa9d483dbb84d2136c3a4ecf7 - Sigstore transparency entry: 1183193393
- Sigstore integration time:
-
Permalink:
jarmak-personal/vibeProj@dc59e1900547ec39fff7fa501489852fe4555de0 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/jarmak-personal
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@dc59e1900547ec39fff7fa501489852fe4555de0 -
Trigger Event:
workflow_dispatch
-
Statement type: