Repository: rapidsai/cuspatial (language: python)

Issue:
[BUG]: possible performance regression in points_in_polygon()
### Version

24.08

### On which installation method(s) does this occur?

Conda

### Describe the issue

See the write-up at https://github.com/rapidsai/cuspatial/pull/1407#issuecomment-2234181801.

Since around July 12, 2024, the `nyc_taxi_years_correlation.ipynb` started taking several hours to complete (on v24.08, using 24.08 `cudf` and other RAPIDS nightlies). Prior to that, on the exact same hardware, it completed in under 8 minutes.

I was able to reproduce this interactively, on a machine with 8 V100s and CUDA 12.2.

I strongly suspect that this indicates a performance regression, maybe of the form *"some change(s) in `cudf` cause a `cuspatial` codepath that could previously execute on the GPU to fall back to the CPU"*, although I don't have profiling output to provide as evidence.

### Minimum reproducible example

From https://github.com/rapidsai/cuspatial/pull/1407#issuecomment-2234181801.

Download the input data.

```shell
if [ ! -f "tzones_lonlat.json" ]; then
    curl "https://data.cityofnewyork.us/api/geospatial/d3c5-ddgc?method=export&format=GeoJSON" -o tzones_lonlat.json;
else
    echo "tzones_lonlat.json found";
fi
if [ ! -f "taxi2016.csv" ]; then
    curl https://storage.googleapis.com/anaconda-public-data/nyc-taxi/csv/2016/yellow_tripdata_2016-01.csv -o taxi2016.csv;
else
    echo "taxi2016.csv found";
fi   
```

Then, in a Python 3.11 session (with v24.08 of cuspatial and all its RAPIDS dependencies).

```python
import cuspatial
import geopandas as gpd
import cudf
import numpy as np

taxi2016 = cudf.read_csv("taxi2016.csv")
tzones = gpd.GeoDataFrame.from_file('tzones_lonlat.json')
taxi_zones = cuspatial.from_geopandas(tzones).geometry
taxi_zone_rings = cuspatial.GeoSeries.from_polygons_xy(
    taxi_zones.polygons.xy,
    taxi_zones.polygons.ring_offset,
    taxi_zones.polygons.part_offset,
    cudf.Series(range(len(taxi_zones.polygons.part_offset)))
)

def make_geoseries_from_lonlat(lon, lat):
    lonlat = cudf.DataFrame({"lon": lon, "lat": lat}).interleave_columns()
    return cuspatial.GeoSeries.from_points_xy(lonlat)

pickup2016 = make_geoseries_from_lonlat(taxi2016['pickup_longitude'] , taxi2016['pickup_latitude'])
dropoff2016 = make_geoseries_from_lonlat(taxi2016['dropoff_longitude'] , taxi2016['dropoff_latitude'])

pip_iterations = list(np.arange(0, 263, 31))
pip_iterations.append(263)
print(pip_iterations)

taxi2016['PULocationID'] = 264
taxi2016['DOLocationID'] = 264

start = pip_iterations[0]
end = pip_iterations[1]

zone = taxi_zone_rings[start:end]

# find all pickups in that zone
pickups = cuspatial.point_in_polygon(pickup2016, zone)
print(pickups)
print("---")
dropoffs = cuspatial.point_in_polygon(dropoff2016, zone)
print(dropoffs)
```

That one combination of polygons completed successfully, but took 21 to complete. It's the 2 `points_in_polygon()` calls that took around 20 of those 21 minutes.

And in the notebook, 10 such combinations are processed.

https://github.com/rapidsai/cuspatial/blob/c8616c1534f2555423186096cce156e6fd104ef7/notebooks/nyc_taxi_years_correlation.ipynb#L168-L169

```text
[0, 31, 62, 93, 124, 155, 186, 217, 248, 263]
```

https://github.com/rapidsai/cuspatial/blob/c8616c1534f2555423186096cce156e6fd104ef7/notebooks/nyc_taxi_years_correlation.ipynb#L207-L209

So conservatively, it might take 3.5 hours for the notebook to finish in my setup. And that's making a LOT of assumptions.

### Relevant log output

N/A

### Environment details

Both these environments:

* CI `conda-notebooks-tests` environment with V100s (CUDA 12.2)
* Ubuntu 22.04 box with 8 V100s (CUDA 12.2)

Using `cudf` (and other RAPIDS dependencies) nightly conda packages as of July 12, 2024.

<details><summary>output of 'conda info', 'conda env export', and 'nvidia-smi' (click me)</summary>

```text
     active environment : test
    active env location : /opt/conda/envs/test
            shell level : 1
       user config file : /github/home/.condarc
 populated config files : /opt/conda/.condarc
          conda version : 24.5.0
    conda-build version : 24.5.1
         python version : 3.11.9.final.0
                 solver : libmamba (default)
       virtual packages : __archspec=1=broadwell
                          __conda=24.5.0=0
                          __cuda=12.4=0
                          __glibc=2.35=0
                          __linux=5.4.0=0
                          __unix=0=0
       base environment : /opt/conda  (writable)
      conda av data dir : /opt/conda/etc/conda
  conda av metadata url : None
           channel URLs : https://conda.anaconda.org/rapidsai/linux-64
                          https://conda.anaconda.org/rapidsai/noarch
                          https://conda.anaconda.org/rapidsai-nightly/linux-64
                          https://conda.anaconda.org/rapidsai-nightly/noarch
                          https://conda.anaconda.org/dask/label/dev/linux-64
                          https://conda.anaconda.org/dask/label/dev/noarch
                          https://conda.anaconda.org/pytorch/linux-64
                          https://conda.anaconda.org/pytorch/noarch
                          https://conda.anaconda.org/conda-forge/linux-64
                          https://conda.anaconda.org/conda-forge/noarch
                          https://conda.anaconda.org/nvidia/linux-64
                          https://conda.anaconda.org/nvidia/noarch
          package cache : /opt/conda/pkgs
                          /github/home/.conda/pkgs
       envs directories : /opt/conda/envs
                          /github/home/.conda/envs
               platform : linux-64
             user-agent : conda/24.5.0 requests/2.32.3 CPython/3.11.9 Linux/5.4.0-177-generic ubuntu/22.04.4 glibc/2.35 solver/libmamba conda-libmamba-solver/24.1.0 libmambapy/1.5.8
                UID:GID : 0:0
             netrc file : None
           offline mode : False

==> /opt/conda/.condarc <==
auto_update_conda: False
channels:
  - rapidsai
  - rapidsai-nightly
  - dask/label/dev
  - pytorch
  - conda-forge
  - nvidia
always_yes: True
number_channel_notices: 0
conda-build:
  set_build_id: False
  root_dir: /tmp/conda-bld-workspace
  output_folder: /tmp/conda-bld-output

==> envvars <==
allow_softlinks: False

# packages in environment at /opt/conda/envs/test:
#
# Name                    Version                   Build  Channel
_libgcc_mutex             0.1                 conda_forge    conda-forge
_openmp_mutex             4.5                       2_gnu    conda-forge
anyio                     4.4.0              pyhd8ed1ab_0    conda-forge
argon2-cffi               23.1.0             pyhd8ed1ab_0    conda-forge
argon2-cffi-bindings      21.2.0          py311h459d7ec_4    conda-forge
arrow                     1.3.0              pyhd8ed1ab_0    conda-forge
asttokens                 2.4.1              pyhd8ed1ab_0    conda-forge
async-lru                 2.0.4              pyhd8ed1ab_0    conda-forge
attrs                     23.2.0             pyh71513ae_0    conda-forge
aws-c-auth                0.7.22              hbd3ac97_10    conda-forge
aws-c-cal                 0.7.1                h87b94db_1    conda-forge
aws-c-common              0.9.23               h4ab18f5_0    conda-forge
aws-c-compression         0.2.18               he027950_7    conda-forge
aws-c-event-stream        0.4.2               h7671281_15    conda-forge
aws-c-http                0.8.2                he17ee6b_6    conda-forge
aws-c-io                  0.14.10              h826b7d6_1    conda-forge
aws-c-mqtt                0.10.4               hcd6a914_8    conda-forge
aws-c-s3                  0.6.0                h365ddd8_2    conda-forge
aws-c-sdkutils            0.1.16               he027950_3    conda-forge
aws-checksums             0.1.18               he027950_7    conda-forge
aws-crt-cpp               0.27.3               hda66527_2    conda-forge
aws-sdk-cpp               1.11.329             h46c3b66_9    conda-forge
azure-core-cpp            1.12.0               h830ed8b_0    conda-forge
azure-identity-cpp        1.8.0                hdb0d106_1    conda-forge
azure-storage-blobs-cpp   12.11.0              ha67cba7_1    conda-forge
azure-storage-common-cpp  12.6.0               he3f277c_1    conda-forge
azure-storage-files-datalake-cpp 12.10.0              h29b5301_1    conda-forge
babel                     2.14.0             pyhd8ed1ab_0    conda-forge
beautifulsoup4            4.12.3             pyha770c72_0    conda-forge
bleach                    6.1.0              pyhd8ed1ab_0    conda-forge
blosc                     1.21.6               hef167b5_0    conda-forge
bokeh                     3.5.0              pyhd8ed1ab_0    conda-forge
branca                    0.7.2              pyhd8ed1ab_0    conda-forge
brotli                    1.1.0                hd590300_1    conda-forge
brotli-bin                1.1.0                hd590300_1    conda-forge
brotli-python             1.1.0           py311hb755f60_1    conda-forge
bzip2                     1.0.8                h4bc722e_7    conda-forge
c-ares                    1.32.2               h4bc722e_0    conda-forge
ca-certificates           2024.7.4             hbcca054_0    conda-forge
cached-property           1.5.2                hd8ed1ab_1    conda-forge
cached_property           1.5.2              pyha770c72_1    conda-forge
cachetools                5.4.0              pyhd8ed1ab_0    conda-forge
cairo                     1.18.0               h3faef2a_0    conda-forge
certifi                   2024.7.4           pyhd8ed1ab_0    conda-forge
cffi                      1.16.0          py311hb3a22ac_0    conda-forge
cfitsio                   4.3.1                hbdc6101_0    conda-forge
charset-normalizer        3.3.2              pyhd8ed1ab_0    conda-forge
click                     8.1.7           unix_pyh707e725_0    conda-forge
click-plugins             1.1.1                      py_0    conda-forge
cligj                     0.7.2              pyhd8ed1ab_1    conda-forge
cloudpickle               3.0.0              pyhd8ed1ab_0    conda-forge
comm                      0.2.2              pyhd8ed1ab_0    conda-forge
contourpy                 1.2.1           py311h9547e67_0    conda-forge
cuda-cccl_linux-64        12.2.140             ha770c72_0    conda-forge
cuda-crt-dev_linux-64     12.2.140             ha770c72_1    conda-forge
cuda-crt-tools            12.2.140             ha770c72_1    conda-forge
cuda-cudart               12.2.140             hd3aeb46_0    conda-forge
cuda-cudart-dev           12.2.140             hd3aeb46_0    conda-forge
cuda-cudart-dev_linux-64  12.2.140             h59595ed_0    conda-forge
cuda-cudart-static        12.2.140             hd3aeb46_0    conda-forge
cuda-cudart-static_linux-64 12.2.140             h59595ed_0    conda-forge
cuda-cudart_linux-64      12.2.140             h59595ed_0    conda-forge
cuda-nvcc-dev_linux-64    12.2.140             ha770c72_1    conda-forge
cuda-nvcc-impl            12.2.140             hd3aeb46_1    conda-forge
cuda-nvcc-tools           12.2.140             hd3aeb46_1    conda-forge
cuda-nvrtc                12.2.140             hd3aeb46_0    conda-forge
cuda-nvvm-dev_linux-64    12.2.140             ha770c72_1    conda-forge
cuda-nvvm-impl            12.2.140             h59595ed_1    conda-forge
cuda-nvvm-tools           12.2.140             h59595ed_1    conda-forge
cuda-profiler-api         12.2.140             ha770c72_0    conda-forge
cuda-python               12.5.0          py311h817de4b_1    conda-forge
cuda-version              12.2                 he2b69de_3    conda-forge
cudf                      24.08.00a322    cuda12_py311_240717_g093bcc94cc_322    rapidsai-nightly
cuml                      24.08.00a35     cuda12_py311_240716_g98721e239_35    rapidsai-nightly
cuproj                    24.08.00a20     cuda12_py311_240717_ga2d8ce19_20    file:///tmp/python_channel
cupy                      13.2.0          py311he5a987b_0    conda-forge
cupy-core                 13.2.0          py311h3bdf873_0    conda-forge
curl                      8.8.0                he654da7_1    conda-forge
cuspatial                 24.08.00a20     cuda12_py311_240717_ga2d8ce19_20    file:///tmp/python_channel
cycler                    0.12.1             pyhd8ed1ab_0    conda-forge
cytoolz                   0.12.3          py311h459d7ec_0    conda-forge
dask                      2024.7.0           pyhd8ed1ab_0    conda-forge
dask-core                 2024.7.0           pyhd8ed1ab_0    conda-forge
dask-cuda                 24.08.00a12     py311_240717_gc31aaac_12    rapidsai-nightly
dask-cudf                 24.08.00a322    cuda12_py311_240717_g093bcc94cc_322    rapidsai-nightly
dask-expr                 1.1.7              pyhd8ed1ab_0    conda-forge
debugpy                   1.8.2           py311h4332511_0    conda-forge
decorator                 5.1.1              pyhd8ed1ab_0    conda-forge
defusedxml                0.7.1              pyhd8ed1ab_0    conda-forge
distributed               2024.7.0           pyhd8ed1ab_0    conda-forge
distributed-ucxx          0.39.00a        py3.11_240717_g36284cb_10    rapidsai-nightly
dlpack                    0.8                  h59595ed_3    conda-forge
entrypoints               0.4                pyhd8ed1ab_0    conda-forge
exceptiongroup            1.2.2              pyhd8ed1ab_0    conda-forge
executing                 2.0.1              pyhd8ed1ab_0    conda-forge
expat                     2.6.2                h59595ed_0    conda-forge
fastrlock                 0.8.2           py311hb755f60_2    conda-forge
fiona                     1.9.5           py311hf8e0aa6_2    conda-forge
fmt                       10.2.1               h00ab1b0_0    conda-forge
folium                    0.17.0             pyhd8ed1ab_0    conda-forge
font-ttf-dejavu-sans-mono 2.37                 hab24e00_0    conda-forge
font-ttf-inconsolata      3.000                h77eed37_0    conda-forge
font-ttf-source-code-pro  2.038                h77eed37_0    conda-forge
font-ttf-ubuntu           0.83                 h77eed37_2    conda-forge
fontconfig                2.14.2               h14ed4e7_0    conda-forge
fonts-conda-ecosystem     1                             0    conda-forge
fonts-conda-forge         1                             0    conda-forge
fonttools                 4.53.1          py311h61187de_0    conda-forge
fqdn                      1.5.1              pyhd8ed1ab_0    conda-forge
freetype                  2.12.1               h267a509_2    conda-forge
freexl                    2.0.0                h743c826_0    conda-forge
fsspec                    2024.6.1           pyhff2d567_0    conda-forge
gdal                      3.8.1           py311h39b4e0e_3    conda-forge
geopandas                 0.14.4             pyhd8ed1ab_0    conda-forge
geopandas-base            0.14.4             pyha770c72_0    conda-forge
geos                      3.12.1               h59595ed_0    conda-forge
geotiff                   1.7.1               hf074850_14    conda-forge
gettext                   0.22.5               h59595ed_2    conda-forge
gettext-tools             0.22.5               h59595ed_2    conda-forge
gflags                    2.2.2             he1b5a44_1004    conda-forge
giflib                    5.2.2                hd590300_0    conda-forge
glog                      0.7.1                hbabe93e_0    conda-forge
h11                       0.14.0             pyhd8ed1ab_0    conda-forge
h2                        4.1.0              pyhd8ed1ab_0    conda-forge
hdf4                      4.2.15               h2a13503_7    conda-forge
hdf5                      1.14.3          nompi_hdf9ad27_105    conda-forge
hpack                     4.0.0              pyh9f0ad1d_0    conda-forge
httpcore                  1.0.5              pyhd8ed1ab_0    conda-forge
httpx                     0.27.0             pyhd8ed1ab_0    conda-forge
hyperframe                6.0.1              pyhd8ed1ab_0    conda-forge
icu                       73.2                 h59595ed_0    conda-forge
idna                      3.7                pyhd8ed1ab_0    conda-forge
imagecodecs-lite          2019.12.3       py311h18e1886_8    conda-forge
imageio                   2.34.2             pyh12aca89_0    conda-forge
importlib-metadata        8.0.0              pyha770c72_0    conda-forge
importlib_metadata        8.0.0                hd8ed1ab_0    conda-forge
importlib_resources       6.4.0              pyhd8ed1ab_0    conda-forge
ipykernel                 6.29.5             pyh3099207_0    conda-forge
ipython                   8.26.0             pyh707e725_0    conda-forge
ipywidgets                8.1.3              pyhd8ed1ab_0    conda-forge
isoduration               20.11.0            pyhd8ed1ab_0    conda-forge
jedi                      0.19.1             pyhd8ed1ab_0    conda-forge
jinja2                    3.1.4              pyhd8ed1ab_0    conda-forge
joblib                    1.4.2              pyhd8ed1ab_0    conda-forge
json-c                    0.17                 h1220068_1    conda-forge
json5                     0.9.25             pyhd8ed1ab_0    conda-forge
jsonpointer               3.0.0           py311h38be061_0    conda-forge
jsonschema                4.23.0             pyhd8ed1ab_0    conda-forge
jsonschema-specifications 2023.12.1          pyhd8ed1ab_0    conda-forge
jsonschema-with-format-nongpl 4.23.0               hd8ed1ab_0    conda-forge
jupyter-lsp               2.2.5              pyhd8ed1ab_0    conda-forge
jupyter_client            8.6.2              pyhd8ed1ab_0    conda-forge
jupyter_core              5.7.2           py311h38be061_0    conda-forge
jupyter_events            0.10.0             pyhd8ed1ab_0    conda-forge
jupyter_server            2.14.2             pyhd8ed1ab_0    conda-forge
jupyter_server_terminals  0.5.3              pyhd8ed1ab_0    conda-forge
jupyterlab                4.2.3              pyhd8ed1ab_0    conda-forge
jupyterlab_pygments       0.3.0              pyhd8ed1ab_1    conda-forge
jupyterlab_server         2.27.3             pyhd8ed1ab_0    conda-forge
jupyterlab_widgets        3.0.11             pyhd8ed1ab_0    conda-forge
kealib                    1.5.3                hee9dde6_1    conda-forge
keyutils                  1.6.1                h166bdaf_0    conda-forge
kiwisolver                1.4.5           py311h9547e67_1    conda-forge
krb5                      1.21.3               h659f571_0    conda-forge
lazy_loader               0.4                pyhd8ed1ab_0    conda-forge
lcms2                     2.16                 hb7c19ff_0    conda-forge
ld_impl_linux-64          2.40                 hf3520f5_7    conda-forge
lerc                      4.0.0                h27087fc_0    conda-forge
libabseil                 20240116.2      cxx17_he02047a_1    conda-forge
libaec                    1.1.3                h59595ed_0    conda-forge
libarchive                3.7.4                hfca40fe_0    conda-forge
libarrow                  16.1.0          h34456a7_14_cpu    conda-forge
libarrow-acero            16.1.0          he02047a_14_cpu    conda-forge
libarrow-dataset          16.1.0          he02047a_14_cpu    conda-forge
libarrow-substrait        16.1.0          hc9a23c6_14_cpu    conda-forge
libasprintf               0.22.5               h661eb56_2    conda-forge
libasprintf-devel         0.22.5               h661eb56_2    conda-forge
libblas                   3.9.0           22_linux64_openblas    conda-forge
libbrotlicommon           1.1.0                hd590300_1    conda-forge
libbrotlidec              1.1.0                hd590300_1    conda-forge
libbrotlienc              1.1.0                hd590300_1    conda-forge
libcblas                  3.9.0           22_linux64_openblas    conda-forge
libcrc32c                 1.1.2                h9c3ff4c_0    conda-forge
libcublas                 12.2.5.6             hd3aeb46_0    conda-forge
libcublas-dev             12.2.5.6             hd3aeb46_0    conda-forge
libcudf                   24.08.00a322    cuda12_240717_g093bcc94cc_322    rapidsai-nightly
libcufft                  11.0.8.103           hd3aeb46_0    conda-forge
libcufile                 1.7.2.10             hd3aeb46_0    conda-forge
libcufile-dev             1.7.2.10             hd3aeb46_0    conda-forge
libcuml                   24.08.00a35     cuda12_240716_g98721e239_35    rapidsai-nightly
libcumlprims              24.08.00a       cuda12_240717_g6a1017c_7    rapidsai-nightly
libcurand                 10.3.3.141           hd3aeb46_0    conda-forge
libcurand-dev             10.3.3.141           hd3aeb46_0    conda-forge
libcurl                   8.8.0                hca28451_1    conda-forge
libcusolver               11.5.2.141           hd3aeb46_0    conda-forge
libcusolver-dev           11.5.2.141           hd3aeb46_0    conda-forge
libcusparse               12.1.2.141           hd3aeb46_0    conda-forge
libcusparse-dev           12.1.2.141           hd3aeb46_0    conda-forge
libcuspatial              24.08.00a20     cuda12_240717_ga2d8ce19_20    file:///tmp/cpp_channel
libdeflate                1.19                 hd590300_0    conda-forge
libedit                   3.1.20191231         he28a2e2_2    conda-forge
libev                     4.33                 hd590300_2    conda-forge
libevent                  2.1.12               hf998b51_1    conda-forge
libexpat                  2.6.2                h59595ed_0    conda-forge
libffi                    3.4.2                h7f98852_5    conda-forge
libgcc-ng                 14.1.0               h77fa898_0    conda-forge
libgdal                   3.8.1                h4b8bffa_3    conda-forge
libgettextpo              0.22.5               h59595ed_2    conda-forge
libgettextpo-devel        0.22.5               h59595ed_2    conda-forge
libgfortran-ng            14.1.0               h69a702a_0    conda-forge
libgfortran5              14.1.0               hc5f4f2c_0    conda-forge
libglib                   2.78.4               h783c2da_0    conda-forge
libgomp                   14.1.0               h77fa898_0    conda-forge
libgoogle-cloud           2.26.0               h26d7fe4_0    conda-forge
libgoogle-cloud-storage   2.26.0               ha262f82_0    conda-forge
libgrpc                   1.62.2               h15f2491_0    conda-forge
libiconv                  1.17                 hd590300_2    conda-forge
libjpeg-turbo             3.0.0                hd590300_1    conda-forge
libkml                    1.3.0             hbbc8833_1020    conda-forge
libkvikio                 24.08.00a       cuda12_240717_gab3778c_18    rapidsai-nightly
liblapack                 3.9.0           22_linux64_openblas    conda-forge
libllvm14                 14.0.6               hcd5def8_4    conda-forge
libnetcdf                 4.9.2           nompi_h135f659_114    conda-forge
libnghttp2                1.58.0               h47da74e_1    conda-forge
libnl                     3.9.0                hd590300_0    conda-forge
libnsl                    2.0.1                hd590300_0    conda-forge
libnvjitlink              12.2.140             hd3aeb46_0    conda-forge
libopenblas               0.3.27          pthreads_hac2b453_1    conda-forge
libparquet                16.1.0          h9e5060d_14_cpu    conda-forge
libpng                    1.6.43               h2797004_0    conda-forge
libpq                     16.3                 ha72fbe1_0    conda-forge
libprotobuf               4.25.3               h08a7969_0    conda-forge
libraft                   24.08.00a43     cuda12_240717_gab5e1287_43    rapidsai-nightly
libraft-headers           24.08.00a43     cuda12_240717_gab5e1287_43    rapidsai-nightly
libraft-headers-only      24.08.00a43     cuda12_240717_gab5e1287_43    rapidsai-nightly
libre2-11                 2023.09.01           h5a48ba9_2    conda-forge
librmm                    24.08.00a27     cuda12_240717_gf91ca6f2_27    rapidsai-nightly
librttopo                 1.1.0               h8917695_15    conda-forge
libsodium                 1.0.18               h36c2ea0_1    conda-forge
libspatialindex           2.0.0                he02047a_0    conda-forge
libspatialite             5.1.0                h72606ae_3    conda-forge
libsqlite                 3.46.0               hde9e2c9_0    conda-forge
libssh2                   1.11.0               h0841786_0    conda-forge
libstdcxx-ng              14.1.0               hc0a3c3a_0    conda-forge
libthrift                 0.19.0               hb90f79a_1    conda-forge
libtiff                   4.6.0                ha9c0a0a_2    conda-forge
libucxx                   0.39.00a        cuda12_240717_g36284cb_10    rapidsai-nightly
libutf8proc               2.8.0                h166bdaf_0    conda-forge
libuuid                   2.38.1               h0b41bf4_0    conda-forge
libwebp-base              1.4.0                hd590300_0    conda-forge
libxcb                    1.15                 h0b41bf4_0    conda-forge
libxcrypt                 4.4.36               hd590300_1    conda-forge
libxml2                   2.12.7               h4c95cb1_3    conda-forge
libzip                    1.10.1               h2629f0a_3    conda-forge
libzlib                   1.3.1                h4ab18f5_1    conda-forge
llvmlite                  0.43.0          py311hbde99c3_0    conda-forge
locket                    1.0.0              pyhd8ed1ab_0    conda-forge
lz4                       4.3.3           py311h38e4bf4_0    conda-forge
lz4-c                     1.9.4                hcb278e6_0    conda-forge
lzo                       2.10              hd590300_1001    conda-forge
mapclassify               2.6.1              pyhd8ed1ab_0    conda-forge
markdown-it-py            3.0.0              pyhd8ed1ab_0    conda-forge
markupsafe                2.1.5           py311h459d7ec_0    conda-forge
matplotlib-base           3.9.1           py311hffb96ce_0    conda-forge
matplotlib-inline         0.1.7              pyhd8ed1ab_0    conda-forge
mdurl                     0.1.2              pyhd8ed1ab_0    conda-forge
minizip                   4.0.7                h401b404_0    conda-forge
mistune                   3.0.2              pyhd8ed1ab_0    conda-forge
msgpack-python            1.0.8           py311h52f7536_0    conda-forge
munkres                   1.1.4              pyh9f0ad1d_0    conda-forge
nbclient                  0.10.0             pyhd8ed1ab_0    conda-forge
nbconvert-core            7.16.4             pyhd8ed1ab_1    conda-forge
nbformat                  5.10.4             pyhd8ed1ab_0    conda-forge
nccl                      2.22.3.1             hbc370b7_0    conda-forge
ncurses                   6.5                  h59595ed_0    conda-forge
nest-asyncio              1.6.0              pyhd8ed1ab_0    conda-forge
networkx                  3.3                pyhd8ed1ab_1    conda-forge
notebook                  7.2.1              pyhd8ed1ab_0    conda-forge
notebook-shim             0.2.4              pyhd8ed1ab_0    conda-forge
nspr                      4.35                 h27087fc_0    conda-forge
nss                       3.102                h593d115_0    conda-forge
numba                     0.60.0          py311h4bc866e_0    conda-forge
numpy                     1.26.4          py311h64a7726_0    conda-forge
nvcomp                    3.0.6                h10b603f_0    conda-forge
nvtx                      0.2.10          py311h459d7ec_0    conda-forge
openjpeg                  2.5.2                h488ebb8_0    conda-forge
openssl                   3.3.1                h4bc722e_2    conda-forge
orc                       2.0.1                h17fec99_1    conda-forge
overrides                 7.7.0              pyhd8ed1ab_0    conda-forge
packaging                 24.1               pyhd8ed1ab_0    conda-forge
pandas                    2.2.2           py311h14de704_1    conda-forge
pandocfilters             1.5.0              pyhd8ed1ab_0    conda-forge
parso                     0.8.4              pyhd8ed1ab_0    conda-forge
partd                     1.4.2              pyhd8ed1ab_0    conda-forge
pcre2                     10.42                hcad00b1_0    conda-forge
pexpect                   4.9.0              pyhd8ed1ab_0    conda-forge
pickleshare               0.7.5                   py_1003    conda-forge
pillow                    10.3.0          py311h18e6fac_0    conda-forge
pip                       24.0               pyhd8ed1ab_0    conda-forge
pixman                    0.43.2               h59595ed_0    conda-forge
pkgutil-resolve-name      1.3.10             pyhd8ed1ab_1    conda-forge
platformdirs              4.2.2              pyhd8ed1ab_0    conda-forge
poppler                   23.12.0              h590f24d_0    conda-forge
poppler-data              0.4.12               hd8ed1ab_0    conda-forge
postgresql                16.3                 h8e811e2_0    conda-forge
proj                      9.3.0                h1d62c97_2    conda-forge
prometheus_client         0.20.0             pyhd8ed1ab_0    conda-forge
prompt-toolkit            3.0.47             pyha770c72_0    conda-forge
psutil                    6.0.0           py311h331c9d8_0    conda-forge
pthread-stubs             0.4               h36c2ea0_1001    conda-forge
ptyprocess                0.7.0              pyhd3deb0d_0    conda-forge
pure_eval                 0.2.2              pyhd8ed1ab_0    conda-forge
pyarrow                   16.1.0          py311hbd00459_4    conda-forge
pyarrow-core              16.1.0          py311h8c3dac4_4_cpu    conda-forge
pyarrow-hotfix            0.6                pyhd8ed1ab_0    conda-forge
pycparser                 2.22               pyhd8ed1ab_0    conda-forge
pydeck                    0.8.0              pyhd8ed1ab_0    conda-forge
pygments                  2.18.0             pyhd8ed1ab_0    conda-forge
pylibraft                 24.08.00a43     cuda12_py311_240717_gab5e1287_43    rapidsai-nightly
pynvjitlink               0.3.0           py311hd269673_0    rapidsai
pynvml                    11.4.1             pyhd8ed1ab_0    conda-forge
pyparsing                 3.1.2              pyhd8ed1ab_0    conda-forge
pyproj                    3.6.1           py311h1facc83_4    conda-forge
pysocks                   1.7.1              pyha2e5f31_6    conda-forge
python                    3.11.9          hb806964_0_cpython    conda-forge
python-dateutil           2.9.0              pyhd8ed1ab_0    conda-forge
python-fastjsonschema     2.20.0             pyhd8ed1ab_0    conda-forge
python-json-logger        2.0.7              pyhd8ed1ab_0    conda-forge
python-tzdata             2024.1             pyhd8ed1ab_0    conda-forge
python_abi                3.11                    4_cp311    conda-forge
pytz                      2024.1             pyhd8ed1ab_0    conda-forge
pywavelets                1.6.0           py311h18e1886_0    conda-forge
pyyaml                    6.0.1           py311h459d7ec_1    conda-forge
pyzmq                     26.0.3          py311h08a0b41_0    conda-forge
qhull                     2020.2               h434a139_5    conda-forge
raft-dask                 24.08.00a43     cuda12_py311_240717_gab5e1287_43    rapidsai-nightly
rapids-dask-dependency    24.08.00a5                 py_0    rapidsai-nightly
rdma-core                 52.0                 he02047a_0    conda-forge
re2                       2023.09.01           h7f4b329_2    conda-forge
readline                  8.2                  h8228510_1    conda-forge
referencing               0.35.1             pyhd8ed1ab_0    conda-forge
requests                  2.32.3             pyhd8ed1ab_0    conda-forge
rfc3339-validator         0.1.4              pyhd8ed1ab_0    conda-forge
rfc3986-validator         0.1.1              pyh9f0ad1d_0    conda-forge
rich                      13.7.1             pyhd8ed1ab_0    conda-forge
rmm                       24.08.00a27     cuda12_py311_240717_gf91ca6f2_27    rapidsai-nightly
rpds-py                   0.19.0          py311hb3a8bbb_0    conda-forge
rtree                     1.3.0           py311h51bcefd_1    conda-forge
s2n                       1.4.17               he19d79f_0    conda-forge
scikit-image              0.20.0          py311h2872171_1    conda-forge
scikit-learn              1.5.1           py311hd632256_0    conda-forge
scipy                     1.14.0          py311h517d4fd_1    conda-forge
send2trash                1.8.3              pyh0d859eb_0    conda-forge
setuptools                70.3.0             pyhd8ed1ab_0    conda-forge
shapely                   2.0.4           py311h0bed3d6_1    conda-forge
six                       1.16.0             pyh6c4a22f_0    conda-forge
snappy                    1.2.1                ha2e4443_0    conda-forge
sniffio                   1.3.1              pyhd8ed1ab_0    conda-forge
sortedcontainers          2.4.0              pyhd8ed1ab_0    conda-forge
soupsieve                 2.5                pyhd8ed1ab_1    conda-forge
spdlog                    1.12.0               hd2e6256_2    conda-forge
sqlite                    3.46.0               h6d4b2fc_0    conda-forge
stack_data                0.6.2              pyhd8ed1ab_0    conda-forge
tblib                     3.0.0              pyhd8ed1ab_0    conda-forge
terminado                 0.18.1             pyh0d859eb_0    conda-forge
threadpoolctl             3.5.0              pyhc1e730c_0    conda-forge
tifffile                  2020.6.3                   py_0    conda-forge
tiledb                    2.18.2               h99f50a1_1    conda-forge
tinycss2                  1.3.0              pyhd8ed1ab_0    conda-forge
tk                        8.6.13          noxft_h4845f30_101    conda-forge
tomli                     2.0.1              pyhd8ed1ab_0    conda-forge
toolz                     0.12.1             pyhd8ed1ab_0    conda-forge
tornado                   6.4.1           py311h331c9d8_0    conda-forge
traitlets                 5.14.3             pyhd8ed1ab_0    conda-forge
treelite                  4.2.1           py311he8f9275_0    conda-forge
types-python-dateutil     2.9.0.20240316     pyhd8ed1ab_0    conda-forge
typing-extensions         4.12.2               hd8ed1ab_0    conda-forge
typing_extensions         4.12.2             pyha770c72_0    conda-forge
typing_utils              0.1.0              pyhd8ed1ab_0    conda-forge
tzcode                    2024a                h3f72095_0    conda-forge
tzdata                    2024a                h0c530f3_0    conda-forge
ucx                       1.15.0               hda83522_8    conda-forge
ucx-py                    0.39.00a7       py311_240717_g3741610_7    rapidsai-nightly
ucxx                      0.39.00a        cuda12_py3.11_240717_g36284cb_10    rapidsai-nightly
uri-template              1.3.0              pyhd8ed1ab_0    conda-forge
uriparser                 0.9.8                hac33072_0    conda-forge
urllib3                   2.2.2              pyhd8ed1ab_1    conda-forge
wcwidth                   0.2.13             pyhd8ed1ab_0    conda-forge
webcolors                 24.6.0             pyhd8ed1ab_0    conda-forge
webencodings              0.5.1              pyhd8ed1ab_2    conda-forge
websocket-client          1.8.0              pyhd8ed1ab_0    conda-forge
wheel                     0.43.0             pyhd8ed1ab_1    conda-forge
widgetsnbextension        4.0.11             pyhd8ed1ab_0    conda-forge
xerces-c                  3.2.5                hac6953d_0    conda-forge
xorg-kbproto              1.0.7             h7f98852_1002    conda-forge
xorg-libice               1.1.1                hd590300_0    conda-forge
xorg-libsm                1.2.4                h7391055_0    conda-forge
xorg-libx11               1.8.9                h8ee46fc_0    conda-forge
xorg-libxau               1.0.11               hd590300_0    conda-forge
xorg-libxdmcp             1.1.3                h7f98852_0    conda-forge
xorg-libxext              1.3.4                h0b41bf4_2    conda-forge
xorg-libxrender           0.9.11               hd590300_0    conda-forge
xorg-renderproto          0.11.1            h7f98852_1002    conda-forge
xorg-xextproto            7.3.0             h0b41bf4_1003    conda-forge
xorg-xproto               7.0.31            h7f98852_1007    conda-forge
xyzservices               2024.6.0           pyhd8ed1ab_0    conda-forge
xz                        5.2.6                h166bdaf_0    conda-forge
yaml                      0.2.5                h7f98852_2    conda-forge
zeromq                    4.3.5                h75354e8_4    conda-forge
zict                      3.0.0              pyhd8ed1ab_0    conda-forge
zipp                      3.19.2             pyhd8ed1ab_0    conda-forge
zlib                      1.3.1                h4ab18f5_1    conda-forge
zstandard                 0.23.0          py311h5cd10c7_0    conda-forge
zstd                      1.5.6                ha6fb4c9_0    conda-forge
/__w/cuspatial/cuspatial/notebooks /__w/cuspatial/cuspatial
Wed Jul 17 15:37:47 2024       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.15              Driver Version: 550.54.15      CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  Tesla V100-PCIE-32GB           Off |   00000000:85:00.0 Off |                    0 |
| N/A   24C    P0             24W /  250W |       0MiB /  32768MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
                                                                                         
+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+
```

</details>

([example build link](https://github.com/rapidsai/cuspatial/actions/runs/9976754023/job/27571001363))

### Other/Misc.

Other symptoms that led to this were documented in #1406.

That was closed by just skipping the most expensive notebooks, in #1407.


Discussion / hints:

Fix patch:
diff --git a/.devcontainer/cuda11.8-conda/devcontainer.json b/.devcontainer/cuda11.8-conda/devcontainer.json
index 5e203a384..a50f61dac 100644
--- a/.devcontainer/cuda11.8-conda/devcontainer.json
+++ b/.devcontainer/cuda11.8-conda/devcontainer.json
@@ -5,17 +5,17 @@
     "args": {
       "CUDA": "11.8",
       "PYTHON_PACKAGE_MANAGER": "conda",
-      "BASE": "rapidsai/devcontainers:24.06-cpp-cuda11.8-mambaforge-ubuntu22.04"
+      "BASE": "rapidsai/devcontainers:24.08-cpp-cuda11.8-mambaforge-ubuntu22.04"
     }
   },
   "runArgs": [
     "--rm",
     "--name",
-    "${localEnv:USER}-rapids-${localWorkspaceFolderBasename}-24.06-cuda11.8-conda"
+    "${localEnv:USER:anon}-rapids-${localWorkspaceFolderBasename}-24.08-cuda11.8-conda"
   ],
   "hostRequirements": {"gpu": "optional"},
   "features": {
-    "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:24.6": {}
+    "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:24.8": {}
   },
   "overrideFeatureInstallOrder": [
     "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils"
diff --git a/.devcontainer/cuda11.8-pip/devcontainer.json b/.devcontainer/cuda11.8-pip/devcontainer.json
index 682b2d155..11b8ad305 100644
--- a/.devcontainer/cuda11.8-pip/devcontainer.json
+++ b/.devcontainer/cuda11.8-pip/devcontainer.json
@@ -5,17 +5,17 @@
     "args": {
       "CUDA": "11.8",
       "PYTHON_PACKAGE_MANAGER": "pip",
-      "BASE": "rapidsai/devcontainers:24.06-cpp-cuda11.8-ubuntu22.04"
+      "BASE": "rapidsai/devcontainers:24.08-cpp-cuda11.8-ubuntu22.04"
     }
   },
   "runArgs": [
     "--rm",
     "--name",
-    "${localEnv:USER}-rapids-${localWorkspaceFolderBasename}-24.06-cuda11.8-pip"
+    "${localEnv:USER:anon}-rapids-${localWorkspaceFolderBasename}-24.08-cuda11.8-pip"
   ],
   "hostRequirements": {"gpu": "optional"},
   "features": {
-    "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:24.6": {}
+    "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:24.8": {}
   },
   "overrideFeatureInstallOrder": [
     "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils"
diff --git a/.devcontainer/cuda12.2-conda/devcontainer.json b/.devcontainer/cuda12.5-conda/devcontainer.json
similarity index 84%
rename from .devcontainer/cuda12.2-conda/devcontainer.json
rename to .devcontainer/cuda12.5-conda/devcontainer.json
index d3bd5b769..33328e98f 100644
--- a/.devcontainer/cuda12.2-conda/devcontainer.json
+++ b/.devcontainer/cuda12.5-conda/devcontainer.json
@@ -3,24 +3,24 @@
     "context": "${localWorkspaceFolder}/.devcontainer",
     "dockerfile": "${localWorkspaceFolder}/.devcontainer/Dockerfile",
     "args": {
-      "CUDA": "12.2",
+      "CUDA": "12.5",
       "PYTHON_PACKAGE_MANAGER": "conda",
-      "BASE": "rapidsai/devcontainers:24.06-cpp-mambaforge-ubuntu22.04"
+      "BASE": "rapidsai/devcontainers:24.08-cpp-mambaforge-ubuntu22.04"
     }
   },
   "runArgs": [
     "--rm",
     "--name",
-    "${localEnv:USER}-rapids-${localWorkspaceFolderBasename}-24.06-cuda12.2-conda"
+    "${localEnv:USER:anon}-rapids-${localWorkspaceFolderBasename}-24.08-cuda12.5-conda"
   ],
   "hostRequirements": {"gpu": "optional"},
   "features": {
-    "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:24.6": {}
+    "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:24.8": {}
   },
   "overrideFeatureInstallOrder": [
     "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils"
   ],
-  "initializeCommand": ["/bin/bash", "-c", "mkdir -m 0755 -p ${localWorkspaceFolder}/../.{aws,cache,config,conda/pkgs,conda/${localWorkspaceFolderBasename}-cuda12.2-envs}"],
+  "initializeCommand": ["/bin/bash", "-c", "mkdir -m 0755 -p ${localWorkspaceFolder}/../.{aws,cache,config,conda/pkgs,conda/${localWorkspaceFolderBasename}-cuda12.5-envs}"],
   "postAttachCommand": ["/bin/bash", "-c", "if [ ${CODESPACES:-false} = 'true' ]; then . devcontainer-utils-post-attach-command; . rapids-post-attach-command; fi"],
   "workspaceFolder": "/home/coder",
   "workspaceMount": "source=${localWorkspaceFolder},target=/home/coder/cuspatial,type=bind,consistency=consistent",
@@ -29,7 +29,7 @@
     "source=${localWorkspaceFolder}/../.cache,target=/home/coder/.cache,type=bind,consistency=consistent",
     "source=${localWorkspaceFolder}/../.config,target=/home/coder/.config,type=bind,consistency=consistent",
     "source=${localWorkspaceFolder}/../.conda/pkgs,target=/home/coder/.conda/pkgs,type=bind,consistency=consistent",
-    "source=${localWorkspaceFolder}/../.conda/${localWorkspaceFolderBasename}-cuda12.2-envs,target=/home/coder/.conda/envs,type=bind,consistency=consistent"
+    "source=${localWorkspaceFolder}/../.conda/${localWorkspaceFolderBasename}-cuda12.5-envs,target=/home/coder/.conda/envs,type=bind,consistency=consistent"
   ],
   "customizations": {
     "vscode": {
diff --git a/.devcontainer/cuda12.2-pip/devcontainer.json b/.devcontainer/cuda12.5-pip/devcontainer.json
similarity index 83%
rename from .devcontainer/cuda12.2-pip/devcontainer.json
rename to .devcontainer/cuda12.5-pip/devcontainer.json
index a667a3fd0..5dca1ccc5 100644
--- a/.devcontainer/cuda12.2-pip/devcontainer.json
+++ b/.devcontainer/cuda12.5-pip/devcontainer.json
@@ -3,24 +3,24 @@
     "context": "${localWorkspaceFolder}/.devcontainer",
     "dockerfile": "${localWorkspaceFolder}/.devcontainer/Dockerfile",
     "args": {
-      "CUDA": "12.2",
+      "CUDA": "12.5",
       "PYTHON_PACKAGE_MANAGER": "pip",
-      "BASE": "rapidsai/devcontainers:24.06-cpp-cuda12.2-ubuntu22.04"
+      "BASE": "rapidsai/devcontainers:24.08-cpp-cuda12.5-ubuntu22.04"
     }
   },
   "runArgs": [
     "--rm",
     "--name",
-    "${localEnv:USER}-rapids-${localWorkspaceFolderBasename}-24.06-cuda12.2-pip"
+    "${localEnv:USER:anon}-rapids-${localWorkspaceFolderBasename}-24.08-cuda12.5-pip"
   ],
   "hostRequirements": {"gpu": "optional"},
   "features": {
-    "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:24.6": {}
+    "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:24.8": {}
   },
   "overrideFeatureInstallOrder": [
     "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils"
   ],
-  "initializeCommand": ["/bin/bash", "-c", "mkdir -m 0755 -p ${localWorkspaceFolder}/../.{aws,cache,config/pip,local/share/${localWorkspaceFolderBasename}-cuda12.2-venvs}"],
+  "initializeCommand": ["/bin/bash", "-c", "mkdir -m 0755 -p ${localWorkspaceFolder}/../.{aws,cache,config/pip,local/share/${localWorkspaceFolderBasename}-cuda12.5-venvs}"],
   "postAttachCommand": ["/bin/bash", "-c", "if [ ${CODESPACES:-false} = 'true' ]; then . devcontainer-utils-post-attach-command; . rapids-post-attach-command; fi"],
   "workspaceFolder": "/home/coder",
   "workspaceMount": "source=${localWorkspaceFolder},target=/home/coder/cuspatial,type=bind,consistency=consistent",
@@ -28,7 +28,7 @@
     "source=${localWorkspaceFolder}/../.aws,target=/home/coder/.aws,type=bind,consistency=consistent",
     "source=${localWorkspaceFolder}/../.cache,target=/home/coder/.cache,type=bind,consistency=consistent",
     "source=${localWorkspaceFolder}/../.config,target=/home/coder/.config,type=bind,consistency=consistent",
-    "source=${localWorkspaceFolder}/../.local/share/${localWorkspaceFolderBasename}-cuda12.2-venvs,target=/home/coder/.local/share/venvs,type=bind,consistency=consistent"
+    "source=${localWorkspaceFolder}/../.local/share/${localWorkspaceFolderBasename}-cuda12.5-venvs,target=/home/coder/.local/share/venvs,type=bind,consistency=consistent"
   ],
   "customizations": {
     "vscode": {
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index d2ae8e825..ec3df93df 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -8,8 +8,14 @@ python/            @rapidsai/cuspatial-python-codeowners
 **/CMakeLists.txt  @rapidsai/cuspatial-cmake-codeowners
 **/cmake/          @rapidsai/cuspatial-cmake-codeowners
 
-# build/ops code owners
-.github/           @rapidsai/ops-codeowners
-ci/                @rapidsai/ops-codeowners
-/conda/            @rapidsai/ops-codeowners
-dependencies.yaml  @rapidsai/ops-codeowners
+# CI code owners
+/.github/                @rapidsai/ci-codeowners
+/ci/                     @rapidsai/ci-codeowners
+/.pre-commit-config.yaml @rapidsai/ci-codeowners
+
+# packaging code owners
+/.devcontainer/    @rapidsai/packaging-codeowners
+/conda/            @rapidsai/packaging-codeowners
+/dependencies.yaml @rapidsai/packaging-codeowners
+/build.sh          @rapidsai/packaging-codeowners
+pyproject.toml     @rapidsai/packaging-codeowners
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index 06cb83f7d..b5e2dbb44 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -28,7 +28,7 @@ concurrency:
 jobs:
   cpp-build:
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@branch-24.08
     with:
       build_type: ${{ inputs.build_type || 'branch' }}
       branch: ${{ inputs.branch }}
@@ -37,7 +37,7 @@ jobs:
   python-build:
     needs: [cpp-build]
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@branch-24.08
     with:
       build_type: ${{ inputs.build_type || 'branch' }}
       branch: ${{ inputs.branch }}
@@ -46,7 +46,7 @@ jobs:
   upload-conda:
     needs: [cpp-build, python-build]
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/conda-upload-packages.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/conda-upload-packages.yaml@branch-24.08
     with:
       build_type: ${{ inputs.build_type || 'branch' }}
       branch: ${{ inputs.branch }}
@@ -56,7 +56,7 @@ jobs:
     if: github.ref_type == 'branch'
     needs: python-build
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-24.08
     with:
       arch: "amd64"
       branch: ${{ inputs.branch }}
@@ -68,7 +68,7 @@ jobs:
       sha: ${{ inputs.sha }}
   wheel-build-cuspatial:
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-24.08
     with:
       build_type: ${{ inputs.build_type || 'branch' }}
       branch: ${{ inputs.branch }}
@@ -78,7 +78,7 @@ jobs:
   wheel-publish-cuspatial:
     needs: wheel-build-cuspatial
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@branch-24.08
     with:
       build_type: ${{ inputs.build_type || 'branch' }}
       branch: ${{ inputs.branch }}
@@ -87,7 +87,7 @@ jobs:
       package-name: cuspatial
   wheel-build-cuproj:
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-24.08
     with:
       build_type: ${{ inputs.build_type || 'branch' }}
       branch: ${{ inputs.branch }}
@@ -97,7 +97,7 @@ jobs:
   wheel-publish-cuproj:
     needs: wheel-build-cuproj
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@branch-24.08
     with:
       build_type: ${{ inputs.build_type || 'branch' }}
       branch: ${{ inputs.branch }}
diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml
index be33cfd04..2c76c0a45 100644
--- a/.github/workflows/pr.yaml
+++ b/.github/workflows/pr.yaml
@@ -25,40 +25,40 @@ jobs:
       - wheel-tests-cuproj
       - devcontainer
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@branch-24.08
   checks:
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@branch-24.08
     with:
       enable_check_generated_files: false
   conda-cpp-build:
     needs: checks
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@branch-24.08
     with:
       build_type: pull-request
   conda-cpp-tests:
     needs: conda-cpp-build
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@branch-24.08
     with:
       build_type: pull-request
   conda-python-build:
     needs: conda-cpp-build
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@branch-24.08
     with:
       build_type: pull-request
   conda-python-tests:
     needs: conda-python-build
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@branch-24.08
     with:
       build_type: pull-request
   conda-notebook-tests:
     needs: conda-python-build
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-24.08
     with:
       build_type: pull-request
       node_type: "gpu-v100-latest-1"
@@ -68,7 +68,7 @@ jobs:
   docs-build:
     needs: conda-python-build
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-24.08
     with:
       build_type: pull-request
       node_type: "gpu-v100-latest-1"
@@ -78,37 +78,37 @@ jobs:
   wheel-build-cuspatial:
     needs: checks
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-24.08
     with:
       build_type: pull-request
       script: ci/build_wheel_cuspatial.sh
   wheel-tests-cuspatial:
     needs: wheel-build-cuspatial
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-24.08
     with:
       build_type: pull-request
       script: ci/test_wheel_cuspatial.sh
   wheel-build-cuproj:
     needs: checks
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-24.08
     with:
       build_type: pull-request
       script: ci/build_wheel_cuproj.sh
   wheel-tests-cuproj:
     needs: [wheel-build-cuspatial, wheel-build-cuproj]
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-24.08
     with:
       build_type: pull-request
       script: ci/test_wheel_cuproj.sh
   devcontainer:
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/build-in-devcontainer.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/build-in-devcontainer.yaml@branch-24.08
     with:
       arch: '["amd64"]'
-      cuda: '["12.2"]'
+      cuda: '["12.5"]'
       build_command: |
         sccache -z;
         build-all -DBUILD_TESTS=ON -DBUILD_BENCHMARKS=ON --verbose;
diff --git a/.gitignore b/.gitignore
index a6627d3e7..3c446e0eb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -148,10 +148,13 @@ ENV/
 .mypy_cache/
 
 # notebook/example generated files
+docs/source/user_guide/cache/
+docs/source/user_guide/*.csv
 notebooks/taxi2016.csv
 notebooks/taxi2017.csv
 notebooks/tzones_lonlat.json
 notebooks/cu_taxi.zones.*
+*.parquet
 
 # clang tooling
 compile_commands.json
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 1ad856310..f91a2e09b 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -42,15 +42,16 @@ repos:
             - id: codespell
               args: ["--config pyproject.toml"]
               additional_dependencies: ["tomli"]
+      - repo: https://github.com/rapidsai/pre-commit-hooks
+        rev: v0.2.0
+        hooks:
+            - id: verify-copyright
+            - id: verify-alpha-spec
       - repo: https://github.com/rapidsai/dependency-file-generator
-        rev: v1.8.0
+        rev: v1.13.11
         hooks:
             - id: rapids-dependency-file-generator
               args: ["--clean"]
-      - repo: https://github.com/rapidsai/pre-commit-hooks
-        rev: v0.0.3
-        hooks:
-            - id: verify-copyright
 
 
 default_language_version:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 264cef755..faa934484 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,30 @@
+# cuspatial 24.08.00 (7 Aug 2024)
+
+## 🐛 Bug Fixes
+
+- Unskip taxi notebook from CI ([#1422](https://github.com/rapidsai/cuspatial/pull/1422)) [@harrism](https://github.com/harrism)
+- Use CuPy array in `pip_bitmap_column_to_binary_array` ([#1418](https://github.com/rapidsai/cuspatial/pull/1418)) [@isVoid](https://github.com/isVoid)
+- Conda: Move `cmake` to `requirements/build` ([#1409](https://github.com/rapidsai/cuspatial/pull/1409)) [@jakirkham](https://github.com/jakirkham)
+- test notebooks in &#39;docs/&#39;, make cuspatial_api_examples self-contained, skip long-running notebook, fix some docs ([#1407](https://github.com/rapidsai/cuspatial/pull/1407)) [@jameslamb](https://github.com/jameslamb)
+- Fix geopandas upgrades ([#1404](https://github.com/rapidsai/cuspatial/pull/1404)) [@quasiben](https://github.com/quasiben)
+- Fix multipolygon geometry iterator. ([#1402](https://github.com/rapidsai/cuspatial/pull/1402)) [@bdice](https://github.com/bdice)
+- Change _GeoSeriesUtility._from_data(index=) default to None ([#1400](https://github.com/rapidsai/cuspatial/pull/1400)) [@mroeschke](https://github.com/mroeschke)
+- Fix test_intersections.py post cudf refactor ([#1398](https://github.com/rapidsai/cuspatial/pull/1398)) [@mroeschke](https://github.com/mroeschke)
+- Allow anonymous user in devcontainer name ([#1396](https://github.com/rapidsai/cuspatial/pull/1396)) [@bdice](https://github.com/bdice)
+
+## 🛠️ Improvements
+
+- Ensure _from_data accepts columns objects only ([#1415](https://github.com/rapidsai/cuspatial/pull/1415)) [@mroeschke](https://github.com/mroeschke)
+- split up CUDA-suffixed dependencies in dependencies.yaml ([#1414](https://github.com/rapidsai/cuspatial/pull/1414)) [@jameslamb](https://github.com/jameslamb)
+- Build and test with CUDA 12.5.1 ([#1405](https://github.com/rapidsai/cuspatial/pull/1405)) [@KyleFromNVIDIA](https://github.com/KyleFromNVIDIA)
+- skip CMake 3.30.0 ([#1401](https://github.com/rapidsai/cuspatial/pull/1401)) [@jameslamb](https://github.com/jameslamb)
+- Use verify-alpha-spec hook ([#1399](https://github.com/rapidsai/cuspatial/pull/1399)) [@KyleFromNVIDIA](https://github.com/KyleFromNVIDIA)
+- Adopt CI/packaging codeowners ([#1397](https://github.com/rapidsai/cuspatial/pull/1397)) [@bdice](https://github.com/bdice)
+- Remove text builds of documentation ([#1394](https://github.com/rapidsai/cuspatial/pull/1394)) [@vyasr](https://github.com/vyasr)
+- use rapids-build-backend ([#1393](https://github.com/rapidsai/cuspatial/pull/1393)) [@jameslamb](https://github.com/jameslamb)
+- Fix forward-merge `branch-24.06` into `branch-24.08` ([#1390](https://github.com/rapidsai/cuspatial/pull/1390)) [@trxcllnt](https://github.com/trxcllnt)
+- remove unnecessary &#39;setuptools&#39; dependencies ([#1389](https://github.com/rapidsai/cuspatial/pull/1389)) [@jameslamb](https://github.com/jameslamb)
+
 # cuspatial 24.06.00 (5 Jun 2024)
 
 ## 🚨 Breaking Changes
diff --git a/README.md b/README.md
index 97ba2859a..52202b950 100644
--- a/README.md
+++ b/README.md
@@ -113,7 +113,7 @@ An example command from the Release Selector:
 docker run --gpus all --pull always --rm -it \
     --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 \
     -p 8888:8888 -p 8787:8787 -p 8786:8786 \
-    nvcr.io/nvidia/rapidsai/notebooks:24.06-cuda11.8-py3.10
+    nvcr.io/nvidia/rapidsai/notebooks:24.08-cuda11.8-py3.10
 ```
 
 ### Install with Conda
@@ -125,7 +125,7 @@ cuSpatial can be installed with conda (miniconda, or the full Anaconda distribut
 
 ```shell
 conda install -c rapidsai -c conda-forge -c nvidia \
-    cuspatial=24.06 python=3.11 cudatoolkit=11.8
+    cuspatial=24.08 python=3.11 cudatoolkit=11.8
 ```
 We also provide nightly Conda packages built from the HEAD of our latest development branch.
 
@@ -184,7 +184,7 @@ To build and install cuSpatial from source please see the [build documentation](
 If you find cuSpatial useful in your published work, please consider citing the repository.
 
 ```bibtex
-@misc{cuspatial:24.06,
+@misc{cuspatial:24.08,
     author = {{NVIDIA Corporation}},
     title = {cuSpatial: GPU-Accelerated Geospatial and Spatiotemporal Algorithms},
     year = {2023},
diff --git a/VERSION b/VERSION
index 0bff6981a..ec8489fda 100644
--- a/VERSION
+++ b/VERSION
@@ -1,1 +1,1 @@
-24.06.00
+24.08.00
diff --git a/build.sh b/build.sh
index 664e824e6..ffe97da9a 100755
--- a/build.sh
+++ b/build.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-# Copyright (c) 2019, NVIDIA CORPORATION.
+# Copyright (c) 2019-2024, NVIDIA CORPORATION.
 
 # cuSpatial build script
 
@@ -183,7 +183,7 @@ if (( ${NUMARGS} == 0 )) || hasArg cuspatial; then
 
     cd ${REPODIR}/python/cuspatial
     SKBUILD_CMAKE_ARGS="-DCMAKE_PREFIX_PATH=${INSTALL_PREFIX};-DCMAKE_LIBRARY_PATH=${LIBCUSPATIAL_BUILD_DIR};${EXTRA_CMAKE_ARGS}" \
-        python -m pip install --no-build-isolation --no-deps .
+        python -m pip install --no-build-isolation --no-deps --config-settings rapidsai.disable-cuda=true .
 fi
 
 # Build and install the cuproj Python package
@@ -191,5 +191,5 @@ if (( ${NUMARGS} == 0 )) || hasArg cuproj; then
 
     cd ${REPODIR}/python/cuproj
     SKBUILD_CMAKE_ARGS="-DCMAKE_PREFIX_PATH=${INSTALL_PREFIX};-DCMAKE_LIBRARY_PATH=${LIBCUPROJ_BUILD_DIR};${EXTRA_CMAKE_ARGS}" \
-        python -m pip install --no-build-isolation --no-deps .
+        python -m pip install --no-build-isolation --no-deps --config-settings rapidsai.disable-cuda=true .
 fi
diff --git a/ci/build_cpp.sh b/ci/build_cpp.sh
index a4ae2b872..c23dac174 100755
--- a/ci/build_cpp.sh
+++ b/ci/build_cpp.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright (c) 2022, NVIDIA CORPORATION.
+# Copyright (c) 2022-2024, NVIDIA CORPORATION.
 
 set -euo pipefail
 
@@ -13,11 +13,9 @@ export CMAKE_GENERATOR=Ninja
 
 rapids-print-env
 
-version=$(rapids-generate-version)
-
 rapids-logger "Begin cpp build"
 
-RAPIDS_PACKAGE_VERSION=${version} rapids-conda-retry mambabuild \
+RAPIDS_PACKAGE_VERSION=$(rapids-generate-version) rapids-conda-retry mambabuild \
     conda/recipes/libcuspatial
 
 rapids-upload-conda-to-s3 cpp
diff --git a/ci/build_docs.sh b/ci/build_docs.sh
index 0d4e97488..84d0bad0f 100755
--- a/ci/build_docs.sh
+++ b/ci/build_docs.sh
@@ -12,7 +12,7 @@ PYTHON_CHANNEL="$(rapids-download-conda-from-s3 python)"
 
 rapids-dependency-file-generator \
   --output conda \
-  --file_key docs \
+  --file-key docs \
   --matrix "cuda=${RAPIDS_CUDA_VERSION%.*};arch=$(arch);py=${RAPIDS_PY_VERSION}" \
   --prepend-channel "${CPP_CHANNEL}" --prepend-channel "${PYTHON_CHANNEL}" | tee env.yaml
 
@@ -23,7 +23,7 @@ rapids-print-env
 
 export RAPIDS_VERSION="$(rapids-version)"
 export RAPIDS_VERSION_MAJOR_MINOR="$(rapids-version-major-minor)"
-export RAPIDS_VERSION_NUMBER="24.06"
+export RAPIDS_VERSION_NUMBER="24.08"
 export RAPIDS_DOCS_DIR="$(mktemp -d)"
 
 rapids-logger "Build cuSpatial CPP docs"
@@ -43,19 +43,15 @@ popd
 rapids-logger "Build cuSpatial Python docs"
 pushd docs
 sphinx-build -b dirhtml source _html -W
-sphinx-build -b text source _text -W
-mkdir -p "${RAPIDS_DOCS_DIR}/cuspatial/"{html,txt}
+mkdir -p "${RAPIDS_DOCS_DIR}/cuspatial/html"
 mv _html/* "${RAPIDS_DOCS_DIR}/cuspatial/html"
-mv _text/* "${RAPIDS_DOCS_DIR}/cuspatial/txt"
 popd
 
 rapids-logger "Build cuProj Python docs"
 pushd docs/cuproj
 sphinx-build -b dirhtml source _html -W
-sphinx-build -b text source _text -W
-mkdir -p "${RAPIDS_DOCS_DIR}/cuproj/"{html,txt}
+mkdir -p "${RAPIDS_DOCS_DIR}/cuproj/html"
 mv _html/* "${RAPIDS_DOCS_DIR}/cuproj/html"
-mv _text/* "${RAPIDS_DOCS_DIR}/cuproj/txt"
 popd
 
 rapids-upload-docs
diff --git a/ci/build_python.sh b/ci/build_python.sh
index a0ac89948..fc1066fc7 100755
--- a/ci/build_python.sh
+++ b/ci/build_python.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright (c) 2022, NVIDIA CORPORATION.
+# Copyright (c) 2022-2024, NVIDIA CORPORATION.
 
 set -euo pipefail
 
@@ -15,13 +15,7 @@ rapids-print-env
 
 package_dir="python"
 
-version=$(rapids-generate-version)
-commit=$(git rev-parse HEAD)
-
-echo "${version}" > VERSION
-for package_name in cuspatial cuproj; do
-    sed -i "/^__git_commit__/ s/= .*/= \"${commit}\"/g" "${package_dir}/${package_name}/${package_name}/_version.py"
-done
+rapids-generate-version > ./VERSION
 
 CPP_CHANNEL=$(rapids-download-conda-from-s3 cpp)
 
@@ -29,7 +23,7 @@ rapids-logger "Begin py build cuSpatial"
 
 # TODO: Remove `--no-test` flag once importing on a CPU
 # node works correctly
-RAPIDS_PACKAGE_VERSION=${version} rapids-conda-retry mambabuild \
+RAPIDS_PACKAGE_VERSION=$(head -1 ./VERSION) rapids-conda-retry mambabuild \
   --no-test \
   --channel "${CPP_CHANNEL}" \
   conda/recipes/cuspatial
@@ -38,7 +32,7 @@ rapids-logger "Begin py build cuProj"
 
 # TODO: Remove `--no-test` flag once importing on a CPU
 # node works correctly
-RAPIDS_PACKAGE_VERSION=${version} rapids-conda-retry mambabuild \
+RAPIDS_PACKAGE_VERSION=$(head -1 ./VERSION) rapids-conda-retry mambabuild \
   --no-test \
   --channel "${CPP_CHANNEL}" \
   conda/recipes/cuproj
diff --git a/ci/build_wheel.sh b/ci/build_wheel.sh
index 231b111b2..5e6eb944e 100755
--- a/ci/build_wheel.sh
+++ b/ci/build_wheel.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright (c) 2023, NVIDIA CORPORATION.
+# Copyright (c) 2023-2024, NVIDIA CORPORATION.
 
 set -euo pipefail
 
@@ -9,45 +9,10 @@ package_dir=$2
 source rapids-configure-sccache
 source rapids-date-string
 
-version=$(rapids-generate-version)
-commit=$(git rev-parse HEAD)
+rapids-generate-version > ./VERSION
 
 RAPIDS_PY_CUDA_SUFFIX="$(rapids-wheel-ctk-name-gen ${RAPIDS_CUDA_VERSION})"
 
-# This is the version of the suffix with a preceding hyphen. It's used
-# everywhere except in the final wheel name.
-PACKAGE_CUDA_SUFFIX="-${RAPIDS_PY_CUDA_SUFFIX}"
-
-# Patch project metadata files to include the CUDA version suffix and version override.
-pyproject_file="${package_dir}/pyproject.toml"
-
-sed -i "s/name = \"${package_name}\"/name = \"${package_name}${PACKAGE_CUDA_SUFFIX}\"/g" ${pyproject_file}
-echo "${version}" > VERSION
-sed -i "/^__git_commit__/ s/= .*/= \"${commit}\"/g" "${package_dir}/${package_name}/_version.py"
-
-# For nightlies we want to ensure that we're pulling in alphas as well. The
-# easiest way to do so is to augment the spec with a constraint containing a
-# min alpha version that doesn't affect the version bounds but does allow usage
-# of alpha versions for that dependency without --pre
-alpha_spec=''
-if ! rapids-is-release-build; then
-    alpha_spec=',>=0.0.0a0'
-fi
-
-# Add CUDA version suffix to dependencies
-sed -r -i "s/rmm(.*)\"/rmm${PACKAGE_CUDA_SUFFIX}\1${alpha_spec}\"/g" ${pyproject_file}
-if [[ ${package_name} == "cuspatial" ]]; then
-    sed -r -i "s/cudf==(.*)\"/cudf${PACKAGE_CUDA_SUFFIX}==\1${alpha_spec}\"/g" ${pyproject_file}
-fi
-
-if [[ ${package_name} == "cuproj" ]]; then
-    sed -r -i "s/cuspatial==(.*)\"/cuspatial${PACKAGE_CUDA_SUFFIX}==\1${alpha_spec}\"/g" ${pyproject_file}
-fi
-
-if [[ $PACKAGE_CUDA_SUFFIX == "-cu12" ]]; then
-    sed -i "s/cupy-cuda11x/cupy-cuda12x/g" ${pyproject_file}
-fi
-
 cd "${package_dir}"
 
 python -m pip wheel . -w dist -vvv --no-deps --disable-pip-version-check
diff --git a/ci/check_style.sh b/ci/check_style.sh
index 1038b06f6..cbc369dc0 100755
--- a/ci/check_style.sh
+++ b/ci/check_style.sh
@@ -8,7 +8,7 @@ rapids-logger "Create checks conda environment"
 
 rapids-dependency-file-generator \
   --output conda \
-  --file_key checks \
+  --file-key checks \
   --matrix "cuda=${RAPIDS_CUDA_VERSION%.*};arch=$(arch);py=${RAPIDS_PY_VERSION}" | tee env.yaml
 
 rapids-mamba-retry env create --yes -f env.yaml -n checks
diff --git a/ci/release/update-version.sh b/ci/release/update-version.sh
index ae13d7629..d017e1123 100755
--- a/ci/release/update-version.sh
+++ b/ci/release/update-version.sh
@@ -57,10 +57,10 @@ DEPENDENCIES=(
 
 for DEP in "${DEPENDENCIES[@]}"; do
   for FILE in dependencies.yaml conda/environments/*.yaml; do
-    sed_runner "/-.* ${DEP}\(-cu[[:digit:]]\{2\}\)\{0,1\}==/ s/==.*/==${NEXT_SHORT_TAG_PEP440}.*/g" "${FILE}"
+    sed_runner "/-.* ${DEP}\(-cu[[:digit:]]\{2\}\)\{0,1\}==/ s/==.*/==${NEXT_SHORT_TAG_PEP440}.*,>=0.0.0a0/g" "${FILE}"
   done
-  sed_runner "s/${DEP}\(-cu[[:digit:]]\{2\}\)\{0,1\}==.*\",/${DEP}==${NEXT_SHORT_TAG_PEP440}.*\",/g" python/cuspatial/pyproject.toml
-  sed_runner "s/${DEP}\(-cu[[:digit:]]\{2\}\)\{0,1\}==.*\",/${DEP}==${NEXT_SHORT_TAG_PEP440}.*\",/g" python/cuproj/pyproject.toml
+  sed_runner "s/${DEP}\(-cu[[:digit:]]\{2\}\)\{0,1\}==.*\",/${DEP}==${NEXT_SHORT_TAG_PEP440}.*,>=0.0.0a0\",/g" python/cuspatial/pyproject.toml
+  sed_runner "s/${DEP}\(-cu[[:digit:]]\{2\}\)\{0,1\}==.*\",/${DEP}==${NEXT_SHORT_TAG_PEP440}.*,>=0.0.0a0\",/g" python/cuproj/pyproject.toml
 done
 
 # Dependency versions in dependencies.yaml
diff --git a/conda/environments/all_cuda-118_arch-x86_64.yaml b/conda/environments/all_cuda-118_arch-x86_64.yaml
index ae933a67c..513f2b28b 100644
--- a/conda/environments/all_cuda-118_arch-x86_64.yaml
+++ b/conda/environments/all_cuda-118_arch-x86_64.yaml
@@ -8,24 +8,25 @@ channels:
 dependencies:
 - c-compiler
 - clang-tools=16.0.6
-- cmake>=3.26.4
+- cmake>=3.26.4,!=3.30.0
 - cuda-version=11.8
 - cudatoolkit
-- cudf==24.6.*
-- cuml==24.6.*
+- cudf==24.8.*,>=0.0.0a0
+- cuml==24.8.*,>=0.0.0a0
 - cupy>=12.0.0
 - curl
 - cxx-compiler
 - cython>=3.0.0
 - doxygen
 - gcc_linux-64=11.*
+- geopandas<1
 - geopandas>=0.11.0
 - ipython
 - ipywidgets
-- libcudf==24.6.*
-- libcuspatial-tests==24.6.*
-- libcuspatial==24.6.*
-- librmm==24.6.*
+- libcudf==24.8.*,>=0.0.0a0
+- libcuspatial-tests==24.8.*
+- libcuspatial==24.8.*
+- librmm==24.8.*,>=0.0.0a0
 - myst-parser
 - nbsphinx
 - ninja
@@ -33,6 +34,7 @@ dependencies:
 - numpy>=1.23,<2.0a0
 - numpydoc
 - nvcc_linux-64=11.8
+- osmnx>=1.9.3
 - pre-commit
 - proj
 - pydata-sphinx-theme!=0.14.2
@@ -41,7 +43,8 @@ dependencies:
 - pytest-cov
 - pytest-xdist
 - python>=3.9,<3.12
-- rmm==24.6.*
+- rapids-build-backend>=0.3.0,<0.4.0.dev0
+- rmm==24.8.*,>=0.0.0a0
 - scikit-build-core>=0.7.0
 - scikit-image
 - shapely
diff --git a/conda/environments/all_cuda-122_arch-x86_64.yaml b/conda/environments/all_cuda-125_arch-x86_64.yaml
similarity index 69%
rename from conda/environments/all_cuda-122_arch-x86_64.yaml
rename to conda/environments/all_cuda-125_arch-x86_64.yaml
index 4f48db253..4c245f627 100644
--- a/conda/environments/all_cuda-122_arch-x86_64.yaml
+++ b/conda/environments/all_cuda-125_arch-x86_64.yaml
@@ -8,33 +8,35 @@ channels:
 dependencies:
 - c-compiler
 - clang-tools=16.0.6
-- cmake>=3.26.4
+- cmake>=3.26.4,!=3.30.0
 - cuda-cudart-dev
 - cuda-cupti-dev
 - cuda-nvcc
 - cuda-nvrtc-dev
-- cuda-version=12.2
-- cudf==24.6.*
-- cuml==24.6.*
+- cuda-version=12.5
+- cudf==24.8.*,>=0.0.0a0
+- cuml==24.8.*,>=0.0.0a0
 - cupy>=12.0.0
 - curl
 - cxx-compiler
 - cython>=3.0.0
 - doxygen
 - gcc_linux-64=11.*
+- geopandas<1
 - geopandas>=0.11.0
 - ipython
 - ipywidgets
-- libcudf==24.6.*
-- libcuspatial-tests==24.6.*
-- libcuspatial==24.6.*
-- librmm==24.6.*
+- libcudf==24.8.*,>=0.0.0a0
+- libcuspatial-tests==24.8.*
+- libcuspatial==24.8.*
+- librmm==24.8.*,>=0.0.0a0
 - myst-parser
 - nbsphinx
 - ninja
 - notebook
 - numpy>=1.23,<2.0a0
 - numpydoc
+- osmnx>=1.9.3
 - pre-commit
 - proj
 - pydata-sphinx-theme!=0.14.2
@@ -43,11 +45,12 @@ dependencies:
 - pytest-cov
 - pytest-xdist
 - python>=3.9,<3.12
-- rmm==24.6.*
+- rapids-build-backend>=0.3.0,<0.4.0.dev0
+- rmm==24.8.*,>=0.0.0a0
 - scikit-build-core>=0.7.0
 - scikit-image
 - shapely
 - sphinx<6
 - sqlite
 - sysroot_linux-64==2.17
-name: all_cuda-122_arch-x86_64
+name: all_cuda-125_arch-x86_64
diff --git a/conda/recipes/cuproj/conda_build_config.yaml b/conda/recipes/cuproj/conda_build_config.yaml
index 67f968412..2186d11ca 100644
--- a/conda/recipes/cuproj/conda_build_config.yaml
+++ b/conda/recipes/cuproj/conda_build_config.yaml
@@ -17,7 +17,7 @@ c_stdlib_version:
   - "2.17"
 
 cmake_version:
-  - ">=3.26.4"
+  - ">=3.26.4,!=3.30.0"
 
 # Workaround until proj 9.3.1 migration completes
 proj:
diff --git a/conda/recipes/cuproj/meta.yaml b/conda/recipes/cuproj/meta.yaml
index 4721daefb..516ea4a5a 100644
--- a/conda/recipes/cuproj/meta.yaml
+++ b/conda/recipes/cuproj/meta.yaml
@@ -51,6 +51,7 @@ requirements:
     - {{ compiler('cuda') }}
     {% endif %}
     - cuda-version ={{ cuda_version }}
+    - cmake {{ cmake_version }}
     - ninja
     - {{ stdlib("c") }}
   host:
@@ -58,12 +59,11 @@ requirements:
     - cuda-cudart-dev
     {% endif %}
     - cuda-version ={{ cuda_version }}
-    - cmake {{ cmake_version }}
     - cython >=3.0.0
     - python
+    - rapids-build-backend >=0.3.0,<0.4.0.dev0
     - rmm ={{ minor_version }}
     - scikit-build-core >=0.7.0
-    - setuptools
     - proj
     - sqlite
   run:
diff --git a/conda/recipes/cuspatial/conda_build_config.yaml b/conda/recipes/cuspatial/conda_build_config.yaml
index e3ca633eb..001878ff2 100644
--- a/conda/recipes/cuspatial/conda_build_config.yaml
+++ b/conda/recipes/cuspatial/conda_build_config.yaml
@@ -17,4 +17,4 @@ c_stdlib_version:
   - "2.17"
 
 cmake_version:
-  - ">=3.26.4"
+  - ">=3.26.4,!=3.30.0"
diff --git a/conda/recipes/cuspatial/meta.yaml b/conda/recipes/cuspatial/meta.yaml
index 1bc68677f..c06b4fa06 100644
--- a/conda/recipes/cuspatial/meta.yaml
+++ b/conda/recipes/cuspatial/meta.yaml
@@ -51,6 +51,7 @@ requirements:
     - {{ compiler('cuda') }}
     {% endif %}
     - cuda-version ={{ cuda_version }}
+    - cmake {{ cmake_version }}
     - ninja
     - {{ stdlib("c") }}
   host:
@@ -58,14 +59,13 @@ requirements:
     - cuda-cudart-dev
     {% endif %}
     - cuda-version ={{ cuda_version }}
-    - cmake {{ cmake_version }}
     - cudf ={{ minor_version }}
     - cython >=3.0.0
     - libcuspatial ={{ version }}
     - python
+    - rapids-build-backend >=0.3.0,<0.4.0.dev0
     - rmm ={{ minor_version }}
     - scikit-build-core >=0.7.0
-    - setuptools
   run:
     {% if cuda_major == "11" %}
     - cudatoolkit
diff --git a/conda/recipes/libcuspatial/conda_build_config.yaml b/conda/recipes/libcuspatial/conda_build_config.yaml
index 51cfd482f..01b775ad8 100644
--- a/conda/recipes/libcuspatial/conda_build_config.yaml
+++ b/conda/recipes/libcuspatial/conda_build_config.yaml
@@ -11,7 +11,7 @@ cuda11_compiler:
   - nvcc
 
 cmake_version:
-  - ">=3.26.4"
+  - ">=3.26.4,!=3.30.0"
 
 gtest_version:
   - ">=1.13.0"
diff --git a/cpp/include/cuspatial/range/multipolygon_range.cuh b/cpp/include/cuspatial/range/multipolygon_range.cuh
index 1aae07346..83379ba97 100644
--- a/cpp/include/cuspatial/range/multipolygon_range.cuh
+++ b/cpp/include/cuspatial/range/multipolygon_range.cuh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, NVIDIA CORPORATION.
+ * Copyright (c) 2023-2024, NVIDIA CORPORATION.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -115,10 +115,10 @@ class multipolygon_range {
   CUSPATIAL_HOST_DEVICE auto point_end();
 
   /// Return the iterator to the first geometry offset in the range.
-  CUSPATIAL_HOST_DEVICE auto geometry_offset_begin() { return _part_begin; }
+  CUSPATIAL_HOST_DEVICE auto geometry_offset_begin() { return _geometry_begin; }
 
   /// Return the iterator to the one past the last geometry offset in the range.
-  CUSPATIAL_HOST_DEVICE auto geometry_offset_end() { return _part_end; }
+  CUSPATIAL_HOST_DEVICE auto geometry_offset_end() { return _geometry_end; }
 
   /// Return the iterator to the first part offset in the range.
   CUSPATIAL_HOST_DEVICE auto part_offset_begin() { return _part_begin; }
diff --git a/dependencies.yaml b/dependencies.yaml
index bd5d25e11..764c000fd 100644
--- a/dependencies.yaml
+++ b/dependencies.yaml
@@ -3,7 +3,7 @@ files:
   all:
     output: conda
     matrix:
-      cuda: ["11.8", "12.2"]
+      cuda: ["11.8", "12.5"]
       arch: [x86_64]
     includes:
       - build_cpp
@@ -17,8 +17,10 @@ files:
       - depends_on_cudf
       - depends_on_cuml
       - depends_on_cupy
+      - rapids_build_skbuild
       - run_python_cuspatial
       - test_libcuspatial
+      - test_notebooks
       - test_python_cuspatial
       - test_python_cuproj
       - notebooks
@@ -40,6 +42,7 @@ files:
     includes:
       - cuda_version
       - depends_on_cuml
+      - test_notebooks
       - notebooks
       - py_version
       - test_cuspatial
@@ -60,6 +63,14 @@ files:
     pyproject_dir: python/cuspatial
     extras:
       table: build-system
+    includes:
+      - rapids_build_skbuild
+  py_rapids_build_cuspatial:
+    output: [pyproject]
+    pyproject_dir: python/cuspatial
+    extras:
+      table: tool.rapids-build-backend
+      key: requires
     includes:
       - depends_on_rmm
       - depends_on_cudf
@@ -88,6 +99,14 @@ files:
     pyproject_dir: python/cuproj
     extras:
       table: build-system
+    includes:
+      - rapids_build_skbuild
+  py_rapids_build_cuproj:
+    output: [pyproject]
+    pyproject_dir: python/cuproj
+    extras:
+      table: tool.rapids-build-backend
+      key: requires
     includes:
       - depends_on_rmm
       - build_cpp_cuproj
@@ -123,13 +142,13 @@ dependencies:
       - output_types: [conda, requirements, pyproject]
         packages:
           - ninja
-          - cmake>=3.26.4
+          - cmake>=3.26.4,!=3.30.0
       - output_types: conda
         packages:
           - c-compiler
           - cxx-compiler
-          - libcudf==24.6.*
-          - librmm==24.6.*
+          - libcudf==24.8.*,>=0.0.0a0
+          - librmm==24.8.*,>=0.0.0a0
           - proj
           - sqlite
     specific:
@@ -166,12 +185,12 @@ dependencies:
       - output_types: [conda, requirements, pyproject]
         packages:
           - ninja
-          - cmake>=3.26.4
+          - cmake>=3.26.4,!=3.30.0
       - output_types: conda
         packages:
           - c-compiler
           - cxx-compiler
-          - librmm==24.6.*
+          - librmm==24.8.*,>=0.0.0a0
           - proj
           - sqlite
     specific:
@@ -208,12 +227,6 @@ dependencies:
       - output_types: [conda, requirements, pyproject]
         packages:
           - cython>=3.0.0
-      - output_types: conda
-        packages:
-          - scikit-build-core>=0.7.0
-      - output_types: [requirements, pyproject]
-        packages:
-          - scikit-build-core[pyproject]>=0.7.0
     specific:
       - output_types: conda
         matrices:
@@ -232,7 +245,17 @@ dependencies:
       - output_types: [requirements, pyproject]
         packages:
           - wheel
-          - setuptools
+  rapids_build_skbuild:
+    common:
+      - output_types: [conda, requirements, pyproject]
+        packages:
+          - &rapids_build_backend rapids-build-backend>=0.3.0,<0.4.0.dev0
+      - output_types: conda
+        packages:
+          - scikit-build-core>=0.7.0
+      - output_types: [requirements, pyproject]
+        packages:
+          - scikit-build-core[pyproject]>=0.7.0
   cuda_version:
     specific:
       - output_types: conda
@@ -261,6 +284,10 @@ dependencies:
               cuda: "12.2"
             packages:
               - cuda-version=12.2
+          - matrix:
+              cuda: "12.5"
+            packages:
+              - cuda-version=12.5
   cuda:
     specific:
       - output_types: conda
@@ -313,6 +340,15 @@ dependencies:
       - output_types: [conda]
         packages:
           - curl
+  # TODO: Remove geopandas.dataset usage in cuspatial_api_examples.ipynb
+  test_notebooks:
+    common:
+      - output_types: [conda, requirements, pyproject]
+        packages:
+          - geopandas<1
+      - output_types: conda
+        packages:
+          - osmnx>=1.9.3
   py_version:
     specific:
       - output_types: conda
@@ -362,7 +398,7 @@ dependencies:
     common:
       - output_types: conda
         packages:
-          - &rmm_conda rmm==24.6.*
+          - &rmm_unsuffixed rmm==24.8.*,>=0.0.0a0
       - output_types: requirements
         packages:
           # pip recognizes the index as a global option for the requirements.txt file
@@ -371,19 +407,23 @@ dependencies:
     specific:
       - output_types: [requirements, pyproject]
         matrices:
-          - matrix: {cuda: "12.*"}
+          - matrix:
+              cuda: "12.*"
+              cuda_suffixed: "true"
             packages:
-              - rmm-cu12==24.6.*
-          - matrix: {cuda: "11.*"}
+              - rmm-cu12==24.8.*,>=0.0.0a0
+          - matrix:
+              cuda: "11.*"
+              cuda_suffixed: "true"
             packages:
-              - rmm-cu11==24.6.*
-          - {matrix: null, packages: [*rmm_conda]}
+              - rmm-cu11==24.8.*,>=0.0.0a0
+          - {matrix: null, packages: [*rmm_unsuffixed]}
 
   depends_on_cudf:
     common:
       - output_types: conda
         packages:
-          - &cudf_conda cudf==24.6.*
+          - &cudf_unsuffixed cudf==24.8.*,>=0.0.0a0
       - output_types: requirements
         packages:
           # pip recognizes the index as a global option for the requirements.txt file
@@ -392,19 +432,23 @@ dependencies:
     specific:
       - output_types: [requirements, pyproject]
         matrices:
-          - matrix: {cuda: "12.*"}
+          - matrix:
+              cuda: "12.*"
+              cuda_suffixed: "true"
             packages:
-              - cudf-cu12==24.6.*
-          - matrix: {cuda: "11.*"}
+              - cudf-cu12==24.8.*,>=0.0.0a0
+          - matrix:
+              cuda: "11.*"
+              cuda_suffixed: "true"
             packages:
-              - cudf-cu11==24.6.*
-          - {matrix: null, packages: [*cudf_conda]}
+              - cudf-cu11==24.8.*,>=0.0.0a0
+          - {matrix: null, packages: [*cudf_unsuffixed]}
 
   depends_on_cuml:
     common:
       - output_types: conda
         packages:
-          - &cuml_conda cuml==24.6.*
+          - &cuml_unsuffixed cuml==24.8.*,>=0.0.0a0
       - output_types: requirements
         packages:
           # pip recognizes the index as a global option for the requirements.txt file
@@ -413,19 +457,23 @@ dependencies:
     specific:
       - output_types: [requirements, pyproject]
         matrices:
-          - matrix: {cuda: "12.*"}
+          - matrix:
+              cuda: "12.*"
+              cuda_suffixed: "true"
             packages:
-              - cuml-cu12==24.6.*
-          - matrix: {cuda: "11.*"}
+              - cuml-cu12==24.8.*,>=0.0.0a0
+          - matrix:
+              cuda: "11.*"
+              cuda_suffixed: "true"
             packages:
-              - cuml-cu11==24.6.*
-          - {matrix: null, packages: [*cuml_conda]}
+              - cuml-cu11==24.8.*,>=0.0.0a0
+          - {matrix: null, packages: [*cuml_unsuffixed]}
 
   depends_on_cuspatial:
     common:
       - output_types: conda
         packages:
-          - &cuspatial_conda cuspatial==24.6.*
+          - &cuspatial_unsuffixed cuspatial==24.8.*,>=0.0.0a0
       - output_types: requirements
         packages:
           # pip recognizes the index as a global option for the requirements.txt file
@@ -434,19 +482,25 @@ dependencies:
     specific:
       - output_types: [requirements, pyproject]
         matrices:
-          - matrix: {cuda: "12.*"}
+          - matrix:
+              cuda: "12.*"
+              cuda_suffixed: "true"
             packages:
-              - cuspatial-cu12==24.6.*
-          - matrix: {cuda: "11.*"}
+              - cuspatial-cu12==24.8.*,>=0.0.0a0
+          - matrix:
+              cuda: "11.*"
+              cuda_suffixed: "true"
             packages:
-              - cuspatial-cu11==24.6.*
-          - {matrix: null, packages: [*cuspatial_conda]}
+              - cuspatial-cu11==24.8.*,>=0.0.0a0
+          - {matrix: null, packages: [*cuspatial_unsuffixed]}
 
   depends_on_cupy:
     common:
       - output_types: conda
         packages:
           - cupy>=12.0.0
+    # NOTE: cupy dependency is not broken into groups by a 'cuda_suffixed' selector like
+    #       other packages in this file because DLFW builds expect it to have a -cuda{nn}x suffix
     specific:
       - output_types: [requirements, pyproject]
         matrices:
@@ -455,18 +509,18 @@ dependencies:
               - cupy-cuda12x>=12.0.0
           - matrix: {cuda: "11.*"}
             packages:
-              - cupy-cuda11x>=12.0.0
-          - {matrix: null, packages: [cupy-cuda11x>=12.0.0]}
+              - &cupy_cu11 cupy-cuda11x>=12.0.0
+          - {matrix: null, packages: [*cupy_cu11]}
   test_libcuspatial:
     common:
       - output_types: conda
         packages:
-          - libcuspatial==24.6.*
-          - libcuspatial-tests==24.6.*
+          - libcuspatial==24.8.*
+          - libcuspatial-tests==24.8.*
   test_cuspatial:
     common:
       - output_types: conda
         packages:
-          - libcuspatial==24.6.*
-          - cuspatial==24.6.*
-          - cuproj==24.6.*
+          - libcuspatial==24.8.*
+          - cuspatial==24.8.*,>=0.0.0a0
+          - cuproj==24.8.*,>=0.0.0a0
diff --git a/docs/cuproj/source/user_guide/cuproj_api_examples.ipynb b/docs/cuproj/source/user_guide/cuproj_api_examples.ipynb
index 8dd25cb28..1250daf54 100644
--- a/docs/cuproj/source/user_guide/cuproj_api_examples.ipynb
+++ b/docs/cuproj/source/user_guide/cuproj_api_examples.ipynb
@@ -45,7 +45,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "# !conda create -n rapids-24.06 --solver=libmamba -c rapidsai -c conda-forge -c nvidia \\ \n",
+    "# !conda create -n rapids-24.08 --solver=libmamba -c rapidsai -c conda-forge -c nvidia \\ \n",
     "#     cuproj-23.12 python=3.10 cuda-version=12.0"
    ]
   },
diff --git a/docs/source/user_guide/cuspatial_api_examples.ipynb b/docs/source/user_guide/cuspatial_api_examples.ipynb
index a20b8cf1e..90ac97083 100644
--- a/docs/source/user_guide/cuspatial_api_examples.ipynb
+++ b/docs/source/user_guide/cuspatial_api_examples.ipynb
@@ -52,13 +52,13 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": null,
    "id": "7265f9d2-9203-4da2-bbb2-b35c7f933641",
    "metadata": {},
    "outputs": [],
    "source": [
-    "# !conda create -n rapids-24.06 -c rapidsai -c conda-forge -c nvidia \\ \n",
-    "#     cuspatial=24.06 python=3.9 cudatoolkit=11.5 "
+    "# !conda create -n rapids-24.08 -c rapidsai -c conda-forge -c nvidia \\ \n",
+    "#     cuspatial=24.08 python=3.9 cudatoolkit=11.5 "
    ]
   },
   {
@@ -96,7 +96,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": 1,
    "id": "88d05bb9-c924-4d0b-8736-cd5183602d76",
    "metadata": {
     "tags": []
@@ -108,6 +108,7 @@
     "import cudf\n",
     "import cupy\n",
     "import geopandas\n",
+    "import os\n",
     "import pandas as pd\n",
     "import numpy as np\n",
     "from shapely.geometry import *\n",
@@ -116,7 +117,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": 2,
    "id": "4937d4aa-4e32-49ab-a22e-96dfb0098d07",
    "metadata": {
     "tags": []
@@ -156,46 +157,60 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 3,
    "id": "255fbfbe-8be1-498c-9a26-f4a3f31bdded",
    "metadata": {
     "tags": []
    },
    "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "/tmp/ipykernel_5364/3038749724.py:1: FutureWarning: The geopandas.dataset module is deprecated and will be removed in GeoPandas 1.0. You can get the original 'naturalearth_lowres' data from https://www.naturalearthdata.com/downloads/110m-cultural-vectors/.\n",
-	  "  host_dataframe = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\"))\n"
-     ]
-    },
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "       pop_est      continent                      name iso_a3  gdp_md_est  \\\n",
-      "0     889953.0        Oceania                      Fiji    FJI        5496   \n",
-      "1   58005463.0         Africa                  Tanzania    TZA       63177   \n",
-      "2     603253.0         Africa                 W. Sahara    ESH         907   \n",
-      "3   37589262.0  North America                    Canada    CAN     1736425   \n",
-      "4  328239523.0  North America  United States of America    USA    21433226   \n",
+      "        featurecla  scalerank  LABELRANK                   SOVEREIGNT SOV_A3  \\\n",
+      "0  Admin-0 country          1          6                         Fiji    FJI   \n",
+      "1  Admin-0 country          1          3  United Republic of Tanzania    TZA   \n",
+      "2  Admin-0 country          1          7               Western Sahara    SAH   \n",
+      "3  Admin-0 country          1          2                       Canada    CAN   \n",
+      "4  Admin-0 country          1          2     United States of America    US1   \n",
+      "\n",
+      "   ADM0_DIF  LEVEL               TYPE TLC                        ADMIN  ...  \\\n",
+      "0         0      2  Sovereign country   1                         Fiji  ...   \n",
+      "1         0      2  Sovereign country   1  United Republic of Tanzania  ...   \n",
+      "2         0      2      Indeterminate   1               Western Sahara  ...   \n",
+      "3         0      2  Sovereign country   1                       Canada  ...   \n",
+      "4         1      2            Country   1     United States of America  ...   \n",
+      "\n",
+      "      FCLASS_TR     FCLASS_ID     FCLASS_PL FCLASS_GR  FCLASS_IT  \\\n",
+      "0          None          None          None      None       None   \n",
+      "1          None          None          None      None       None   \n",
+      "2  Unrecognized  Unrecognized  Unrecognized      None       None   \n",
+      "3          None          None          None      None       None   \n",
+      "4          None          None          None      None       None   \n",
+      "\n",
+      "      FCLASS_NL FCLASS_SE  FCLASS_BD FCLASS_UA  \\\n",
+      "0          None      None       None      None   \n",
+      "1          None      None       None      None   \n",
+      "2  Unrecognized      None       None      None   \n",
+      "3          None      None       None      None   \n",
+      "4          None      None       None      None   \n",
       "\n",
       "                                            geometry  \n",
-      "0  MULTIPOLYGON (((180.00000 -16.06713, 180.00000...  \n",
-      "1  POLYGON ((33.90371 -0.95000, 34.07262 -1.05982...  \n",
+      "0  MULTIPOLYGON (((180 -16.06713, 180 -16.55522, ...  \n",
+      "1  POLYGON ((33.90371 -0.95, 34.07262 -1.05982, 3...  \n",
       "2  POLYGON ((-8.66559 27.65643, -8.66512 27.58948...  \n",
-      "3  MULTIPOLYGON (((-122.84000 49.00000, -122.9742...  \n",
-      "4  MULTIPOLYGON (((-122.84000 49.00000, -120.0000...  \n",
+      "3  MULTIPOLYGON (((-122.84 49, -122.97421 49.0025...  \n",
+      "4  MULTIPOLYGON (((-122.84 49, -120 49, -117.0312...  \n",
+      "\n",
+      "[5 rows x 169 columns]\n",
       "(GPU)\n",
       "\n"
      ]
     }
    ],
    "source": [
-    "host_dataframe = geopandas.read_file(geopandas.datasets.get_path(\n",
-    "    \"naturalearth_lowres\"\n",
-    "))\n",
+    "host_dataframe = geopandas.read_file('https://naturalearth.s3.amazonaws.com/110m_cultural/ne_110m_admin_0_countries.zip')\n",
+    "host_dataframe = host_dataframe.set_crs(4326)\n",
     "gpu_dataframe = cuspatial.from_geopandas(host_dataframe)\n",
     "print(gpu_dataframe.head())"
    ]
@@ -225,7 +240,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": 4,
    "id": "956451e2-a520-441d-a939-575ed179917b",
    "metadata": {
     "tags": []
@@ -235,51 +250,44 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "        pop_est   continent         name iso_a3  gdp_md_est  \\\n",
-      "103  38041754.0        Asia  Afghanistan    AFG       19291   \n",
-      "125   2854191.0      Europe      Albania    ALB       15279   \n",
-      "82   43053054.0      Africa      Algeria    DZA      171091   \n",
-      "74   31825295.0      Africa       Angola    AGO       88815   \n",
-      "159      4490.0  Antarctica   Antarctica    ATA         898   \n",
-      "..          ...         ...          ...    ...         ...   \n",
-      "2      603253.0      Africa    W. Sahara    ESH         907   \n",
-      "157  29161922.0        Asia        Yemen    YEM       22581   \n",
-      "70   17861030.0      Africa       Zambia    ZMB       23309   \n",
-      "48   14645468.0      Africa     Zimbabwe    ZWE       21440   \n",
-      "73    1148130.0      Africa     eSwatini    SWZ        4471   \n",
+      "          featurecla  scalerank  LABELRANK   SOVEREIGNT SOV_A3  ADM0_DIF  \\\n",
+      "103  Admin-0 country          1          3  Afghanistan    AFG         0   \n",
+      "125  Admin-0 country          1          6      Albania    ALB         0   \n",
+      "82   Admin-0 country          1          3      Algeria    DZA         0   \n",
+      "74   Admin-0 country          1          3       Angola    AGO         0   \n",
+      "159  Admin-0 country          1          4   Antarctica    ATA         0   \n",
+      "\n",
+      "     LEVEL               TYPE TLC        ADMIN  ... FCLASS_TR  FCLASS_ID  \\\n",
+      "103      2  Sovereign country   1  Afghanistan  ...      None       None   \n",
+      "125      2  Sovereign country   1      Albania  ...      None       None   \n",
+      "82       2  Sovereign country   1      Algeria  ...      None       None   \n",
+      "74       2  Sovereign country   1       Angola  ...      None       None   \n",
+      "159      2      Indeterminate   1   Antarctica  ...      None       None   \n",
+      "\n",
+      "    FCLASS_PL FCLASS_GR  FCLASS_IT FCLASS_NL FCLASS_SE  FCLASS_BD FCLASS_UA  \\\n",
+      "103      None      None       None      None      None       None      None   \n",
+      "125      None      None       None      None      None       None      None   \n",
+      "82       None      None       None      None      None       None      None   \n",
+      "74       None      None       None      None      None       None      None   \n",
+      "159      None      None       None      None      None       None      None   \n",
       "\n",
       "                                              geometry  \n",
       "103  POLYGON ((66.51861 37.36278, 67.07578 37.35614...  \n",
-      "125  POLYGON ((21.02004 40.84273, 20.99999 40.58000...  \n",
-      "82   POLYGON ((-8.68440 27.39574, -8.66512 27.58948...  \n",
-      "74   MULTIPOLYGON (((12.99552 -4.78110, 12.63161 -4...  \n",
-      "159  MULTIPOLYGON (((-48.66062 -78.04702, -48.15140...  \n",
-      "..                                                 ...  \n",
-      "2    POLYGON ((-8.66559 27.65643, -8.66512 27.58948...  \n",
-      "157  POLYGON ((52.00001 19.00000, 52.78218 17.34974...  \n",
-      "70   POLYGON ((30.74001 -8.34001, 31.15775 -8.59458...  \n",
-      "48   POLYGON ((31.19141 -22.25151, 30.65987 -22.151...  \n",
-      "73   POLYGON ((32.07167 -26.73382, 31.86806 -27.177...  \n",
+      "125  POLYGON ((21.02004 40.84273, 20.99999 40.58, 2...  \n",
+      "82   POLYGON ((-8.6844 27.39574, -8.66512 27.58948,...  \n",
+      "74   MULTIPOLYGON (((12.99552 -4.7811, 12.63161 -4....  \n",
+      "159  MULTIPOLYGON (((-48.66062 -78.04702, -48.1514 ...  \n",
       "\n",
-      "[177 rows x 6 columns]\n",
+      "[5 rows x 169 columns]\n",
       "(GPU)\n",
       "\n"
      ]
-    },
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "/tmp/ipykernel_5364/567044009.py:1: FutureWarning: The geopandas.dataset module is deprecated and will be removed in GeoPandas 1.0. You can get the original 'naturalearth_lowres' data from https://www.naturalearthdata.com/downloads/110m-cultural-vectors/.\n",
-      "  host_dataframe = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\"))\n"
-     ]
     }
    ],
    "source": [
-    "host_dataframe = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\"))\n",
     "gpu_dataframe = cuspatial.from_geopandas(host_dataframe)\n",
-    "continents_dataframe = gpu_dataframe.sort_values(\"name\")\n",
-    "print(continents_dataframe)"
+    "continents_dataframe = gpu_dataframe.sort_values(\"NAME\")\n",
+    "print(continents_dataframe.head())"
    ]
   },
   {
@@ -298,20 +306,12 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 5,
    "id": "cd8d1c39-b44f-4d06-9e11-04c2dca4cf15",
    "metadata": {
     "tags": []
    },
    "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "/tmp/ipykernel_5364/1940355512.py:1: FutureWarning: The geopandas.dataset module is deprecated and will be removed in GeoPandas 1.0. You can get the original 'naturalearth_lowres' data from https://www.naturalearthdata.com/downloads/110m-cultural-vectors/.\n",
-      "  host_dataframe = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\"))\n"
-     ]
-    },
     {
      "data": {
       "image/svg+xml": [
@@ -321,17 +321,16 @@
        "<POLYGON ((66.519 37.363, 67.076 37.356, 67.83 37.145, 68.136 37.023, 68.859...>"
       ]
      },
-     "execution_count": 6,
+     "execution_count": 5,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "host_dataframe = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\"))\n",
     "gpu_dataframe = cuspatial.from_geopandas(host_dataframe)\n",
-    "sorted_dataframe = gpu_dataframe.sort_values(\"name\")\n",
-    "host_dataframe = sorted_dataframe.to_geopandas()\n",
-    "host_dataframe['geometry'].iloc[0]"
+    "sorted_dataframe = gpu_dataframe.sort_values(\"NAME\")\n",
+    "sorted_dataframe = sorted_dataframe.to_geopandas()\n",
+    "sorted_dataframe['geometry'].iloc[0]"
    ]
   },
   {
@@ -352,7 +351,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": 6,
    "id": "cb5acdad-53aa-418f-9948-8445515bd2b2",
    "metadata": {
     "tags": []
@@ -417,7 +416,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 7,
    "id": "03b75847-090d-40f8-8147-cb10b900d6ec",
    "metadata": {
     "tags": []
@@ -482,7 +481,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": 7,
    "id": "452f60cb-28cc-4ad8-8aa2-9d73e3d56ec6",
    "metadata": {
     "tags": []
@@ -493,11 +492,11 @@
      "output_type": "stream",
      "text": [
       "      x_min     y_min     x_max     y_max\n",
-      "0  0.000098  0.000243  0.999422  0.999068\n",
-      "1  0.000663  0.000414  0.999813  0.998456\n",
-      "2  0.000049  0.000220  0.999748  0.999220\n",
-      "3  0.000006  0.000303  0.999729  0.999762\n",
-      "4  0.001190  0.000074  0.999299  0.999858\n"
+      "0  0.000361  0.000170  0.999582  0.999485\n",
+      "1  0.000184  0.000647  0.999939  0.999884\n",
+      "2  0.000461  0.001395  0.999938  0.999297\n",
+      "3  0.000093  0.000073  0.999819  0.999544\n",
+      "4  0.000105  0.000112  0.999952  0.999013\n"
      ]
     }
    ],
@@ -525,7 +524,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": 8,
    "id": "9266aac4-f925-4fb7-b287-5f0b795d5756",
    "metadata": {
     "tags": []
@@ -542,18 +541,9 @@
       "3  55.928917  37.144994  73.055417  45.586804\n",
       "4  12.182337 -13.257227  31.174149   5.256088\n"
      ]
-    },
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "/tmp/ipykernel_5364/1016569337.py:1: FutureWarning: The geopandas.dataset module is deprecated and will be removed in GeoPandas 1.0. You can get the original 'naturalearth_lowres' data from https://www.naturalearthdata.com/downloads/110m-cultural-vectors/.\n",
-      "  host_dataframe = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\"))\n"
-     ]
     }
    ],
    "source": [
-    "host_dataframe = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\"))\n",
     "single_polygons = cuspatial.from_geopandas(\n",
     "    host_dataframe['geometry'][host_dataframe['geometry'].type == \"Polygon\"]\n",
     ")\n",
@@ -577,7 +567,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": 9,
    "id": "15b5bb38-702f-4360-b48c-2e49ffd650d7",
    "metadata": {
     "tags": []
@@ -588,11 +578,11 @@
      "output_type": "stream",
      "text": [
       "       minx      miny      maxx      maxy\n",
-      "0 -0.000002  0.000143  0.999522  0.999168\n",
-      "1  0.000563  0.000314  0.999913  0.998556\n",
-      "2 -0.000051  0.000120  0.999848  0.999320\n",
-      "3 -0.000094  0.000203  0.999829  0.999862\n",
-      "4  0.001090 -0.000026  0.999399  0.999958\n"
+      "0  0.000261  0.000070  0.999682  0.999585\n",
+      "1  0.000084  0.000547  1.000039  0.999984\n",
+      "2  0.000361  0.001295  1.000038  0.999397\n",
+      "3 -0.000007 -0.000027  0.999919  0.999644\n",
+      "4  0.000005  0.000012  1.000052  0.999113\n"
      ]
     }
    ],
@@ -625,7 +615,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": 10,
    "id": "a7a870dd-c0ae-41c1-a66c-cff4bd2db0ec",
    "metadata": {
     "tags": []
@@ -635,27 +625,18 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "0    POINT (112.174 -281.590)\n",
+      "0     POINT (112.174 -281.59)\n",
       "1     POINT (62.152 -280.852)\n",
       "2     POINT (-5.573 -257.391)\n",
       "3    POINT (-33.071 -243.849)\n",
-      "4    POINT (-98.002 -279.540)\n",
+      "4     POINT (-98.002 -279.54)\n",
       "dtype: geometry\n"
      ]
-    },
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "/tmp/ipykernel_5364/2658722012.py:1: FutureWarning: The geopandas.dataset module is deprecated and will be removed in GeoPandas 1.0. You can get the original 'naturalearth_lowres' data from https://www.naturalearthdata.com/downloads/110m-cultural-vectors/.\n",
-      "  host_dataframe = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\"))\n"
-     ]
     }
    ],
    "source": [
-    "host_dataframe = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\"))\n",
     "gpu_dataframe = cuspatial.from_geopandas(host_dataframe)\n",
-    "afghanistan = gpu_dataframe['geometry'][gpu_dataframe['name'] == 'Afghanistan']\n",
+    "afghanistan = gpu_dataframe['geometry'][gpu_dataframe['NAME'] == 'Afghanistan']\n",
     "points = cuspatial.GeoSeries.from_points_xy(afghanistan.polygons.xy)\n",
     "projected = cuspatial.sinusoidal_projection(\n",
     "    afghanistan.polygons.x.mean(),\n",
@@ -695,7 +676,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 13,
+   "execution_count": 11,
    "id": "e75b0352-0f80-404d-a113-f301601cd5a3",
    "metadata": {
     "tags": []
@@ -758,20 +739,12 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 14,
+   "execution_count": 12,
    "id": "70f66319-c4d2-4a93-ab98-0debcce4a719",
    "metadata": {
     "tags": []
    },
    "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "/tmp/ipykernel_5364/491857862.py:1: FutureWarning: The geopandas.dataset module is deprecated and will be removed in GeoPandas 1.0. You can get the original 'naturalearth_lowres' data from https://www.naturalearthdata.com/downloads/110m-cultural-vectors/.\n",
-      "  host_dataframe = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\"))\n"
-     ]
-    },
     {
      "data": {
       "text/plain": [
@@ -783,16 +756,15 @@
        "Name: None, dtype: float64"
       ]
      },
-     "execution_count": 14,
+     "execution_count": 12,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "host_dataframe = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\"))\n",
     "gpu_dataframe = cuspatial.from_geopandas(host_dataframe)\n",
     "polygons_first = gpu_dataframe['geometry'][0:10]\n",
-    "polygons_second = gpu_dataframe['geometry'][10:20]\n",
+    "polygons_second = gpu_dataframe['geometry'][10:30]\n",
     "\n",
     "points_first = polygons_first.polygons.xy[0:1000]\n",
     "points_second = polygons_second.polygons.xy[0:1000]\n",
@@ -818,7 +790,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 15,
+   "execution_count": 13,
    "id": "c32741b0-c550-4d0f-b494-45191f5b60fd",
    "metadata": {},
    "outputs": [
@@ -826,27 +798,12 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "    latitude  longitude  atlanta_lat  atlanta_lng  atlanta_dist\n",
-      "0    17.1167   -61.7833       33.749      -84.388  11961.556540\n",
-      "1    17.1333   -61.7833       33.749      -84.388  11963.392729\n",
-      "2    25.3330    55.5170       33.749      -84.388  12243.126130\n",
-      "3    25.2550    55.3640       33.749      -84.388  12233.867463\n",
-      "4    24.4330    54.6510       33.749      -84.388  12139.822218\n",
-      "5    24.2620    55.6090       33.749      -84.388  12124.483127\n",
-      "6    35.3170    69.0170       33.749      -84.388  13418.538383\n",
-      "7    34.2100    62.2280       33.749      -84.388  13258.725239\n",
-      "8    34.5660    69.2120       33.749      -84.388  13336.375942\n",
-      "9    31.5000    65.8500       33.749      -84.388  12976.749248\n",
-      "10   36.7167     3.2500       33.749      -84.388  13547.245294\n",
-      "11   30.5667     2.8667       33.749      -84.388  12866.528267\n",
-      "12   28.0500     9.6331       33.749      -84.388  12554.544289\n",
-      "13   22.8000     5.4331       33.749      -84.388  11990.825098\n",
-      "14   35.7297     0.6500       33.749      -84.388  13451.775999\n",
-      "15   36.9700     7.7900       33.749      -84.388  13553.372737\n",
-      "16   36.7800     3.0700       33.749      -84.388  13555.211584\n",
-      "17   36.8000     3.0300       33.749      -84.388  13557.641136\n",
-      "18   36.8000     3.0400       33.749      -84.388  13557.588738\n",
-      "19   36.7200     4.0500       33.749      -84.388  13543.496327\n"
+      "   latitude  longitude  atlanta_lat  atlanta_lng  atlanta_dist\n",
+      "0   17.1167   -61.7833       33.749      -84.388  11961.556540\n",
+      "1   17.1333   -61.7833       33.749      -84.388  11963.392729\n",
+      "2   25.3330    55.5170       33.749      -84.388  12243.126130\n",
+      "3   25.2550    55.3640       33.749      -84.388  12233.867463\n",
+      "4   24.4330    54.6510       33.749      -84.388  12139.822218\n"
      ]
     }
    ],
@@ -894,20 +851,12 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 16,
+   "execution_count": 14,
    "id": "35dfb7c9-1914-488a-b22e-8d0067ea7a8b",
    "metadata": {
     "tags": []
    },
    "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "/tmp/ipykernel_5364/1097934054.py:1: FutureWarning: The geopandas.dataset module is deprecated and will be removed in GeoPandas 1.0. You can get the original 'naturalearth_lowres' data from https://www.naturalearthdata.com/downloads/110m-cultural-vectors/.\n",
-      "  host_dataframe = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\"))\n"
-     ]
-    },
     {
      "name": "stdout",
      "output_type": "stream",
@@ -928,8 +877,6 @@
     }
    ],
    "source": [
-    "host_dataframe = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\"))\n",
-    "\n",
     "gpu_boundaries = cuspatial.from_geopandas(host_dataframe.geometry.boundary)\n",
     "zeros = cuspatial.pairwise_linestring_distance(\n",
     "    gpu_boundaries[0:50],\n",
@@ -961,37 +908,52 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": 15,
    "id": "40e9a41e-21af-47cc-a142-b19a67941f7f",
    "metadata": {
     "tags": []
    },
    "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "/tmp/ipykernel_5364/2846028812.py:2: FutureWarning: The geopandas.dataset module is deprecated and will be removed in GeoPandas 1.0. You can get the original 'naturalearth_lowres' data from https://www.naturalearthdata.com/downloads/110m-cultural-vectors/.\n",
-      "  host_dataframe = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\")).to_crs(3857)\n"
-     ]
-    },
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "       pop_est continent             name iso_a3  gdp_md_est  \\\n",
-      "1   58005463.0    Africa         Tanzania    TZA       63177   \n",
-      "2     603253.0    Africa        W. Sahara    ESH         907   \n",
-      "5   18513930.0      Asia       Kazakhstan    KAZ      181665   \n",
-      "6   33580650.0      Asia       Uzbekistan    UZB       57921   \n",
-      "11  86790567.0    Africa  Dem. Rep. Congo    COD       50400   \n",
+      "         featurecla  scalerank  LABELRANK                        SOVEREIGNT  \\\n",
+      "1   Admin-0 country          1          3       United Republic of Tanzania   \n",
+      "2   Admin-0 country          1          7                    Western Sahara   \n",
+      "5   Admin-0 country          1          3                        Kazakhstan   \n",
+      "6   Admin-0 country          1          3                        Uzbekistan   \n",
+      "11  Admin-0 country          1          2  Democratic Republic of the Congo   \n",
+      "\n",
+      "   SOV_A3  ADM0_DIF  LEVEL               TYPE TLC  \\\n",
+      "1     TZA         0      2  Sovereign country   1   \n",
+      "2     SAH         0      2      Indeterminate   1   \n",
+      "5     KA1         1      1        Sovereignty   1   \n",
+      "6     UZB         0      2  Sovereign country   1   \n",
+      "11    COD         0      2  Sovereign country   1   \n",
+      "\n",
+      "                               ADMIN  ...     FCLASS_ID     FCLASS_PL  \\\n",
+      "1        United Republic of Tanzania  ...          None          None   \n",
+      "2                     Western Sahara  ...  Unrecognized  Unrecognized   \n",
+      "5                         Kazakhstan  ...          None          None   \n",
+      "6                         Uzbekistan  ...          None          None   \n",
+      "11  Democratic Republic of the Congo  ...          None          None   \n",
+      "\n",
+      "   FCLASS_GR FCLASS_IT     FCLASS_NL FCLASS_SE FCLASS_BD  FCLASS_UA  \\\n",
+      "1       None      None          None      None      None       None   \n",
+      "2       None      None  Unrecognized      None      None       None   \n",
+      "5       None      None          None      None      None       None   \n",
+      "6       None      None          None      None      None       None   \n",
+      "11      None      None          None      None      None       None   \n",
       "\n",
-      "                                             geometry  border_distance  \n",
-      "1   POLYGON ((3774143.866 -105758.362, 3792946.708...      8047.288391  \n",
-      "2   POLYGON ((-964649.018 3205725.605, -964597.245...    593137.492497  \n",
-      "5   POLYGON ((9724867.413 6311418.173, 9640131.701...     37091.213890  \n",
-      "6   POLYGON ((6230350.563 5057973.384, 6225978.591...    278633.467299  \n",
-      "11  POLYGON ((3266113.592 -501451.658, 3286149.877...     35812.988244  \n",
+      "                                             geometry border_distance  \n",
+      "1   POLYGON ((3774143.866 -105758.362, 3792946.708...     8047.288391  \n",
+      "2   POLYGON ((-964649.018 3205725.605, -964597.245...   593137.492497  \n",
+      "5   POLYGON ((9724867.413 6311418.173, 9640131.701...    37091.213890  \n",
+      "6   POLYGON ((6230350.563 5057973.384, 6225978.591...   278633.467299  \n",
+      "11  POLYGON ((3266113.592 -501451.658, 3286149.877...    35812.988244  \n",
+      "\n",
+      "[5 rows x 170 columns]\n",
       "(GPU)\n",
       "\n"
      ]
@@ -999,8 +961,8 @@
    ],
    "source": [
     "# Convert input dataframe to Pseudo-Mercator projection.\n",
-    "host_dataframe = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\")).to_crs(3857)\n",
-    "polygons = host_dataframe[host_dataframe['geometry'].type == \"Polygon\"]\n",
+    "host_dataframe3857 = host_dataframe.to_crs(3857)\n",
+    "polygons = host_dataframe3857[host_dataframe3857['geometry'].type == \"Polygon\"]\n",
     "gpu_polygons = cuspatial.from_geopandas(polygons)\n",
     "# Extract mean_x and mean_y from each country\n",
     "mean_x = [gpu_polygons['geometry'].iloc[[ix]].polygons.x.mean() for ix in range(len(gpu_polygons))]\n",
@@ -1030,149 +992,65 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": 16,
    "id": "258c9a8c-7fe3-4047-80b7-00878d9fb2f1",
    "metadata": {
     "tags": []
    },
    "outputs": [
     {
-     "name": "stderr",
+     "name": "stdout",
      "output_type": "stream",
      "text": [
-      "/tmp/ipykernel_5364/3261459244.py:1: FutureWarning: The geopandas.dataset module is deprecated and will be removed in GeoPandas 1.0. You can get the original 'naturalearth_cities' data from https://www.naturalearthdata.com/downloads/110m-cultural-vectors/.\n",
-      "  cities = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_cities\")).to_crs(3857)\n",
-      "/tmp/ipykernel_5364/3261459244.py:2: FutureWarning: The geopandas.dataset module is deprecated and will be removed in GeoPandas 1.0. You can get the original 'naturalearth_lowres' data from https://www.naturalearthdata.com/downloads/110m-cultural-vectors/.\n",
-      "  countries = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\")).to_crs(3857)\n"
+      "        featurecla  scalerank  LABELRANK                   SOVEREIGNT SOV_A3  \\\n",
+      "0  Admin-0 country          1          6                         Fiji    FJI   \n",
+      "1  Admin-0 country          1          3  United Republic of Tanzania    TZA   \n",
+      "2  Admin-0 country          1          7               Western Sahara    SAH   \n",
+      "3  Admin-0 country          1          2                       Canada    CAN   \n",
+      "4  Admin-0 country          1          2     United States of America    US1   \n",
+      "\n",
+      "   ADM0_DIF  LEVEL               TYPE TLC                        ADMIN  ...  \\\n",
+      "0         0      2  Sovereign country   1                         Fiji  ...   \n",
+      "1         0      2  Sovereign country   1  United Republic of Tanzania  ...   \n",
+      "2         0      2      Indeterminate   1               Western Sahara  ...   \n",
+      "3         0      2  Sovereign country   1                       Canada  ...   \n",
+      "4         1      2            Country   1     United States of America  ...   \n",
+      "\n",
+      "      FCLASS_PL  FCLASS_GR FCLASS_IT     FCLASS_NL  FCLASS_SE FCLASS_BD  \\\n",
+      "0          None       None      None          None       None      None   \n",
+      "1          None       None      None          None       None      None   \n",
+      "2  Unrecognized       None      None  Unrecognized       None      None   \n",
+      "3          None       None      None          None       None      None   \n",
+      "4          None       None      None          None       None      None   \n",
+      "\n",
+      "  FCLASS_UA                                           geometry distance_from  \\\n",
+      "0      None  MULTIPOLYGON (((180 -16.06713, 180 -16.55522, ...  Vatican City   \n",
+      "1      None  POLYGON ((33.90371 -0.95, 34.07262 -1.05982, 3...    San Marino   \n",
+      "2      None  POLYGON ((-8.66559 27.65643, -8.66512 27.58948...         Vaduz   \n",
+      "3      None  MULTIPOLYGON (((-122.84 49, -122.97421 49.0025...       Lobamba   \n",
+      "4      None  MULTIPOLYGON (((-122.84 49, -120 49, -117.0312...    Luxembourg   \n",
+      "\n",
+      "       distance  \n",
+      "0  5.329915e+06  \n",
+      "1  5.628613e+06  \n",
+      "2  6.057264e+06  \n",
+      "3  4.626961e+06  \n",
+      "4  6.415631e+06  \n",
+      "\n",
+      "[5 rows x 171 columns]\n",
+      "(GPU)\n",
+      "\n"
      ]
-    },
-    {
-     "data": {
-      "text/html": [
-       "<div>\n",
-       "<style scoped>\n",
-       "    .dataframe tbody tr th:only-of-type {\n",
-       "        vertical-align: middle;\n",
-       "    }\n",
-       "\n",
-       "    .dataframe tbody tr th {\n",
-       "        vertical-align: top;\n",
-       "    }\n",
-       "\n",
-       "    .dataframe thead th {\n",
-       "        text-align: right;\n",
-       "    }\n",
-       "</style>\n",
-       "<table border=\"1\" class=\"dataframe\">\n",
-       "  <thead>\n",
-       "    <tr style=\"text-align: right;\">\n",
-       "      <th></th>\n",
-       "      <th>pop_est</th>\n",
-       "      <th>continent</th>\n",
-       "      <th>name</th>\n",
-       "      <th>iso_a3</th>\n",
-       "      <th>gdp_md_est</th>\n",
-       "      <th>geometry</th>\n",
-       "      <th>distance_from</th>\n",
-       "      <th>distance</th>\n",
-       "    </tr>\n",
-       "  </thead>\n",
-       "  <tbody>\n",
-       "    <tr>\n",
-       "      <th>0</th>\n",
-       "      <td>889953.0</td>\n",
-       "      <td>Oceania</td>\n",
-       "      <td>Fiji</td>\n",
-       "      <td>FJI</td>\n",
-       "      <td>5496</td>\n",
-       "      <td>MULTIPOLYGON (((20037508.343 -1812498.413, 200...</td>\n",
-       "      <td>Vatican City</td>\n",
-       "      <td>1.969350e+07</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>1</th>\n",
-       "      <td>58005463.0</td>\n",
-       "      <td>Africa</td>\n",
-       "      <td>Tanzania</td>\n",
-       "      <td>TZA</td>\n",
-       "      <td>63177</td>\n",
-       "      <td>POLYGON ((3774143.866 -105758.362, 3792946.708...</td>\n",
-       "      <td>San Marino</td>\n",
-       "      <td>5.929777e+06</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>2</th>\n",
-       "      <td>603253.0</td>\n",
-       "      <td>Africa</td>\n",
-       "      <td>W. Sahara</td>\n",
-       "      <td>ESH</td>\n",
-       "      <td>907</td>\n",
-       "      <td>POLYGON ((-964649.018 3205725.605, -964597.245...</td>\n",
-       "      <td>Vaduz</td>\n",
-       "      <td>3.421172e+06</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>3</th>\n",
-       "      <td>37589262.0</td>\n",
-       "      <td>North America</td>\n",
-       "      <td>Canada</td>\n",
-       "      <td>CAN</td>\n",
-       "      <td>1736425</td>\n",
-       "      <td>MULTIPOLYGON (((-13674486.249 6274861.394, -13...</td>\n",
-       "      <td>Lobamba</td>\n",
-       "      <td>1.296059e+07</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>4</th>\n",
-       "      <td>328239523.0</td>\n",
-       "      <td>North America</td>\n",
-       "      <td>United States of America</td>\n",
-       "      <td>USA</td>\n",
-       "      <td>21433226</td>\n",
-       "      <td>MULTIPOLYGON (((-13674486.249 6274861.394, -13...</td>\n",
-       "      <td>Luxembourg</td>\n",
-       "      <td>8.174897e+06</td>\n",
-       "    </tr>\n",
-       "  </tbody>\n",
-       "</table>\n",
-       "</div>"
-      ],
-      "text/plain": [
-       "       pop_est      continent                      name iso_a3  gdp_md_est  \\\n",
-       "0     889953.0        Oceania                      Fiji    FJI        5496   \n",
-       "1   58005463.0         Africa                  Tanzania    TZA       63177   \n",
-       "2     603253.0         Africa                 W. Sahara    ESH         907   \n",
-       "3   37589262.0  North America                    Canada    CAN     1736425   \n",
-       "4  328239523.0  North America  United States of America    USA    21433226   \n",
-       "\n",
-       "                                            geometry distance_from  \\\n",
-       "0  MULTIPOLYGON (((20037508.343 -1812498.413, 200...  Vatican City   \n",
-       "1  POLYGON ((3774143.866 -105758.362, 3792946.708...    San Marino   \n",
-       "2  POLYGON ((-964649.018 3205725.605, -964597.245...         Vaduz   \n",
-       "3  MULTIPOLYGON (((-13674486.249 6274861.394, -13...       Lobamba   \n",
-       "4  MULTIPOLYGON (((-13674486.249 6274861.394, -13...    Luxembourg   \n",
-       "\n",
-       "       distance  \n",
-       "0  1.969350e+07  \n",
-       "1  5.929777e+06  \n",
-       "2  3.421172e+06  \n",
-       "3  1.296059e+07  \n",
-       "4  8.174897e+06  \n",
-       "(GPU)"
-      ]
-     },
-     "execution_count": 18,
-     "metadata": {},
-     "output_type": "execute_result"
     }
    ],
    "source": [
-    "cities = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_cities\")).to_crs(3857)\n",
-    "countries = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\")).to_crs(3857)\n",
+    "countries = host_dataframe\n",
+    "\n",
+    "cities = geopandas.read_file('https://naturalearth.s3.amazonaws.com/110m_cultural/ne_110m_populated_places_simple.zip')\n",
+    "cities = cities.to_crs(3857)\n",
     "\n",
     "gpu_cities = cuspatial.from_geopandas(cities)\n",
     "gpu_countries = cuspatial.from_geopandas(countries)\n",
-    "\n",
     "dist = cuspatial.pairwise_point_polygon_distance(\n",
     "    gpu_cities.geometry[:len(gpu_countries)], gpu_countries.geometry\n",
     ")\n",
@@ -1180,7 +1058,7 @@
     "gpu_countries[\"distance_from\"] = cities.name\n",
     "gpu_countries[\"distance\"] = dist\n",
     "\n",
-    "gpu_countries.head()"
+    "print(gpu_countries.head())"
    ]
   },
   {
@@ -1196,7 +1074,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 19,
+   "execution_count": 17,
    "id": "5863871e",
    "metadata": {},
    "outputs": [
@@ -1249,7 +1127,7 @@
        "    <tr>\n",
        "      <th>3</th>\n",
        "      <td>West 80th Street</td>\n",
-       "      <td>LINESTRING (-8235369.475 4980617.398, -8235349...</td>\n",
+       "      <td>LINESTRING (-8235369.475 4980617.398, -8235347...</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>4</th>\n",
@@ -1266,11 +1144,11 @@
        "0       Columbus Avenue  LINESTRING (-8234860.077 4980333.535, -8234863...\n",
        "1      West 80th Street  LINESTRING (-8235173.854 4980508.442, -8235160...\n",
        "2      Amsterdam Avenue  LINESTRING (-8235173.854 4980508.442, -8235168...\n",
-       "3      West 80th Street  LINESTRING (-8235369.475 4980617.398, -8235349...\n",
+       "3      West 80th Street  LINESTRING (-8235369.475 4980617.398, -8235347...\n",
        "4              Broadway  LINESTRING (-8235369.475 4980617.398, -8235373..."
       ]
      },
-     "execution_count": 19,
+     "execution_count": 17,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1278,14 +1156,14 @@
    "source": [
     "# all driveways within 2km range of central park, nyc\n",
     "\n",
-    "# The dataset is downloaded and processed as follows:\n",
-    "# import osmnx as ox\n",
-    "# graph = ox.graph_from_point((40.769361, -73.977655), dist=2000, network_type=\"drive\")\n",
-    "# nodes, streets = ox.graph_to_gdfs(graph)\n",
-    "# streets = streets.to_crs(3857)\n",
-    "# streets = streets.reset_index(drop=True)\n",
-    "# streets.index.name = \"index\"\n",
-    "# streets[[\"name\", \"geometry\"]].to_csv(\"streets_3857.csv\")\n",
+    "if not os.path.exists(\"./streets_3857.csv\"):\n",
+    "    import osmnx as ox\n",
+    "    graph = ox.graph_from_point((40.769361, -73.977655), dist=2000, network_type=\"drive\")\n",
+    "    nodes, streets = ox.graph_to_gdfs(graph)\n",
+    "    streets = streets.to_crs(3857)\n",
+    "    streets = streets.reset_index(drop=True)\n",
+    "    streets.index.name = \"index\"\n",
+    "    streets[[\"name\", \"geometry\"]].to_csv(\"streets_3857.csv\")\n",
     "\n",
     "# The data is under notebooks/streets_3857.csv\n",
     "streets = pd.read_csv(\"./streets_3857.csv\", index_col=\"index\")\n",
@@ -1296,10 +1174,18 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 20,
+   "execution_count": 19,
    "id": "f4c67464",
    "metadata": {},
    "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/raid/jlamb/miniforge/envs/cuspatial-dev/lib/python3.11/site-packages/osmnx/features.py:294: DeprecationWarning: The 'unary_union' attribute is deprecated, use the 'union_all()' method instead.\n",
+      "  polygon = gdf_place[\"geometry\"].unary_union\n"
+     ]
+    },
     {
      "data": {
       "text/html": [
@@ -1363,7 +1249,7 @@
        "0      POLYGON ((-8236139.639 4975314.625, -8235990.3..."
       ]
      },
-     "execution_count": 20,
+     "execution_count": 19,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1371,12 +1257,13 @@
    "source": [
     "# The polygon of the Empire State Building\n",
     "\n",
-    "# The dataset is downloaded and processed as follows:\n",
-    "# esb = ox.geometries.geometries_from_place('Empire State Building, New York', tags={\"building\": True})\n",
-    "# esb = esb.to_crs(3857)\n",
-    "# esb = esb.geometry.reset_index(drop=True)\n",
-    "# esb.index.name = \"index\"\n",
-    "# esb.to_csv(\"esb_3857.csv\")\n",
+    "if not os.path.exists(\"./esb_3857.csv\"):\n",
+    "    import osmnx as ox\n",
+    "    esb = ox.features.features_from_place('Empire State Building, New York', tags={\"building\": True})\n",
+    "    esb = esb.to_crs(3857)\n",
+    "    esb = esb.geometry.reset_index(drop=True)\n",
+    "    esb.index.name = \"index\"\n",
+    "    esb.to_csv(\"esb_3857.csv\")\n",
     "\n",
     "# The data is under notebooks/esb_3857.csv\n",
     "esb = pd.read_csv(\"./esb_3857.csv\", index_col=\"index\")\n",
@@ -1388,7 +1275,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 21,
+   "execution_count": 20,
    "id": "d4e68e87",
    "metadata": {},
    "outputs": [
@@ -1436,7 +1323,7 @@
        "    <tr>\n",
        "      <th>3</th>\n",
        "      <td>West 80th Street</td>\n",
-       "      <td>5276.886560</td>\n",
+       "      <td>5275.851781</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>4</th>\n",
@@ -1449,33 +1336,33 @@
        "      <td>...</td>\n",
        "    </tr>\n",
        "    <tr>\n",
-       "      <th>1859</th>\n",
-       "      <td>East 70th Street</td>\n",
-       "      <td>4193.471831</td>\n",
+       "      <th>1862</th>\n",
+       "      <td>West 82nd Street</td>\n",
+       "      <td>5411.762092</td>\n",
        "    </tr>\n",
        "    <tr>\n",
-       "      <th>1860</th>\n",
-       "      <td>West 65th Street</td>\n",
-       "      <td>3999.118604</td>\n",
+       "      <th>1863</th>\n",
+       "      <td>Broadway</td>\n",
+       "      <td>5476.345847</td>\n",
        "    </tr>\n",
        "    <tr>\n",
-       "      <th>1861</th>\n",
-       "      <td>Dyer Avenue</td>\n",
-       "      <td>1470.617115</td>\n",
+       "      <th>1864</th>\n",
+       "      <td>West 84th Street</td>\n",
+       "      <td>5613.403002</td>\n",
        "    </tr>\n",
        "    <tr>\n",
-       "      <th>1862</th>\n",
-       "      <td>Dyer Avenue</td>\n",
-       "      <td>1468.714127</td>\n",
+       "      <th>1865</th>\n",
+       "      <td>West 75th Street</td>\n",
+       "      <td>4750.092380</td>\n",
        "    </tr>\n",
        "    <tr>\n",
-       "      <th>1863</th>\n",
-       "      <td>Dyer Avenue</td>\n",
-       "      <td>1548.205363</td>\n",
+       "      <th>1866</th>\n",
+       "      <td>Broadway</td>\n",
+       "      <td>4638.894939</td>\n",
        "    </tr>\n",
        "  </tbody>\n",
        "</table>\n",
-       "<p>1864 rows × 2 columns</p>\n",
+       "<p>1867 rows × 2 columns</p>\n",
        "</div>"
       ],
       "text/plain": [
@@ -1483,19 +1370,19 @@
        "0      Columbus Avenue  4993.583717\n",
        "1     West 80th Street  5103.472213\n",
        "2     Amsterdam Avenue  5208.373183\n",
-       "3     West 80th Street  5276.886560\n",
+       "3     West 80th Street  5275.851781\n",
        "4             Broadway  5178.999774\n",
        "...                ...          ...\n",
-       "1859  East 70th Street  4193.471831\n",
-       "1860  West 65th Street  3999.118604\n",
-       "1861       Dyer Avenue  1470.617115\n",
-       "1862       Dyer Avenue  1468.714127\n",
-       "1863       Dyer Avenue  1548.205363\n",
+       "1862  West 82nd Street  5411.762092\n",
+       "1863          Broadway  5476.345847\n",
+       "1864  West 84th Street  5613.403002\n",
+       "1865  West 75th Street  4750.092380\n",
+       "1866          Broadway  4638.894939\n",
        "\n",
-       "[1864 rows x 2 columns]"
+       "[1867 rows x 2 columns]"
       ]
      },
-     "execution_count": 21,
+     "execution_count": 20,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1522,30 +1409,18 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 22,
+   "execution_count": 21,
    "id": "951625da",
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "/tmp/ipykernel_5364/3213563529.py:1: FutureWarning: The geopandas.dataset module is deprecated and will be removed in GeoPandas 1.0. You can get the original 'naturalearth_lowres' data from https://www.naturalearthdata.com/downloads/110m-cultural-vectors/.\n",
-      "  countries = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\")).to_crs(3857)\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
-    "countries = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\")).to_crs(3857)\n",
-    "gpu_countries = cuspatial.from_geopandas(countries)\n",
-    "\n",
-    "african_countries = gpu_countries[gpu_countries.continent == \"Africa\"].sort_values(\"pop_est\", ascending=False)\n",
-    "asian_countries = gpu_countries[gpu_countries.continent == \"Asia\"].sort_values(\"pop_est\", ascending=False)"
+    "african_countries = gpu_countries[gpu_countries.CONTINENT == \"Africa\"].sort_values(\"POP_EST\", ascending=False)\n",
+    "asian_countries = gpu_countries[gpu_countries.CONTINENT == \"Asia\"].sort_values(\"POP_EST\", ascending=False)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 23,
+   "execution_count": 22,
    "id": "2f0e1118",
    "metadata": {},
    "outputs": [
@@ -1580,81 +1455,81 @@
        "      <th>0</th>\n",
        "      <td>Nigeria</td>\n",
        "      <td>China</td>\n",
-       "      <td>7.383366e+06</td>\n",
+       "      <td>64.966620</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>1</th>\n",
        "      <td>Ethiopia</td>\n",
        "      <td>India</td>\n",
-       "      <td>2.883313e+06</td>\n",
+       "      <td>25.598868</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>2</th>\n",
        "      <td>Egypt</td>\n",
        "      <td>Indonesia</td>\n",
-       "      <td>6.776043e+06</td>\n",
+       "      <td>60.717434</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>3</th>\n",
        "      <td>Dem. Rep. Congo</td>\n",
        "      <td>Pakistan</td>\n",
-       "      <td>4.227767e+06</td>\n",
+       "      <td>37.489668</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>4</th>\n",
        "      <td>South Africa</td>\n",
        "      <td>Bangladesh</td>\n",
-       "      <td>8.189086e+06</td>\n",
+       "      <td>72.860545</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>5</th>\n",
        "      <td>Tanzania</td>\n",
        "      <td>Japan</td>\n",
-       "      <td>1.096947e+07</td>\n",
+       "      <td>97.872886</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>6</th>\n",
        "      <td>Kenya</td>\n",
        "      <td>Philippines</td>\n",
-       "      <td>8.399282e+06</td>\n",
+       "      <td>75.450451</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7</th>\n",
        "      <td>Uganda</td>\n",
        "      <td>Vietnam</td>\n",
-       "      <td>7.773975e+06</td>\n",
+       "      <td>69.827567</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>8</th>\n",
        "      <td>Algeria</td>\n",
        "      <td>Turkey</td>\n",
-       "      <td>2.000180e+06</td>\n",
+       "      <td>17.927419</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>9</th>\n",
        "      <td>Sudan</td>\n",
        "      <td>Iran</td>\n",
-       "      <td>1.625828e+06</td>\n",
+       "      <td>13.990335</td>\n",
        "    </tr>\n",
        "  </tbody>\n",
        "</table>\n",
        "</div>"
       ],
       "text/plain": [
-       "            Africa         Asia          dist\n",
-       "0          Nigeria        China  7.383366e+06\n",
-       "1         Ethiopia        India  2.883313e+06\n",
-       "2            Egypt    Indonesia  6.776043e+06\n",
-       "3  Dem. Rep. Congo     Pakistan  4.227767e+06\n",
-       "4     South Africa   Bangladesh  8.189086e+06\n",
-       "5         Tanzania        Japan  1.096947e+07\n",
-       "6            Kenya  Philippines  8.399282e+06\n",
-       "7           Uganda      Vietnam  7.773975e+06\n",
-       "8          Algeria       Turkey  2.000180e+06\n",
-       "9            Sudan         Iran  1.625828e+06"
+       "            Africa         Asia       dist\n",
+       "0          Nigeria        China  64.966620\n",
+       "1         Ethiopia        India  25.598868\n",
+       "2            Egypt    Indonesia  60.717434\n",
+       "3  Dem. Rep. Congo     Pakistan  37.489668\n",
+       "4     South Africa   Bangladesh  72.860545\n",
+       "5         Tanzania        Japan  97.872886\n",
+       "6            Kenya  Philippines  75.450451\n",
+       "7           Uganda      Vietnam  69.827567\n",
+       "8          Algeria       Turkey  17.927419\n",
+       "9            Sudan         Iran  13.990335"
       ]
      },
-     "execution_count": 23,
+     "execution_count": 22,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1667,8 +1542,8 @@
     "    population_top10_africa.geometry, population_top10_asia.geometry)\n",
     "\n",
     "cudf.concat([\n",
-    "    population_top10_africa[\"name\"].rename(\"Africa\"),\n",
-    "    population_top10_asia[\"name\"].rename(\"Asia\"), \n",
+    "    population_top10_africa[\"NAME\"].rename(\"Africa\"),\n",
+    "    population_top10_asia[\"NAME\"].rename(\"Asia\"), \n",
     "    dist.rename(\"dist\")], axis=1\n",
     ")"
    ]
@@ -1690,35 +1565,26 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 24,
+   "execution_count": 23,
    "id": "d1ade9da-c9e2-45c4-9685-dffeda3fd358",
    "metadata": {
     "tags": []
    },
    "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "/tmp/ipykernel_5364/3414785716.py:1: FutureWarning: The geopandas.dataset module is deprecated and will be removed in GeoPandas 1.0. You can get the original 'naturalearth_lowres' data from https://www.naturalearthdata.com/downloads/110m-cultural-vectors/.\n",
-      "  host_dataframe = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\"))\n"
-     ]
-    },
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "0    POINT (33.90371 -0.95000)\n",
+      "0       POINT (33.90371 -0.95)\n",
       "1    POINT (34.07262 -1.05982)\n",
       "2    POINT (37.69869 -3.09699)\n",
-      "3    POINT (37.76690 -3.67712)\n",
+      "3     POINT (37.7669 -3.67712)\n",
       "4    POINT (39.20222 -4.67677)\n",
       "dtype: geometry\n"
      ]
     }
    ],
    "source": [
-    "host_dataframe = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\"))\n",
     "gpu_dataframe = cuspatial.from_geopandas(host_dataframe)\n",
     "geometry = gpu_dataframe['geometry']\n",
     "points = cuspatial.GeoSeries.from_points_xy(geometry.polygons.xy)\n",
@@ -1766,34 +1632,24 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 25,
+   "execution_count": 24,
    "id": "cc72a44d-a9bf-4432-9898-de899ac45869",
    "metadata": {
     "tags": []
    },
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "/tmp/ipykernel_5364/199363072.py:3: FutureWarning: The geopandas.dataset module is deprecated and will be removed in GeoPandas 1.0. You can get the original 'naturalearth_lowres' data from https://www.naturalearthdata.com/downloads/110m-cultural-vectors/.\n",
-      "  host_dataframe = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\"))\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "from cuspatial.core.binops.intersection import pairwise_linestring_intersection\n",
     "\n",
-    "host_dataframe = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\"))\n",
-    "usa_boundary = cuspatial.from_geopandas(host_dataframe[host_dataframe.name == \"United States of America\"].geometry.boundary)\n",
-    "canada_boundary = cuspatial.from_geopandas(host_dataframe[host_dataframe.name == \"Canada\"].geometry.boundary)\n",
+    "usa_boundary = cuspatial.from_geopandas(host_dataframe[host_dataframe.NAME == \"United States of America\"].geometry.boundary)\n",
+    "canada_boundary = cuspatial.from_geopandas(host_dataframe[host_dataframe.NAME == \"Canada\"].geometry.boundary)\n",
     "\n",
     "list_offsets, geometries, look_back_ids = pairwise_linestring_intersection(usa_boundary, canada_boundary)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 26,
+   "execution_count": 25,
    "id": "1125fd17-afe1-4b9c-b48d-8842dd3700b3",
    "metadata": {
     "tags": []
@@ -1802,7 +1658,7 @@
     {
      "data": {
       "text/plain": [
-       "<cudf.core.column.numerical.NumericalColumn object at 0x7f2c5a872d40>\n",
+       "<cudf.core.column.numerical.NumericalColumn object at 0x7f525c27a570>\n",
        "[\n",
        "  0,\n",
        "  142\n",
@@ -1810,7 +1666,7 @@
        "dtype: int32"
       ]
      },
-     "execution_count": 26,
+     "execution_count": 25,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1823,7 +1679,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 27,
+   "execution_count": 31,
    "id": "b281e3bb-42d4-4d60-9cb2-b7dcc20b4776",
    "metadata": {
     "tags": []
@@ -1835,18 +1691,18 @@
        "0                            POINT (-130.53611 54.80275)\n",
        "1                            POINT (-130.53611 54.80278)\n",
        "2                            POINT (-130.53611 54.80275)\n",
-       "3                            POINT (-129.98000 55.28500)\n",
+       "3                                 POINT (-129.98 55.285)\n",
        "4                            POINT (-130.53611 54.80278)\n",
        "                             ...                        \n",
-       "137    LINESTRING (-120.00000 49.00000, -117.03121 49...\n",
-       "138    LINESTRING (-122.84000 49.00000, -120.00000 49...\n",
-       "139    LINESTRING (-117.03121 49.00000, -107.05000 49...\n",
+       "137                  LINESTRING (-120 49, -117.03121 49)\n",
+       "138                     LINESTRING (-122.84 49, -120 49)\n",
+       "139               LINESTRING (-117.03121 49, -107.05 49)\n",
        "140    LINESTRING (-83.89077 46.11693, -83.61613 46.1...\n",
        "141    LINESTRING (-82.69009 41.67511, -82.43928 41.6...\n",
        "Length: 142, dtype: geometry"
       ]
      },
-     "execution_count": 27,
+     "execution_count": 31,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1858,7 +1714,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 28,
+   "execution_count": 26,
    "id": "e19873b9-2614-4242-ad67-caa47f807d04",
    "metadata": {
     "tags": []
@@ -1895,9 +1751,9 @@
        "    <tr>\n",
        "      <th>0</th>\n",
        "      <td>[8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, ...</td>\n",
-       "      <td>[18, 16, 18, 15, 17, 14, 16, 13, 15, 14, 11, 1...</td>\n",
+       "      <td>[18, 16, 18, 15, 17, 137, 14, 16, 13, 15, 14, ...</td>\n",
        "      <td>[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...</td>\n",
-       "      <td>[9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15...</td>\n",
+       "      <td>[9, 10, 10, 11, 11, 28, 12, 12, 13, 13, 14, 15...</td>\n",
        "    </tr>\n",
        "  </tbody>\n",
        "</table>\n",
@@ -1908,16 +1764,16 @@
        "0  [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, ...   \n",
        "\n",
        "                                      lhs_segment_id  \\\n",
-       "0  [18, 16, 18, 15, 17, 14, 16, 13, 15, 14, 11, 1...   \n",
+       "0  [18, 16, 18, 15, 17, 137, 14, 16, 13, 15, 14, ...   \n",
        "\n",
        "                                   rhs_linestring_id  \\\n",
        "0  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...   \n",
        "\n",
        "                                      rhs_segment_id  \n",
-       "0  [9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15...  "
+       "0  [9, 10, 10, 11, 11, 28, 12, 12, 13, 13, 14, 15...  "
       ]
      },
-     "execution_count": 28,
+     "execution_count": 26,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1951,20 +1807,12 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 29,
+   "execution_count": 27,
    "id": "bf7b2256",
    "metadata": {
     "tags": []
    },
    "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "/tmp/ipykernel_5364/1271339229.py:1: FutureWarning: The geopandas.dataset module is deprecated and will be removed in GeoPandas 1.0. You can get the original 'naturalearth_lowres' data from https://www.naturalearthdata.com/downloads/110m-cultural-vectors/.\n",
-      "  host_dataframe = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\"))\n"
-     ]
-    },
     {
      "data": {
       "text/plain": [
@@ -1976,13 +1824,12 @@
        "dtype: int64"
       ]
      },
-     "execution_count": 29,
+     "execution_count": 27,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "host_dataframe = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\"))\n",
     "single_polygons = host_dataframe[host_dataframe['geometry'].type == \"Polygon\"]\n",
     "gpu_dataframe = cuspatial.from_geopandas(single_polygons)\n",
     "x_points = (cupy.random.random(10000000) - 0.5) * 360\n",
@@ -2063,7 +1910,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 30,
+   "execution_count": 28,
    "id": "e3a0a9a3-0bdd-4f05-bcb5-7db4b99a44a3",
    "metadata": {
     "tags": []
@@ -2128,7 +1975,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 31,
+   "execution_count": 29,
    "id": "023bd25a-35be-435d-ab0b-ecbd7a47e147",
    "metadata": {
     "tags": []
@@ -2188,33 +2035,20 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 32,
+   "execution_count": 30,
    "id": "784aff8e-c9ed-4a81-aa87-bf301b3b90af",
    "metadata": {
     "tags": []
    },
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "/tmp/ipykernel_5364/2951982051.py:1: FutureWarning: The geopandas.dataset module is deprecated and will be removed in GeoPandas 1.0. You can get the original 'naturalearth_lowres' data from https://www.naturalearthdata.com/downloads/110m-cultural-vectors/.\n",
-      "  host_countries = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\"))\n",
-      "/tmp/ipykernel_5364/2951982051.py:2: FutureWarning: The geopandas.dataset module is deprecated and will be removed in GeoPandas 1.0. You can get the original 'naturalearth_cities' data from https://www.naturalearthdata.com/downloads/110m-cultural-vectors/.\n",
-      "  host_cities = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_cities\"))\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
-    "host_countries = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\"))\n",
-    "host_cities = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_cities\"))\n",
-    "gpu_countries = cuspatial.from_geopandas(host_countries[host_countries['geometry'].type == \"Polygon\"])\n",
-    "gpu_cities = cuspatial.from_geopandas(host_cities[host_cities['geometry'].type == 'Point'])"
+    "gpu_countries = cuspatial.from_geopandas(countries[countries['geometry'].type == \"Polygon\"])\n",
+    "gpu_cities = cuspatial.from_geopandas(cities[cities['geometry'].type == 'Point'])"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 33,
+   "execution_count": 31,
    "id": "fea24c78-cf5c-45c6-b860-338238e61323",
    "metadata": {
     "tags": []
@@ -2224,12 +2058,9 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "   point_index  linestring_index   distance\n",
-      "0            0                21  10.857363\n",
-      "1            1                21  10.937690\n",
-      "2            2                19   0.522859\n",
-      "3            3                19   0.050204\n",
-      "4            4               129   0.104261\n"
+      "Empty DataFrame\n",
+      "Columns: [point_index, linestring_index, distance]\n",
+      "Index: []\n"
      ]
     }
    ],
@@ -2282,6 +2113,14 @@
    "source": [
     "_Images used with permission from Wikipedia Creative Commons_"
    ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "c3c504d6-a908-455d-9d35-58521f70c5e2",
+   "metadata": {},
+   "outputs": [],
+   "source": []
   }
  ],
  "metadata": {
@@ -2300,7 +2139,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.10.12"
+   "version": "3.11.9"
   },
   "vscode": {
    "interpreter": {
diff --git a/notebooks/nyc_taxi_years_correlation.ipynb b/notebooks/nyc_taxi_years_correlation.ipynb
index 1264b3615..d13ce0d3b 100644
--- a/notebooks/nyc_taxi_years_correlation.ipynb
+++ b/notebooks/nyc_taxi_years_correlation.ipynb
@@ -62,7 +62,7 @@
    "source": [
     "!if [ ! -f \"tzones_lonlat.json\" ]; then curl \"https://data.cityofnewyork.us/api/geospatial/d3c5-ddgc?method=export&format=GeoJSON\" -o tzones_lonlat.json; else echo \"tzones_lonlat.json found\"; fi\n",
     "!if [ ! -f \"taxi2016.csv\" ]; then curl https://storage.googleapis.com/anaconda-public-data/nyc-taxi/csv/2016/yellow_tripdata_2016-01.csv -o taxi2016.csv; else echo \"taxi2016.csv found\"; fi   \n",
-    "!if [ ! -f \"taxi2017.csv\" ]; then curl https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2017-01.parquet -o taxi2017.parquet; else echo \"taxi2017.csv found\"; fi"
+    "!if [ ! -f \"taxi2017.parquet\" ]; then curl https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2017-01.parquet -o taxi2017.parquet; else echo \"taxi2017.csv found\"; fi"
    ]
   },
   {
@@ -128,9 +128,10 @@
     "tzones = gpd.GeoDataFrame.from_file('tzones_lonlat.json')\n",
     "taxi_zones = cuspatial.from_geopandas(tzones).geometry\n",
     "taxi_zone_rings = cuspatial.GeoSeries.from_polygons_xy(\n",
-    "    taxi_zones.polygons.xy, taxi_zones.polygons.ring_offset,\n",
-    "    taxi_zones.polygons.part_offset,\n",
-    "    cudf.Series(range(len(taxi_zones.polygons.part_offset)))\n",
+    "    polygons_xy=taxi_zones.polygons.xy,\n",
+    "    ring_offset=taxi_zones.polygons.ring_offset,\n",
+    "    part_offsets=taxi_zones.polygons.part_offset,\n",
+    "    geometry_offsets=cudf.Series(range(len(taxi_zones.polygons.part_offset)))\n",
     ")"
    ]
   },
@@ -507,7 +508,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.9.16"
+   "version": "3.11.9"
   }
  },
  "nbformat": 4,
diff --git a/python/cuproj/cuproj/_version.py b/python/cuproj/cuproj/_version.py
index e7bd99791..5f3b9ac57 100644
--- a/python/cuproj/cuproj/_version.py
+++ b/python/cuproj/cuproj/_version.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2023, NVIDIA CORPORATION.
+# Copyright (c) 2023-2024, NVIDIA CORPORATION.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -15,6 +15,20 @@
 import importlib.resources
 
 __version__ = (
-    importlib.resources.files("cuproj").joinpath("VERSION").read_text().strip()
+    importlib.resources.files(__package__)
+    .joinpath("VERSION")
+    .read_text()
+    .strip()
 )
-__git_commit__ = ""
+
+try:
+    __git_commit__ = (
+        importlib.resources.files(__package__)
+        .joinpath("GIT_COMMIT")
+        .read_text()
+        .strip()
+    )
+except FileNotFoundError:
+    __git_commit__ = ""
+
+__all__ = ["__git_commit__", "__version__"]
diff --git a/python/cuproj/pyproject.toml b/python/cuproj/pyproject.toml
index 54c4a3709..eca654f73 100644
--- a/python/cuproj/pyproject.toml
+++ b/python/cuproj/pyproject.toml
@@ -13,15 +13,10 @@
 # limitations under the License.
 
 [build-system]
-build-backend = "scikit_build_core.build"
+build-backend = "rapids_build_backend.build"
 requires = [
-    "cmake>=3.26.4",
-    "cython>=3.0.0",
-    "ninja",
-    "rmm==24.6.*",
+    "rapids-build-backend>=0.3.0,<0.4.0.dev0",
     "scikit-build-core[pyproject]>=0.7.0",
-    "setuptools",
-    "wheel",
 ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`.
 
 [project]
@@ -34,7 +29,7 @@ license = { text = "Apache 2.0" }
 requires-python = ">=3.9"
 dependencies = [
     "cupy-cuda11x>=12.0.0",
-    "rmm==24.6.*",
+    "rmm==24.8.*,>=0.0.0a0",
 ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`.
 classifiers = [
     "Intended Audience :: Developers",
@@ -49,7 +44,7 @@ classifiers = [
 
 [project.optional-dependencies]
 test = [
-    "cuspatial==24.6.*",
+    "cuspatial==24.8.*,>=0.0.0a0",
     "geopandas>=0.11.0",
     "numpy>=1.23,<2.0a0",
     "pyproj>=3.6.0,<3.7a0",
@@ -119,3 +114,15 @@ filterwarnings = [
     # https://github.com/pytest-dev/pytest-cov/issues/557
     "ignore:The --rsyncdir command line argument:DeprecationWarning",
 ]
+
+[tool.rapids-build-backend]
+build-backend = "scikit_build_core.build"
+dependencies-file = "../../dependencies.yaml"
+matrix-entry = "cuda_suffixed=true"
+requires = [
+    "cmake>=3.26.4,!=3.30.0",
+    "cython>=3.0.0",
+    "ninja",
+    "rmm==24.8.*,>=0.0.0a0",
+    "wheel",
+] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`.
diff --git a/python/cuspatial/cuspatial/_version.py b/python/cuspatial/cuspatial/_version.py
index e1333b17a..5f3b9ac57 100644
--- a/python/cuspatial/cuspatial/_version.py
+++ b/python/cuspatial/cuspatial/_version.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2023, NVIDIA CORPORATION.
+# Copyright (c) 2023-2024, NVIDIA CORPORATION.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -15,9 +15,20 @@
 import importlib.resources
 
 __version__ = (
-    importlib.resources.files("cuspatial")
+    importlib.resources.files(__package__)
     .joinpath("VERSION")
     .read_text()
     .strip()
 )
-__git_commit__ = ""
+
+try:
+    __git_commit__ = (
+        importlib.resources.files(__package__)
+        .joinpath("GIT_COMMIT")
+        .read_text()
+        .strip()
+    )
+except FileNotFoundError:
+    __git_commit__ = ""
+
+__all__ = ["__git_commit__", "__version__"]
diff --git a/python/cuspatial/cuspatial/core/binpreds/contains.py b/python/cuspatial/cuspatial/core/binpreds/contains.py
index 8111074a5..c66afd4ed 100644
--- a/python/cuspatial/cuspatial/core/binpreds/contains.py
+++ b/python/cuspatial/cuspatial/core/binpreds/contains.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2022-2023, NVIDIA CORPORATION.
+# Copyright (c) 2022-2024, NVIDIA CORPORATION.
 
 from math import ceil, sqrt
 
@@ -110,7 +110,7 @@ def _brute_force_contains_properly(points, polygons):
             width=len(polygons.polygons.part_offset) - 1,
         )
     )
-    final_result = DataFrame._from_data(
+    final_result = DataFrame(
         {
             name: result[name].astype("bool")
             for name in reversed(result.columns)
diff --git a/python/cuspatial/cuspatial/core/geodataframe.py b/python/cuspatial/cuspatial/core/geodataframe.py
index 3e58a5d60..90dcaf24e 100644
--- a/python/cuspatial/cuspatial/core/geodataframe.py
+++ b/python/cuspatial/cuspatial/core/geodataframe.py
@@ -1,11 +1,14 @@
-# Copyright (c) 2020-2022, NVIDIA CORPORATION
-from typing import Dict, Tuple, TypeVar, Union
+# Copyright (c) 2020-2024, NVIDIA CORPORATION
+from __future__ import annotations
+
+from typing import Any, Dict, TypeVar, Union
 
 import pandas as pd
 from geopandas import GeoDataFrame as gpGeoDataFrame
 from geopandas.geoseries import is_geometry_type as gp_is_geometry_type
 
 import cudf
+from cudf.core.column import as_column
 from cudf.core.copy_types import BooleanMask, GatherMap
 
 from cuspatial.core._column.geocolumn import GeoColumn, GeoMeta
@@ -41,7 +44,7 @@ def __init__(
                     column = GeoColumn(adapter._get_geotuple(), pandas_meta)
                     self._data[col] = column
                 else:
-                    self._data[col] = data[col]
+                    self._data[col] = as_column(data[col])
         elif isinstance(data, dict):
             for key in data.keys():
                 try:
@@ -137,7 +140,9 @@ def _copy_type_metadata(
 
         return type_copied
 
-    def _split_out_geometry_columns(self) -> Tuple:
+    def _split_out_geometry_columns(
+        self,
+    ) -> tuple[GeoDataFrame, cudf.DataFrame]:
         """
         Break the geometry columns and non-geometry columns into
         separate dataframes and return them separated.
@@ -154,18 +159,20 @@ def _split_out_geometry_columns(self) -> Tuple:
         )
         return (geo_columns, data_columns)
 
-    def _recombine_columns(self, geo_columns, data_columns):
+    def _recombine_columns(
+        self, geo_columns: GeoDataFrame, data_columns: cudf.DataFrame
+    ) -> dict[Any, GeoSeries | cudf.Series]:
         """
         Combine a GeoDataFrame of only geometry columns with a DataFrame
         of non-geometry columns in the same order as the columns in `self`
         """
-        columns_mask = pd.Series(self.columns)
-        geocolumn_mask = pd.Series(
-            [isinstance(self[col], GeoSeries) for col in self.columns]
+        columns_mask = self.columns
+        geocolumn_mask = (
+            isinstance(self[col], GeoSeries) for col in columns_mask
         )
         return {
             name: (geo_columns[name] if mask else data_columns[name])
-            for name, mask in zip(columns_mask.values, geocolumn_mask.values)
+            for name, mask in zip(columns_mask, geocolumn_mask)
         }
 
     def _slice(self: T, arg: slice) -> T:
@@ -190,15 +197,15 @@ def _apply_boolean_mask(self, mask: BooleanMask, keep_index=True) -> T:
             {name: geo_columns[name][mask.column] for name in geo_columns}
         )
 
-        res = self.__class__._from_data(self._recombine_columns(geo, data))
+        res = self.__class__(self._recombine_columns(geo, data))
         if keep_index:
             res.index = data.index
         return res
 
     def _gather(self, gather_map: GatherMap, keep_index=True):
-        geo_data, cudf_data = self._split_out_geometry_columns()
+        geo_data, df = self._split_out_geometry_columns()
         # gather cudf columns
-        df = cudf.DataFrame._from_data(data=cudf_data, index=self.index)
+        df.index = self.index
 
         cudf_gathered = df._gather(gather_map, keep_index=keep_index)
 
@@ -210,7 +217,7 @@ def _gather(self, gather_map: GatherMap, keep_index=True):
         geo_gathered = GeoDataFrame(gathered)
 
         # combine
-        result = GeoDataFrame._from_data(
+        result = GeoDataFrame(
             self._recombine_columns(geo_gathered, cudf_gathered)
         )
         result.index = geo_gathered.index
@@ -294,7 +301,7 @@ def reset_index(
             # Reset the index of the GeoDataFrame to match the
             # cudf DataFrame and recombine.
             geo_data.index = cudf_reindexed.index
-            result = GeoDataFrame._from_data(
+            result = GeoDataFrame(
                 recombiner._recombine_columns(geo_data, cudf_reindexed)
             )
             result.index = geo_data.index
@@ -303,7 +310,7 @@ def reset_index(
 
 class _GeoSeriesUtility:
     @classmethod
-    def _from_data(cls, new_data, name=None, index=False):
+    def _from_data(cls, new_data, name=None, index=None):
         new_column = new_data.columns[0]
         if is_geometry_type(new_column):
             return GeoSeries(new_column, name=name, index=index)
diff --git a/python/cuspatial/cuspatial/core/geoseries.py b/python/cuspatial/cuspatial/core/geoseries.py
index acf472749..10addfec0 100644
--- a/python/cuspatial/cuspatial/core/geoseries.py
+++ b/python/cuspatial/cuspatial/core/geoseries.py
@@ -800,16 +800,16 @@ def from_polygons_xy(
         ----------
         polygons_xy : array-like
             Coordinates of the points, interpreted as interleaved x-y coords.
+        ring_offset : array-like
+            Offsets into the part array indicating the beginning of each ring.
+            The length of this array is the number of rings.
+        part_offset : array-like
+            Offsets into the coordinates array indicating the beginning of
+            each part. The length of this array is the number of parts.
         geometry_offset : array-like
             Offsets of the first coordinate of each geometry. The length of
             this array is the number of geometries.  Offsets with a difference
             greater than 1 indicate a MultiLinestring.
-        part_offset : array-like
-            Offsets into the coordinates array indicating the beginning of
-            each part. The length of this array is the number of parts.
-        rint_offset : array-like
-            Offsets into the part array indicating the beginning of each ring.
-            The length of this array is the number of rings.
 
         Returns
         -------
diff --git a/python/cuspatial/cuspatial/core/spatial/join.py b/python/cuspatial/cuspatial/core/spatial/join.py
index 2802b91b4..c237fe9d3 100644
--- a/python/cuspatial/cuspatial/core/spatial/join.py
+++ b/python/cuspatial/cuspatial/core/spatial/join.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2022-2023, NVIDIA CORPORATION.
+# Copyright (c) 2022-2024, NVIDIA CORPORATION.
 
 import warnings
 
@@ -87,7 +87,7 @@ def point_in_polygon(points: GeoSeries, polygons: GeoSeries):
     )
 
     result.columns = polygons.index[::-1]
-    return DataFrame._from_data(
+    return DataFrame(
         {
             name: result[name].astype("bool")
             for name in reversed(result.columns)
diff --git a/python/cuspatial/cuspatial/core/spatial/nearest_points.py b/python/cuspatial/cuspatial/core/spatial/nearest_points.py
index 9098d7864..289716f74 100644
--- a/python/cuspatial/cuspatial/core/spatial/nearest_points.py
+++ b/python/cuspatial/cuspatial/core/spatial/nearest_points.py
@@ -1,4 +1,4 @@
-import cupy as cp
+# Copyright (c) 2024, NVIDIA CORPORATION.
 
 import cudf
 from cudf.core.column import as_column
@@ -57,7 +57,7 @@ def pairwise_point_linestring_nearest_points(
             "segment_id": cudf.Series([], dtype="i4"),
             "geometry": GeoSeries([]),
         }
-        return GeoDataFrame._from_data(data)
+        return GeoDataFrame(data)
 
     if not contains_only_points(points):
         raise ValueError("`points` must contain only point geometries.")
@@ -97,11 +97,12 @@ def pairwise_point_linestring_nearest_points(
         as_column(linestrings.lines.geometry_offset),
     )
 
-    point_on_linestring = GeoColumn._from_points_xy(point_on_linestring_xy)
-    nearest_points_on_linestring = GeoSeries(point_on_linestring)
+    nearest_points_on_linestring = GeoColumn._from_points_xy(
+        point_on_linestring_xy
+    )
 
     if not point_geometry_id:
-        point_geometry_id = cp.zeros(len(points), dtype=cp.int32)
+        point_geometry_id = as_column(0, length=len(points), dtype="int32")
 
     data = {
         "point_geometry_id": point_geometry_id,
diff --git a/python/cuspatial/cuspatial/utils/join_utils.py b/python/cuspatial/cuspatial/utils/join_utils.py
index 46bd476df..c966ec796 100644
--- a/python/cuspatial/cuspatial/utils/join_utils.py
+++ b/python/cuspatial/cuspatial/utils/join_utils.py
@@ -1,7 +1,8 @@
-# Copyright (c) 2023, NVIDIA CORPORATION.
+# Copyright (c) 2023-2024, NVIDIA CORPORATION.
 
 import operator
 
+import cupy as cp
 from numba import cuda
 
 import rmm
@@ -27,7 +28,7 @@ def binarize(in_col, out, width):
 
 def apply_binarize(in_col, width):
     buf = rmm.DeviceBuffer(size=(in_col.size * width))
-    out = cuda.as_cuda_array(buf).view("int8").reshape((in_col.size, width))
+    out = cp.asarray(buf).view("int8").reshape((in_col.size, width))
     if out.size > 0:
         out[:] = 0
         binarize.forall(out.size)(in_col, out, width)
diff --git a/python/cuspatial/pyproject.toml b/python/cuspatial/pyproject.toml
index b4ae45e9e..d8461c722 100644
--- a/python/cuspatial/pyproject.toml
+++ b/python/cuspatial/pyproject.toml
@@ -13,16 +13,10 @@
 # limitations under the License.
 
 [build-system]
-build-backend = "scikit_build_core.build"
+build-backend = "rapids_build_backend.build"
 requires = [
-    "cmake>=3.26.4",
-    "cudf==24.6.*",
-    "cython>=3.0.0",
-    "ninja",
-    "rmm==24.6.*",
+    "rapids-build-backend>=0.3.0,<0.4.0.dev0",
     "scikit-build-core[pyproject]>=0.7.0",
-    "setuptools",
-    "wheel",
 ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`.
 
 [project]
@@ -36,10 +30,10 @@ authors = [
 license = { text = "Apache 2.0" }
 requires-python = ">=3.9"
 dependencies = [
-    "cudf==24.6.*",
+    "cudf==24.8.*,>=0.0.0a0",
     "geopandas>=0.11.0",
     "numpy>=1.23,<2.0a0",
-    "rmm==24.6.*",
+    "rmm==24.8.*,>=0.0.0a0",
 ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`.
 classifiers = [
     "Intended Audience :: Developers",
@@ -130,3 +124,16 @@ filterwarnings = [
     # https://github.com/pytest-dev/pytest-cov/issues/557
     "ignore:The --rsyncdir command line argument:DeprecationWarning",
 ]
+
+[tool.rapids-build-backend]
+build-backend = "scikit_build_core.build"
+dependencies-file = "../../dependencies.yaml"
+matrix-entry = "cuda_suffixed=true"
+requires = [
+    "cmake>=3.26.4,!=3.30.0",
+    "cudf==24.8.*,>=0.0.0a0",
+    "cython>=3.0.0",
+    "ninja",
+    "rmm==24.8.*,>=0.0.0a0",
+    "wheel",
+] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`.


Test patch:
diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml
index 00312c6a0..f00545fd9 100644
--- a/.github/workflows/test.yaml
+++ b/.github/workflows/test.yaml
@@ -16,7 +16,7 @@ on:
 jobs:
   conda-cpp-tests:
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@branch-24.08
     with:
       build_type: nightly
       branch: ${{ inputs.branch }}
@@ -24,7 +24,7 @@ jobs:
       sha: ${{ inputs.sha }}
   conda-python-tests:
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@branch-24.08
     with:
       build_type: nightly
       branch: ${{ inputs.branch }}
@@ -32,7 +32,7 @@ jobs:
       sha: ${{ inputs.sha }}
   wheel-tests-cuspatial:
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-24.08
     with:
       build_type: nightly
       branch: ${{ inputs.branch }}
@@ -41,7 +41,7 @@ jobs:
       script: ci/test_wheel_cuspatial.sh
   wheel-tests-cuproj:
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-24.06
+    uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-24.08
     with:
       build_type: nightly
       branch: ${{ inputs.branch }}
diff --git a/ci/test_notebooks.sh b/ci/test_notebooks.sh
index 61ae4f194..44353684a 100755
--- a/ci/test_notebooks.sh
+++ b/ci/test_notebooks.sh
@@ -26,7 +26,6 @@ set -u
 rapids-print-env
 
 NBTEST="$(realpath "$(dirname "$0")/utils/nbtest.sh")"
-pushd notebooks
 
 # Add notebooks that should be skipped here
 # (space-separated list of filenames without paths)
@@ -36,17 +35,30 @@ EXITCODE=0
 trap "EXITCODE=1" ERR
 
 set +e
-for nb in $(find . -name "*.ipynb"); do
-    nbBasename=$(basename ${nb})
-    if (echo " ${SKIPNBS} " | grep -q " ${nbBasename} "); then
-        echo "--------------------------------------------------------------------------------"
-        echo "SKIPPING: ${nb} (listed in skip list)"
-        echo "--------------------------------------------------------------------------------"
-    else
-        nvidia-smi
-        ${NBTEST} ${nbBasename}
-    fi
-done
+
+test_notebooks() {
+    for nb in $(find . -name "*.ipynb"); do
+        nbBasename=$(basename ${nb})
+        if (echo " ${SKIPNBS} " | grep -q " ${nbBasename} "); then
+            echo "--------------------------------------------------------------------------------"
+            echo "SKIPPING: ${nb} (listed in skip list)"
+            echo "--------------------------------------------------------------------------------"
+        else
+            nvidia-smi
+            ${NBTEST} "${nb}"
+        fi
+    done
+}
+
+# test notebooks in notebooks/
+pushd notebooks
+test_notebooks
+popd
+
+# test notebooks in docs/
+pushd docs
+test_notebooks
+popd
 
 rapids-logger "Notebook test script exiting with value: $EXITCODE"
 exit ${EXITCODE}
diff --git a/ci/utils/nbtest.sh b/ci/utils/nbtest.sh
index fe18faa0a..fa1489563 100755
--- a/ci/utils/nbtest.sh
+++ b/ci/utils/nbtest.sh
@@ -1,5 +1,7 @@
 #!/bin/bash
-# Copyright (c) 2023, NVIDIA CORPORATION.
+# Copyright (c) 2023-2024, NVIDIA CORPORATION.
+
+set -e -u -o pipefail
 
 MAGIC_OVERRIDE_CODE="
 def my_run_line_magic(*args, **kwargs):
@@ -22,8 +24,7 @@ get_ipython().run_cell_magic=my_run_cell_magic
 "
 
 NO_COLORS=--colors=NoColor
-NBTMPDIR="$WORKSPACE/tmp"
-mkdir -p ${NBTMPDIR}
+NBTMPDIR="$(mktemp -d)"
 
 EXITCODE=0
 trap "EXITCODE=1" ERR
diff --git a/cpp/include/cuspatial_test/vector_factories.cuh b/cpp/include/cuspatial_test/vector_factories.cuh
index 9d3e8a31a..a261e6e3f 100644
--- a/cpp/include/cuspatial_test/vector_factories.cuh
+++ b/cpp/include/cuspatial_test/vector_factories.cuh
@@ -164,10 +164,26 @@ class multipolygon_array {
   {
     auto [geometry_offsets, part_offsets, ring_offsets, coordinates] = arr.to_host();
 
-    return os << "Geometry Offsets:\n\t{" << geometry_offsets << "}\n"
-              << "Part Offsets:\n\t{" << part_offsets << "}\n"
-              << "Ring Offsets: \n\t{" << ring_offsets << "}\n"
-              << "Coordinates: \n\t{" << coordinates << "}\n";
+    auto print_vector = [&](auto const& vec) {
+      for (auto it = vec.begin(); it != vec.end(); it++) {
+        os << *it;
+        if (std::next(it) != vec.end()) { os << ", "; }
+      }
+    };
+
+    os << "Geometry Offsets:\n\t{";
+    print_vector(geometry_offsets);
+    os << "}\n";
+    os << "Part Offsets:\n\t{";
+    print_vector(part_offsets);
+    os << "}\n";
+    os << "Ring Offsets: \n\t{";
+    print_vector(ring_offsets);
+    os << "}\n";
+    os << "Coordinates: \n\t{";
+    print_vector(coordinates);
+    os << "}\n";
+    return os;
   }
 
  protected:
diff --git a/cpp/tests/range/multipolygon_range_test.cu b/cpp/tests/range/multipolygon_range_test.cu
index 1ba2d9935..1e93ef136 100644
--- a/cpp/tests/range/multipolygon_range_test.cu
+++ b/cpp/tests/range/multipolygon_range_test.cu
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, NVIDIA CORPORATION.
+ * Copyright (c) 2023-2024, NVIDIA CORPORATION.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -1069,7 +1069,7 @@ class MultipolygonRangeOneTest : public MultipolygonRangeTestBase<T> {
   void test_geometry_offsets_it()
   {
     rmm::device_uvector<std::size_t> d_offsets = this->copy_geometry_offsets();
-    auto expected                              = make_device_vector<std::size_t>({0, 1});
+    auto expected                              = make_device_vector<std::size_t>({0, 2});
 
     CUSPATIAL_EXPECT_VECTORS_EQUIVALENT(d_offsets, expected);
   }
diff --git a/python/cuproj/cuproj/tests/test_version.py b/python/cuproj/cuproj/tests/test_version.py
new file mode 100644
index 000000000..a69e6c647
--- /dev/null
+++ b/python/cuproj/cuproj/tests/test_version.py
@@ -0,0 +1,12 @@
+# Copyright (c) 2024, NVIDIA CORPORATION.
+
+import cuproj
+
+
+def test_version_constants_are_populated():
+    # __git_commit__ will only be non-empty in a built distribution
+    assert isinstance(cuproj.__git_commit__, str)
+
+    # __version__ should always be non-empty
+    assert isinstance(cuproj.__version__, str)
+    assert len(cuproj.__version__) > 0
diff --git a/python/cuspatial/cuspatial/tests/basicpreds/test_intersections.py b/python/cuspatial/cuspatial/tests/basicpreds/test_intersections.py
index 993eb72a8..d2220197b 100644
--- a/python/cuspatial/cuspatial/tests/basicpreds/test_intersections.py
+++ b/python/cuspatial/cuspatial/tests/basicpreds/test_intersections.py
@@ -1,3 +1,5 @@
+# Copyright (c) 2024, NVIDIA CORPORATION.
+
 import geopandas as gpd
 import pandas as pd
 from geopandas.testing import assert_geoseries_equal
@@ -13,7 +15,9 @@ def run_test(s1, s2, expect_offset, expect_geom, expect_ids):
         cuspatial.from_geopandas(s1), cuspatial.from_geopandas(s2)
     )
 
-    assert_series_equal(expect_offset, offset.to_pandas(), check_dtype=False)
+    assert_series_equal(
+        expect_offset, pd.Series(offset.to_pandas()), check_dtype=False
+    )
     assert_geoseries_equal(expect_geom, geoms.to_geopandas())
     assert_frame_equal(expect_ids, ids.to_pandas())
 
diff --git a/python/cuspatial/cuspatial/tests/spatial/distance/test_pairwise_linestring_distance.py b/python/cuspatial/cuspatial/tests/spatial/distance/test_pairwise_linestring_distance.py
index b36e328b1..ba4cf1695 100644
--- a/python/cuspatial/cuspatial/tests/spatial/distance/test_pairwise_linestring_distance.py
+++ b/python/cuspatial/cuspatial/tests/spatial/distance/test_pairwise_linestring_distance.py
@@ -1,9 +1,9 @@
-# Copyright (c) 2023, NVIDIA CORPORATION.
+# Copyright (c) 2023-2024, NVIDIA CORPORATION.
 
 from shapely.geometry import LineString
 
 import cudf
-from cudf.testing._utils import assert_eq
+from cudf.testing import assert_eq
 
 import cuspatial
 
diff --git a/python/cuspatial/cuspatial/tests/spatial/join/test_point_in_polygon.py b/python/cuspatial/cuspatial/tests/spatial/join/test_point_in_polygon.py
index d4fb1d819..2bdda7b1d 100644
--- a/python/cuspatial/cuspatial/tests/spatial/join/test_point_in_polygon.py
+++ b/python/cuspatial/cuspatial/tests/spatial/join/test_point_in_polygon.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2019, NVIDIA CORPORATION.
+# Copyright (c) 2019-2024, NVIDIA CORPORATION.
 
 import numpy as np
 
@@ -245,17 +245,17 @@ def test_pip_bitmap_column_to_binary_array():
     expected = np.array(
         [[0, 0, 0, 0], [1, 1, 0, 1], [0, 0, 1, 1], [1, 0, 0, 1]], dtype="int8"
     )
-    np.testing.assert_array_equal(got.copy_to_host(), expected)
+    np.testing.assert_array_equal(got.get(), expected)
 
     col = cudf.Series([], dtype="i8")._column
     got = pip_bitmap_column_to_binary_array(col, width=0)
     expected = np.array([], dtype="int8").reshape(0, 0)
-    np.testing.assert_array_equal(got.copy_to_host(), expected)
+    np.testing.assert_array_equal(got.get(), expected)
 
     col = cudf.Series([None, None], dtype="float64")._column
     got = pip_bitmap_column_to_binary_array(col, width=0)
     expected = np.array([], dtype="int8").reshape(2, 0)
-    np.testing.assert_array_equal(got.copy_to_host(), expected)
+    np.testing.assert_array_equal(got.get(), expected)
 
     col = cudf.Series(
         [
@@ -273,9 +273,9 @@ def test_pip_bitmap_column_to_binary_array():
         ],
         dtype="int8",
     )
-    np.testing.assert_array_equal(got.copy_to_host(), expected)
+    np.testing.assert_array_equal(got.get(), expected)
 
     col = cudf.Series([0, 0, 0])._column
     got = pip_bitmap_column_to_binary_array(col, width=3)
     expected = np.array([[0, 0, 0], [0, 0, 0], [0, 0, 0]], dtype="int8")
-    np.testing.assert_array_equal(got.copy_to_host(), expected)
+    np.testing.assert_array_equal(got.get(), expected)
diff --git a/python/cuspatial/cuspatial/tests/test_geodataframe.py b/python/cuspatial/cuspatial/tests/test_geodataframe.py
index 718046c17..dee2bfeb4 100644
--- a/python/cuspatial/cuspatial/tests/test_geodataframe.py
+++ b/python/cuspatial/cuspatial/tests/test_geodataframe.py
@@ -331,7 +331,7 @@ def test_memory_usage(gs, data_dir):
     host_dataframe = gpd.read_file(data_dir / "naturalearth_lowres.shp")
     gpu_dataframe = cuspatial.from_geopandas(host_dataframe)
     # The df size is 8kb of cudf rows and 217kb of the geometry column
-    assert gpu_dataframe.memory_usage().sum() == 216793
+    assert gpu_dataframe.memory_usage().sum() == 216789
 
 
 def test_from_dict():
diff --git a/python/cuspatial/cuspatial/tests/test_geoseries.py b/python/cuspatial/cuspatial/tests/test_geoseries.py
index 6e97d037b..35007c57d 100644
--- a/python/cuspatial/cuspatial/tests/test_geoseries.py
+++ b/python/cuspatial/cuspatial/tests/test_geoseries.py
@@ -554,7 +554,7 @@ def test_memory_usage_simple(gs):
 def test_memory_usage_large(naturalearth_lowres):
     geometry = cuspatial.from_geopandas(naturalearth_lowres)["geometry"]
     # the geometry column from naturalearth_lowres is 217kb of coordinates
-    assert geometry.memory_usage() == 216793
+    assert geometry.memory_usage() == 216789
 
 
 @pytest.mark.parametrize("level", [None, 0, 1])
diff --git a/python/cuspatial/cuspatial/tests/test_version.py b/python/cuspatial/cuspatial/tests/test_version.py
new file mode 100644
index 000000000..dfddfa8d6
--- /dev/null
+++ b/python/cuspatial/cuspatial/tests/test_version.py
@@ -0,0 +1,12 @@
+# Copyright (c) 2024, NVIDIA CORPORATION.
+
+import cuspatial
+
+
+def test_version_constants_are_populated():
+    # __git_commit__ will only be non-empty in a built distribution
+    assert isinstance(cuspatial.__git_commit__, str)
+
+    # __version__ should always be non-empty
+    assert isinstance(cuspatial.__version__, str)
+    assert len(cuspatial.__version__) > 0