Repository: rapidsai/cuspatial (language: python)

Issue:
Updating cuDF & Pandas support for Pandas 2.x
Recently cuDF added Pandas 2.x support with PR ( https://github.com/rapidsai/cudf/pull/14916 ). This introduced some breaking changes. As a result of this downstream libraries (like cuSpatial) need updates to support the latest version of cuDF. Filing this issue to track that work
Automate C++ include file grouping and ordering using clang-format
Currently the C++ include files in the RAPIDS codebase are not consistently ordered and grouped.
Inconsistent ordering makes it harder to maintain the codebase, to understand the dependencies,
and to automate changes.

Using clang-format to automate the ordering and grouping of include files will not only add
consistent style, but it will ease automation of changes. For example, We are undertaking a
refactoring of RMM that will replace `rmm::mr::device_memory_resource*` with
`rmm::device_async_resource-ref` everywhere in RAPIDS (not just cuDF). This requires adding an
include to MANY files across multiple RAPIDS repos. Getting the location of this include correct
everywhere is very difficult without automatic grouping of headers.

I propose to use clang-format's `IncludeCategories` settings to automate the ordering and
grouping of include files in the C++ codebase consistently.

Proof-of-concept PRs have been created for RMM and cuDF:
 - cuDF: https://github.com/rapidsai/cudf/pull/15063
 - RMM: https://github.com/rapidsai/rmm/pull/1463

The ordering used for cuDF is given by the following settings.

```yaml
IncludeBlocks: Regroup
IncludeCategories:
  - Regex:           '^"' # quoted includes
    Priority:        1
  - Regex:           '^<(benchmarks|tests)/' # benchmark includes
    Priority:        2
  - Regex:           '^<cudf_test/' # cuDF includes
    Priority:        3
  - Regex:           '^<cudf/' # cuDF includes
    Priority:        4
  - Regex:           '^<(nvtext|cudf_kafka)' # other libcudf includes
    Priority:        5
  - Regex:           '^<(cugraph|cuml|cuspatial|raft|kvikio)' # Other RAPIDS includes
    Priority:        6
  - Regex:           '^<rmm/' # RMM includes
    Priority:        7
  - Regex:           '^<(thrust|cub|cuda)/' # CCCL includes
    Priority:        8
  - Regex:           '^<(cooperative_groups|cuco|cuda.h|cuda_runtime|device_types|math_constants|nvtx3)' # CUDA includes
    Priority:        8
  - Regex:           '^<.*\..*' # other system includes (e.g. with a '.')
    Priority:        9
  - Regex:           '^<[^.]+' # STL includes (no '.')
    Priority:        10
```



Discussion / hints:

Fix patch:
diff --git a/.devcontainer/cuda11.8-conda/devcontainer.json b/.devcontainer/cuda11.8-conda/devcontainer.json
index c9c17940c..281859a2d 100644
--- a/.devcontainer/cuda11.8-conda/devcontainer.json
+++ b/.devcontainer/cuda11.8-conda/devcontainer.json
@@ -5,12 +5,12 @@
     "args": {
       "CUDA": "11.8",
       "PYTHON_PACKAGE_MANAGER": "conda",
-      "BASE": "rapidsai/devcontainers:24.02-cpp-llvm16-cuda11.8-mambaforge-ubuntu22.04"
+      "BASE": "rapidsai/devcontainers:24.04-cpp-llvm16-cuda11.8-mambaforge-ubuntu22.04"
     }
   },
   "hostRequirements": {"gpu": "optional"},
   "features": {
-    "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:24.2": {}
+    "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:24.4": {}
   },
   "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 0bd958012..5f042ffd4 100644
--- a/.devcontainer/cuda11.8-pip/devcontainer.json
+++ b/.devcontainer/cuda11.8-pip/devcontainer.json
@@ -5,12 +5,12 @@
     "args": {
       "CUDA": "11.8",
       "PYTHON_PACKAGE_MANAGER": "pip",
-      "BASE": "rapidsai/devcontainers:24.02-cpp-llvm16-cuda11.8-ubuntu22.04"
+      "BASE": "rapidsai/devcontainers:24.04-cpp-cuda11.8-ubuntu22.04"
     }
   },
   "hostRequirements": {"gpu": "optional"},
   "features": {
-    "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:24.2": {}
+    "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:24.4": {}
   },
   "overrideFeatureInstallOrder": [
     "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils"
diff --git a/.devcontainer/cuda12.0-conda/devcontainer.json b/.devcontainer/cuda12.2-conda/devcontainer.json
similarity index 88%
rename from .devcontainer/cuda12.0-conda/devcontainer.json
rename to .devcontainer/cuda12.2-conda/devcontainer.json
index 83e172198..ab04745b7 100644
--- a/.devcontainer/cuda12.0-conda/devcontainer.json
+++ b/.devcontainer/cuda12.2-conda/devcontainer.json
@@ -3,19 +3,19 @@
     "context": "${localWorkspaceFolder}/.devcontainer",
     "dockerfile": "${localWorkspaceFolder}/.devcontainer/Dockerfile",
     "args": {
-      "CUDA": "12.0",
+      "CUDA": "12.2",
       "PYTHON_PACKAGE_MANAGER": "conda",
-      "BASE": "rapidsai/devcontainers:24.02-cpp-mambaforge-ubuntu22.04"
+      "BASE": "rapidsai/devcontainers:24.04-cpp-mambaforge-ubuntu22.04"
     }
   },
   "hostRequirements": {"gpu": "optional"},
   "features": {
-    "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:24.2": {}
+    "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:24.4": {}
   },
   "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.0-envs}"],
+  "initializeCommand": ["/bin/bash", "-c", "mkdir -m 0755 -p ${localWorkspaceFolder}/../.{aws,cache,config,conda/pkgs,conda/${localWorkspaceFolderBasename}-cuda12.2-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",
@@ -24,7 +24,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.0-envs,target=/home/coder/.conda/envs,type=bind,consistency=consistent"
+    "source=${localWorkspaceFolder}/../.conda/${localWorkspaceFolderBasename}-cuda12.2-envs,target=/home/coder/.conda/envs,type=bind,consistency=consistent"
   ],
   "customizations": {
     "vscode": {
diff --git a/.devcontainer/cuda12.0-pip/devcontainer.json b/.devcontainer/cuda12.2-pip/devcontainer.json
similarity index 87%
rename from .devcontainer/cuda12.0-pip/devcontainer.json
rename to .devcontainer/cuda12.2-pip/devcontainer.json
index 7910122a3..d4f567086 100644
--- a/.devcontainer/cuda12.0-pip/devcontainer.json
+++ b/.devcontainer/cuda12.2-pip/devcontainer.json
@@ -3,19 +3,19 @@
     "context": "${localWorkspaceFolder}/.devcontainer",
     "dockerfile": "${localWorkspaceFolder}/.devcontainer/Dockerfile",
     "args": {
-      "CUDA": "12.0",
+      "CUDA": "12.2",
       "PYTHON_PACKAGE_MANAGER": "pip",
-      "BASE": "rapidsai/devcontainers:24.02-cpp-llvm16-cuda12.0-ubuntu22.04"
+      "BASE": "rapidsai/devcontainers:24.04-cpp-cuda12.2-ubuntu22.04"
     }
   },
   "hostRequirements": {"gpu": "optional"},
   "features": {
-    "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:24.2": {}
+    "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:24.4": {}
   },
   "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.0-venvs}"],
+  "initializeCommand": ["/bin/bash", "-c", "mkdir -m 0755 -p ${localWorkspaceFolder}/../.{aws,cache,config/pip,local/share/${localWorkspaceFolderBasename}-cuda12.2-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",
@@ -23,7 +23,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.0-venvs,target=/home/coder/.local/share/venvs,type=bind,consistency=consistent"
+    "source=${localWorkspaceFolder}/../.local/share/${localWorkspaceFolderBasename}-cuda12.2-venvs,target=/home/coder/.local/share/venvs,type=bind,consistency=consistent"
   ],
   "customizations": {
     "vscode": {
diff --git a/.github/ops-bot.yaml b/.github/ops-bot.yaml
index 9a0b41550..2ed5231ae 100644
--- a/.github/ops-bot.yaml
+++ b/.github/ops-bot.yaml
@@ -6,3 +6,4 @@ branch_checker: true
 label_checker: true
 release_drafter: true
 recently_updated: true
+forward_merger: true
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index 470b74f65..ba2bf3bc8 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.02
+    uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@branch-24.04
     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.02
+    uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@branch-24.04
     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.02
+    uses: rapidsai/shared-workflows/.github/workflows/conda-upload-packages.yaml@branch-24.04
     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.02
+    uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-24.04
     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.02
+    uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-24.04
     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.02
+    uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@branch-24.04
     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.02
+    uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-24.04
     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.02
+    uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@branch-24.04
     with:
       build_type: ${{ inputs.build_type || 'branch' }}
       branch: ${{ inputs.branch }}
diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml
index 60d7fbb77..10b8ccff9 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.02
+    uses: rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@branch-24.04
   checks:
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@branch-24.02
+    uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@branch-24.04
     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.02
+    uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@branch-24.04
     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.02
+    uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@branch-24.04
     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.02
+    uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@branch-24.04
     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.02
+    uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@branch-24.04
     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.02
+    uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-24.04
     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.02
+    uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-24.04
     with:
       build_type: pull-request
       node_type: "gpu-v100-latest-1"
@@ -78,35 +78,37 @@ jobs:
   wheel-build-cuspatial:
     needs: checks
     secrets: inherit
-    uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-24.02
+    uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-24.04
     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.02
+    uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-24.04
     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.02
+    uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-24.04
     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.02
+    uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-24.04
     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.02
+    uses: rapidsai/shared-workflows/.github/workflows/build-in-devcontainer.yaml@fix/devcontainer-json-location
     with:
+      arch: '["amd64"]'
+      cuda: '["12.2"]'
       build_command: |
         sccache -z;
         build-all -DBUILD_TESTS=ON -DBUILD_BENCHMARKS=ON --verbose;
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index df1987c30..1ad856310 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,4 +1,4 @@
-# Copyright (c) 2019-2023, NVIDIA CORPORATION.
+# Copyright (c) 2019-2024, NVIDIA CORPORATION.
 
 repos:
       - repo: https://github.com/PyCQA/isort
@@ -39,14 +39,19 @@ repos:
       - repo: https://github.com/codespell-project/codespell
         rev: v2.2.4
         hooks:
-              - id: codespell
-                args: ["--config pyproject.toml"]
-                additional_dependencies: ["tomli"]
+            - id: codespell
+              args: ["--config pyproject.toml"]
+              additional_dependencies: ["tomli"]
       - repo: https://github.com/rapidsai/dependency-file-generator
         rev: v1.8.0
         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:
       python: python3
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 47bad8a40..fa7e8b254 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,34 @@
+# cuSpatial 24.04.00 (10 Apr 2024)
+
+## 🐛 Bug Fixes
+
+- Update pre-commit-hooks to v0.0.3 ([#1361](https://github.com/rapidsai/cuspatial/pull/1361)) [@KyleFromNVIDIA](https://github.com/KyleFromNVIDIA)
+- Fix Python 3.11 test failures ([#1351](https://github.com/rapidsai/cuspatial/pull/1351)) [@KyleFromNVIDIA](https://github.com/KyleFromNVIDIA)
+- Fix Broken CI for 24.04 ([#1338](https://github.com/rapidsai/cuspatial/pull/1338)) [@isVoid](https://github.com/isVoid)
+- handle more RAPIDS version formats in update-version.sh, refactor dependencies.yaml ([#1329](https://github.com/rapidsai/cuspatial/pull/1329)) [@jameslamb](https://github.com/jameslamb)
+
+## 📖 Documentation
+
+- fix formatting in developer guide ([#1330](https://github.com/rapidsai/cuspatial/pull/1330)) [@jameslamb](https://github.com/jameslamb)
+
+## 🛠️ Improvements
+
+- Use `conda env create --yes` instead of `--force` ([#1364](https://github.com/rapidsai/cuspatial/pull/1364)) [@bdice](https://github.com/bdice)
+- Add upper bound to prevent usage of NumPy 2 ([#1359](https://github.com/rapidsai/cuspatial/pull/1359)) [@bdice](https://github.com/bdice)
+- Enable pytest failures on warnings from cudf (Ensure values being set are casted to the object&#39;s type) ([#1358](https://github.com/rapidsai/cuspatial/pull/1358)) [@mroeschke](https://github.com/mroeschke)
+- Remove hard-coding of RAPIDS version where possible ([#1357](https://github.com/rapidsai/cuspatial/pull/1357)) [@KyleFromNVIDIA](https://github.com/KyleFromNVIDIA)
+- Replace `cudf.core` imports with public APIs ([#1356](https://github.com/rapidsai/cuspatial/pull/1356)) [@mroeschke](https://github.com/mroeschke)
+- Switch `pytest-xdist` algorithm to `worksteal` ([#1355](https://github.com/rapidsai/cuspatial/pull/1355)) [@bdice](https://github.com/bdice)
+- Replace cudf column.full with cudf.as_column ([#1350](https://github.com/rapidsai/cuspatial/pull/1350)) [@mroeschke](https://github.com/mroeschke)
+- Automate C++ include file grouping and ordering using clang-format ([#1349](https://github.com/rapidsai/cuspatial/pull/1349)) [@harrism](https://github.com/harrism)
+- Add support for Python 3.11, require NumPy 1.23+ ([#1348](https://github.com/rapidsai/cuspatial/pull/1348)) [@jameslamb](https://github.com/jameslamb)
+- write PROJ build dir export rules ([#1347](https://github.com/rapidsai/cuspatial/pull/1347)) [@trxcllnt](https://github.com/trxcllnt)
+- Update devcontainers to CUDA Toolkit 12.2 ([#1344](https://github.com/rapidsai/cuspatial/pull/1344)) [@trxcllnt](https://github.com/trxcllnt)
+- target branch-24.04 for GitHub Actions workflows ([#1343](https://github.com/rapidsai/cuspatial/pull/1343)) [@jameslamb](https://github.com/jameslamb)
+- Update ops-bot.yaml ([#1337](https://github.com/rapidsai/cuspatial/pull/1337)) [@AyodeAwe](https://github.com/AyodeAwe)
+- Remove -DNVBench_ENABLE_CUPTI=OFF. ([#1325](https://github.com/rapidsai/cuspatial/pull/1325)) [@bdice](https://github.com/bdice)
+- Support CUDA 12.2 ([#1320](https://github.com/rapidsai/cuspatial/pull/1320)) [@jameslamb](https://github.com/jameslamb)
+
 # cuSpatial 24.02.00 (12 Feb 2024)
 
 ## 🚨 Breaking Changes
diff --git a/README.md b/README.md
index 89b2caa40..5ceb75c38 100644
--- a/README.md
+++ b/README.md
@@ -113,19 +113,19 @@ 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.02-cuda11.8-py3.10
+    nvcr.io/nvidia/rapidsai/notebooks:24.04-cuda11.8-py3.10
 ```
 
 ### Install with Conda
 
 To install via conda:
-> **Note** cuSpatial is supported only on Linux or [through WSL](https://rapids.ai/wsl2.html), and with Python versions 3.9 and 3.10
+> **Note** cuSpatial is supported only on Linux or [through WSL](https://rapids.ai/wsl2.html), and with Python versions 3.9, 3.10, and 3.11.
 
 cuSpatial can be installed with conda (miniconda, or the full Anaconda distribution) from the rapidsai channel:
 
 ```shell
 conda install -c rapidsai -c conda-forge -c nvidia \
-    cuspatial=24.02 python=3.10 cudatoolkit=11.8
+    cuspatial=24.04 python=3.11 cudatoolkit=11.8
 ```
 We also provide nightly Conda packages built from the HEAD of our latest development branch.
 
@@ -134,7 +134,7 @@ See the [RAPIDS installation documentation](https://docs.rapids.ai/install) for
 ### Install with pip
 
 To install via pip:
-> **Note** cuSpatial is supported only on Linux or [through WSL](https://rapids.ai/wsl2.html), and with Python versions 3.9 and 3.10
+> **Note** cuSpatial is supported only on Linux or [through WSL](https://rapids.ai/wsl2.html), and with Python versions 3.9, 3.10, and 3.11.
 
 The cuSpatial pip packages can be installed from NVIDIA's PyPI index. pip installations require using the matching wheel to the system's installed CUDA toolkit.
 - For CUDA 11 toolkits, install the `-cu11` wheels
@@ -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.02,
+@misc{cuspatial:24.04,
     author = {{NVIDIA Corporation}},
     title = {cuSpatial: GPU-Accelerated Geospatial and Spatiotemporal Algorithms},
     year = {2023},
diff --git a/VERSION b/VERSION
index 3c6c5e2b7..4a2fe8aa5 100644
--- a/VERSION
+++ b/VERSION
@@ -1,1 +1,1 @@
-24.02.00
+24.04.00
diff --git a/ci/build_docs.sh b/ci/build_docs.sh
index 74516e0de..c0d99969a 100755
--- a/ci/build_docs.sh
+++ b/ci/build_docs.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright (c) 2023, NVIDIA CORPORATION.
+# Copyright (c) 2023-2024, NVIDIA CORPORATION.
 
 set -euo pipefail
 
@@ -11,7 +11,7 @@ rapids-dependency-file-generator \
   --file_key docs \
   --matrix "cuda=${RAPIDS_CUDA_VERSION%.*};arch=$(arch);py=${RAPIDS_PY_VERSION}" | tee env.yaml
 
-rapids-mamba-retry env create --force -f env.yaml -n docs
+rapids-mamba-retry env create --yes -f env.yaml -n docs
 conda activate docs
 
 rapids-print-env
@@ -27,7 +27,9 @@ rapids-mamba-retry install \
   cuspatial \
   cuproj
 
-export RAPIDS_VERSION_NUMBER="24.02"
+export RAPIDS_VERSION="$(rapids-version)"
+export RAPIDS_VERSION_MAJOR_MINOR="$(rapids-version-major-minor)"
+export RAPIDS_VERSION_NUMBER="$RAPIDS_VERSION_MAJOR_MINOR"
 export RAPIDS_DOCS_DIR="$(mktemp -d)"
 
 rapids-logger "Build cuSpatial CPP docs"
diff --git a/ci/check_style.sh b/ci/check_style.sh
index e120fe418..1038b06f6 100755
--- a/ci/check_style.sh
+++ b/ci/check_style.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright (c) 2020-2022, NVIDIA CORPORATION.
+# Copyright (c) 2020-2024, NVIDIA CORPORATION.
 
 set -euo pipefail
 
@@ -11,7 +11,7 @@ rapids-dependency-file-generator \
   --file_key checks \
   --matrix "cuda=${RAPIDS_CUDA_VERSION%.*};arch=$(arch);py=${RAPIDS_PY_VERSION}" | tee env.yaml
 
-rapids-mamba-retry env create --force -f env.yaml -n checks
+rapids-mamba-retry env create --yes -f env.yaml -n checks
 conda activate checks
 
 FORMAT_FILE_URL=https://raw.githubusercontent.com/rapidsai/rapids-cmake/branch-23.02/cmake-format-rapids-cmake.json
diff --git a/ci/release/update-version.sh b/ci/release/update-version.sh
index 416f49fe2..8bf47d77f 100755
--- a/ci/release/update-version.sh
+++ b/ci/release/update-version.sh
@@ -1,4 +1,5 @@
 #!/bin/bash
+# Copyright (c) 2019-2024, NVIDIA CORPORATION.
 #############################
 # cuSpatial Version Updater #
 #############################
@@ -29,33 +30,9 @@ function sed_runner() {
     sed -i.bak ''"$1"'' $2 && rm -f ${2}.bak
 }
 
-# python/cpp update
-sed_runner 's/'"CUSPATIAL VERSION .* LANGUAGES"'/'"CUSPATIAL VERSION ${NEXT_FULL_TAG} LANGUAGES"'/g' cpp/CMakeLists.txt
-sed_runner 's/'"CUPROJ VERSION .* LANGUAGES"'/'"CUPROJ VERSION ${NEXT_FULL_TAG} LANGUAGES"'/g' cpp/cuproj/CMakeLists.txt
-sed_runner 's/'"cuspatial_version .*)"'/'"cuspatial_version ${NEXT_FULL_TAG})"'/g' python/cuspatial/CMakeLists.txt
-sed_runner 's/'"cuproj_version .*)"'/'"cuproj_version ${NEXT_FULL_TAG})"'/g' python/cuproj/CMakeLists.txt
-sed_runner 's/'"cuproj_version .*)"'/'"cuproj_version ${NEXT_FULL_TAG})"'/g' python/cuproj/cuproj/cuprojshim/CMakeLists.txt
-
-# RTD update
-sed_runner 's/version = .*/version = '"'${NEXT_SHORT_TAG}'"'/g' docs/source/conf.py
-sed_runner 's/release = .*/release = '"'${NEXT_FULL_TAG}'"'/g' docs/source/conf.py
-sed_runner 's/version = .*/version = '"'${NEXT_SHORT_TAG}'"'/g' docs/cuproj/source/conf.py
-sed_runner 's/release = .*/release = '"'${NEXT_FULL_TAG}'"'/g' docs/cuproj/source/conf.py
-
 # Centralized version file update
 echo "${NEXT_FULL_TAG}" > VERSION
 
-# rapids-cmake version
-sed_runner 's/'"branch-.*\/RAPIDS.cmake"'/'"branch-${NEXT_SHORT_TAG}\/RAPIDS.cmake"'/g' fetch_rapids.cmake
-
-# Doxyfile update - cuspatial
-sed_runner "/PROJECT_NUMBER[ ]*=/ s|=.*|= ${NEXT_FULL_TAG}|g" cpp/doxygen/Doxyfile
-sed_runner "/TAGFILES/ s|[0-9]\+.[0-9]\+|${NEXT_SHORT_TAG}|g" cpp/doxygen/Doxyfile
-
-#Doxyfile update - cuproj
-sed_runner "/PROJECT_NUMBER[ ]*=/ s|=.*|= ${NEXT_FULL_TAG}|g" cpp/cuproj/doxygen/Doxyfile
-sed_runner "/TAGFILES/ s|[0-9]\+.[0-9]\+|${NEXT_SHORT_TAG}|g" cpp/cuproj/doxygen/Doxyfile
-
 # CI files
 for FILE in .github/workflows/*.yaml; do
   sed_runner "/shared-workflows/ s/@.*/@branch-${NEXT_SHORT_TAG}/g" "${FILE}"
@@ -77,10 +54,10 @@ DEPENDENCIES=(
 
 for DEP in "${DEPENDENCIES[@]}"; do
   for FILE in dependencies.yaml conda/environments/*.yaml; do
-    sed_runner "/-.* ${DEP}==/ s/==.*/==${NEXT_SHORT_TAG_PEP440}.*/g" ${FILE}
+    sed_runner "/-.* ${DEP}\(-cu[[:digit:]]\{2\}\)\{0,1\}==/ s/==.*/==${NEXT_SHORT_TAG_PEP440}.*/g" "${FILE}"
   done
-  sed_runner "s/${DEP}==.*\",/${DEP}==${NEXT_SHORT_TAG_PEP440}.*\",/g" python/cuspatial/pyproject.toml
-  sed_runner "s/${DEP}==.*\",/${DEP}==${NEXT_SHORT_TAG_PEP440}.*\",/g" python/cuproj/pyproject.toml
+  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
 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 c09a7ae6c..506060cf9 100644
--- a/conda/environments/all_cuda-118_arch-x86_64.yaml
+++ b/conda/environments/all_cuda-118_arch-x86_64.yaml
@@ -11,8 +11,8 @@ dependencies:
 - cmake>=3.26.4
 - cuda-version=11.8
 - cudatoolkit
-- cudf==24.2.*
-- cuml==24.2.*
+- cudf==24.4.*
+- cuml==24.4.*
 - cupy>=12.0.0
 - curl
 - cxx-compiler
@@ -24,12 +24,13 @@ dependencies:
 - gtest>=1.13.0
 - ipython
 - ipywidgets
-- libcudf==24.2.*
-- librmm==24.2.*
+- libcudf==24.4.*
+- librmm==24.4.*
 - myst-parser
 - nbsphinx
 - ninja
 - notebook
+- numpy>=1.23,<2.0a0
 - numpydoc
 - nvcc_linux-64=11.8
 - pre-commit
@@ -39,8 +40,8 @@ dependencies:
 - pytest
 - pytest-cov
 - pytest-xdist
-- python>=3.9,<3.11
-- rmm==24.2.*
+- python>=3.9,<3.12
+- rmm==24.4.*
 - scikit-build-core>=0.7.0
 - scikit-image
 - shapely
diff --git a/conda/environments/all_cuda-120_arch-x86_64.yaml b/conda/environments/all_cuda-122_arch-x86_64.yaml
similarity index 81%
rename from conda/environments/all_cuda-120_arch-x86_64.yaml
rename to conda/environments/all_cuda-122_arch-x86_64.yaml
index 66fa869cc..566aa2327 100644
--- a/conda/environments/all_cuda-120_arch-x86_64.yaml
+++ b/conda/environments/all_cuda-122_arch-x86_64.yaml
@@ -13,9 +13,9 @@ dependencies:
 - cuda-cupti-dev
 - cuda-nvcc
 - cuda-nvrtc-dev
-- cuda-version=12.0
-- cudf==24.2.*
-- cuml==24.2.*
+- cuda-version=12.2
+- cudf==24.4.*
+- cuml==24.4.*
 - cupy>=12.0.0
 - curl
 - cxx-compiler
@@ -27,12 +27,13 @@ dependencies:
 - gtest>=1.13.0
 - ipython
 - ipywidgets
-- libcudf==24.2.*
-- librmm==24.2.*
+- libcudf==24.4.*
+- librmm==24.4.*
 - myst-parser
 - nbsphinx
 - ninja
 - notebook
+- numpy>=1.23,<2.0a0
 - numpydoc
 - pre-commit
 - proj
@@ -41,12 +42,12 @@ dependencies:
 - pytest
 - pytest-cov
 - pytest-xdist
-- python>=3.9,<3.11
-- rmm==24.2.*
+- python>=3.9,<3.12
+- rmm==24.4.*
 - scikit-build-core>=0.7.0
 - scikit-image
 - shapely
 - sphinx<6
 - sqlite
 - sysroot_linux-64==2.17
-name: all_cuda-120_arch-x86_64
+name: all_cuda-122_arch-x86_64
diff --git a/conda/recipes/cuproj/meta.yaml b/conda/recipes/cuproj/meta.yaml
index 532d349c2..22309116e 100644
--- a/conda/recipes/cuproj/meta.yaml
+++ b/conda/recipes/cuproj/meta.yaml
@@ -36,6 +36,9 @@ build:
   ignore_run_exports_from:
     {% if cuda_major == "11" %}
     - {{ compiler('cuda11') }}
+    {% else %}
+    - {{ compiler('cuda') }}
+    - cuda-cudart-dev
     {% endif %}
 
 requirements:
@@ -51,6 +54,9 @@ requirements:
     - ninja
     - sysroot_{{ target_platform }} {{ sysroot_version }}
   host:
+    {% if cuda_major != "11" %}
+    - cuda-cudart-dev
+    {% endif %}
     - cuda-version ={{ cuda_version }}
     - cmake {{ cmake_version }}
     - cython >=3.0.0
@@ -63,6 +69,8 @@ requirements:
   run:
     {% if cuda_major == "11" %}
     - cudatoolkit
+    {% else %}
+    - cuda-cudart
     {% endif %}
     - {{ pin_compatible('cuda-version', max_pin='x', min_pin='x') }}
     - python
diff --git a/conda/recipes/cuspatial/meta.yaml b/conda/recipes/cuspatial/meta.yaml
index 9e2cb33da..c2c60133d 100644
--- a/conda/recipes/cuspatial/meta.yaml
+++ b/conda/recipes/cuspatial/meta.yaml
@@ -1,4 +1,4 @@
-# Copyright (c) 2018-2023, NVIDIA CORPORATION.
+# Copyright (c) 2018-2024, NVIDIA CORPORATION.
 
 {% set version = environ['RAPIDS_PACKAGE_VERSION'].lstrip('v') %}
 {% set minor_version = version.split('.')[0] + '.' + version.split('.')[1] %}
@@ -36,6 +36,9 @@ build:
   ignore_run_exports_from:
     {% if cuda_major == "11" %}
     - {{ compiler('cuda11') }}
+    {% else %}
+    - {{ compiler('cuda') }}
+    - cuda-cudart-dev
     {% endif %}
 
 requirements:
@@ -51,6 +54,9 @@ requirements:
     - ninja
     - sysroot_{{ target_platform }} {{ sysroot_version }}
   host:
+    {% if cuda_major != "11" %}
+    - cuda-cudart-dev
+    {% endif %}
     - cuda-version ={{ cuda_version }}
     - cmake {{ cmake_version }}
     - cudf ={{ minor_version }}
@@ -63,10 +69,13 @@ requirements:
   run:
     {% if cuda_major == "11" %}
     - cudatoolkit
+    {% else %}
+    - cuda-cudart
     {% endif %}
     - {{ pin_compatible('cuda-version', max_pin='x', min_pin='x') }}
     - cudf ={{ minor_version }}
     - geopandas >=0.11.0
+    - numpy >=1.23,<2.0a0
     - python
     - rmm ={{ minor_version }}
 
diff --git a/conda/recipes/libcuspatial/build.sh b/conda/recipes/libcuspatial/build.sh
index e942f6094..4c6da113e 100644
--- a/conda/recipes/libcuspatial/build.sh
+++ b/conda/recipes/libcuspatial/build.sh
@@ -1,5 +1,4 @@
 # Copyright (c) 2018-2023, NVIDIA CORPORATION.
 
 # build cuspatial with verbose output
-./build.sh -v libcuspatial tests benchmarks --allgpuarch -n \
-    --cmake-args=\"-DNVBench_ENABLE_CUPTI=OFF\"
+./build.sh -v libcuspatial tests benchmarks --allgpuarch -n
diff --git a/conda/recipes/libcuspatial/meta.yaml b/conda/recipes/libcuspatial/meta.yaml
index b543823d5..659aa511c 100644
--- a/conda/recipes/libcuspatial/meta.yaml
+++ b/conda/recipes/libcuspatial/meta.yaml
@@ -62,20 +62,27 @@ outputs:
       string: cuda{{ cuda_major }}_{{ date_string }}_{{ GIT_DESCRIBE_HASH }}_{{ GIT_DESCRIBE_NUMBER }}
       run_exports:
         - {{ pin_subpackage("libcuspatial", max_pin="x.x") }}
+      ignore_run_exports_from:
+        {% if cuda_major == "11" %}
+        - {{ compiler('cuda11') }}
+        {% else %}
+        - {{ compiler('cuda') }}
+        - cuda-cudart-dev
+        {% endif %}
     requirements:
       build:
         - cmake {{ cmake_version }}
       host:
         - cuda-version ={{ cuda_version }}
-        {% if cuda_major == "11" %}
-        - cudatoolkit
-        {% else %}
+        {% if cuda_major != "11" %}
         - cuda-cudart-dev
         {% endif %}
       run:
         - {{ pin_compatible('cuda-version', max_pin='x', min_pin='x') }}
         {% if cuda_major == "11" %}
         - cudatoolkit
+        {% else %}
+        - cuda-cudart
         {% endif %}
         - libcudf ={{ minor_version }}
         - librmm ={{ minor_version }}
@@ -97,6 +104,13 @@ outputs:
     build:
       number: {{ GIT_DESCRIBE_NUMBER }}
       string: cuda{{ cuda_major }}_{{ date_string }}_{{ GIT_DESCRIBE_HASH }}_{{ GIT_DESCRIBE_NUMBER }}
+      ignore_run_exports_from:
+        {% if cuda_major == "11" %}
+        - {{ compiler('cuda11') }}
+        {% else %}
+        - {{ compiler('cuda') }}
+        - cuda-cudart-dev
+        {% endif %}
     requirements:
       build:
         - cmake {{ cmake_version }}
@@ -111,6 +125,8 @@ outputs:
         - {{ pin_subpackage('libcuspatial', exact=True) }}
         {% if cuda_major == "11" %}
         - cudatoolkit
+        {% else %}
+        - cuda-cudart
         {% endif %}
         - {{ pin_compatible('cuda-version', max_pin='x', min_pin='x') }}
         - gmock {{ gtest_version }}
diff --git a/cpp/.clang-format b/cpp/.clang-format
index 6019a6f3d..a0ae89a0f 100644
--- a/cpp/.clang-format
+++ b/cpp/.clang-format
@@ -15,7 +15,7 @@ AlignTrailingComments: true
 AllowAllArgumentsOnNextLine: true
 AllowAllConstructorInitializersOnNextLine: true
 AllowAllParametersOfDeclarationOnNextLine: true
-AllowShortBlocksOnASingleLine: true 
+AllowShortBlocksOnASingleLine: true
 AllowShortCaseLabelsOnASingleLine: true
 AllowShortEnumsOnASingleLine: true
 AllowShortFunctionsOnASingleLine: All
@@ -27,7 +27,7 @@ AlwaysBreakAfterDefinitionReturnType: None
 AlwaysBreakAfterReturnType: None
 AlwaysBreakBeforeMultilineStrings: true
 AlwaysBreakTemplateDeclarations: Yes
-BinPackArguments:  false       
+BinPackArguments:  false
 BinPackParameters: false
 BraceWrapping:
   AfterClass:            false
@@ -71,8 +71,28 @@ ForEachMacros:
   - foreach
   - Q_FOREACH
   - BOOST_FOREACH
-IncludeBlocks: Preserve
-IncludeIsMainRegex: '([-_](test|unittest))?$'
+IncludeBlocks: Regroup
+IncludeCategories:
+  - Regex:           '^"' # quoted includes
+    Priority:        1
+  - Regex:           '^<(benchmarks|tests)/' # benchmark includes
+    Priority:        2
+  - Regex:           '^<(cuspatial_test|cuproj_test)/' # cuSpatial/cuProj test includes
+    Priority:        3
+  - Regex:           '^<(cuspatial|cuproj)/' # cuSpatial/cuProj includes
+    Priority:        4
+  - Regex:           '^<(cudf_test|cudf|cuml|raft|kvikio)' # Other RAPIDS includes
+    Priority:        5
+  - Regex:           '^<rmm/' # RMM includes
+    Priority:        6
+  - Regex:           '^<(thrust|cub|cuda)/' # CCCL includes
+    Priority:        7
+  - Regex:           '^<(cooperative_groups|cuco|cuda.h|cuda_runtime|device_types|driver_types|math_constants|nvtx3)' # CUDA includes
+    Priority:        7
+  - Regex:           '^<.*\..*' # other system includes (e.g. with a '.')
+    Priority:        8
+  - Regex:           '^<[^.]+' # STL includes (no '.')
+    Priority:        9
 IndentCaseLabels: true
 IndentPPDirectives: None
 IndentWidth:     2
diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt
index 0b3116b89..1de36d515 100644
--- a/cpp/CMakeLists.txt
+++ b/cpp/CMakeLists.txt
@@ -1,5 +1,5 @@
 #=============================================================================
-# Copyright (c) 2019-2023, NVIDIA CORPORATION.
+# Copyright (c) 2019-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.
@@ -16,7 +16,7 @@
 
 cmake_minimum_required(VERSION 3.26.4 FATAL_ERROR)
 
-include(../fetch_rapids.cmake)
+include(../rapids_config.cmake)
 include(rapids-cmake)
 include(rapids-cpm)
 include(rapids-cuda)
@@ -25,7 +25,7 @@ include(rapids-find)
 
 rapids_cuda_init_architectures(CUSPATIAL)
 
-project(CUSPATIAL VERSION 24.02.00 LANGUAGES C CXX CUDA)
+project(CUSPATIAL VERSION "${RAPIDS_VERSION}" LANGUAGES C CXX CUDA)
 
 # Needed because GoogleBenchmark changes the state of FindThreads.cmake,
 # causing subsequent runs to have different values for the `Threads::Threads` target.
@@ -296,7 +296,7 @@ if(DOXYGEN_FOUND)
 add_custom_command(
   OUTPUT CUSPATIAL_DOXYGEN
   WORKING_DIRECTORY ${CUSPATIAL_SOURCE_DIR}/doxygen
-  COMMAND ${DOXYGEN_EXECUTABLE} Doxyfile
+  COMMAND ${CMAKE_COMMAND} -E env "RAPIDS_VERSION=${RAPIDS_VERSION}" "RAPIDS_VERSION_MAJOR_MINOR=${RAPIDS_VERSION_MAJOR_MINOR}" ${DOXYGEN_EXECUTABLE} Doxyfile
   VERBATIM
   COMMENT "Custom command for building cuspatial doxygen docs."
 )
diff --git a/cpp/benchmarks/distance/hausdorff_benchmark.cpp b/cpp/benchmarks/distance/hausdorff_benchmark.cpp
index 10ffced0e..8d39b7167 100644
--- a/cpp/benchmarks/distance/hausdorff_benchmark.cpp
+++ b/cpp/benchmarks/distance/hausdorff_benchmark.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2020-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.
@@ -14,11 +14,11 @@
  * limitations under the License.
  */
 
-#include <cuspatial/distance.hpp>
-
 #include <benchmarks/fixture/benchmark_fixture.hpp>
 #include <benchmarks/synchronization/synchronization.hpp>
 
+#include <cuspatial/distance.hpp>
+
 #include <cudf/detail/iterator.cuh>
 #include <cudf_test/column_wrapper.hpp>
 
diff --git a/cpp/benchmarks/distance/pairwise_linestring_distance.cu b/cpp/benchmarks/distance/pairwise_linestring_distance.cu
index c17c59b0d..539f8992a 100644
--- a/cpp/benchmarks/distance/pairwise_linestring_distance.cu
+++ b/cpp/benchmarks/distance/pairwise_linestring_distance.cu
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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,7 +15,6 @@
  */
 
 #include <benchmarks/fixture/rmm_pool_raii.hpp>
-#include <nvbench/nvbench.cuh>
 
 #include <cuspatial_test/geometry_generator.cuh>
 
@@ -23,6 +22,8 @@
 
 #include <rmm/cuda_stream_view.hpp>
 
+#include <nvbench/nvbench.cuh>
+
 using namespace cuspatial;
 
 template <typename T>
diff --git a/cpp/benchmarks/distance/pairwise_linestring_polygon_distance.cu b/cpp/benchmarks/distance/pairwise_linestring_polygon_distance.cu
index 0d4fdf574..703cdc5e5 100644
--- a/cpp/benchmarks/distance/pairwise_linestring_polygon_distance.cu
+++ b/cpp/benchmarks/distance/pairwise_linestring_polygon_distance.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.
@@ -15,7 +15,6 @@
  */
 
 #include <benchmarks/fixture/rmm_pool_raii.hpp>
-#include <nvbench/nvbench.cuh>
 
 #include <cuspatial_test/geometry_generator.cuh>
 
@@ -23,6 +22,8 @@
 
 #include <rmm/cuda_stream_view.hpp>
 
+#include <nvbench/nvbench.cuh>
+
 using namespace cuspatial;
 
 template <typename T>
diff --git a/cpp/benchmarks/distance/pairwise_point_polygon_distance.cu b/cpp/benchmarks/distance/pairwise_point_polygon_distance.cu
index c3f84da70..3bb08dd11 100644
--- a/cpp/benchmarks/distance/pairwise_point_polygon_distance.cu
+++ b/cpp/benchmarks/distance/pairwise_point_polygon_distance.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.
@@ -15,7 +15,6 @@
  */
 
 #include <benchmarks/fixture/rmm_pool_raii.hpp>
-#include <nvbench/nvbench.cuh>
 
 #include <cuspatial_test/geometry_generator.cuh>
 
@@ -25,6 +24,8 @@
 #include <rmm/cuda_stream_view.hpp>
 #include <rmm/exec_policy.hpp>
 
+#include <nvbench/nvbench.cuh>
+
 using namespace cuspatial;
 using namespace cuspatial::test;
 
diff --git a/cpp/benchmarks/indexing/quadtree_on_points.cu b/cpp/benchmarks/indexing/quadtree_on_points.cu
index 4984834f7..8f6448505 100644
--- a/cpp/benchmarks/indexing/quadtree_on_points.cu
+++ b/cpp/benchmarks/indexing/quadtree_on_points.cu
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -14,18 +14,19 @@
  * limitations under the License.
  */
 
+#include <benchmarks/fixture/rmm_pool_raii.hpp>
+
 #include <cuspatial/geometry/vec_2d.hpp>
 #include <cuspatial/point_quadtree.cuh>
 
-#include <benchmarks/fixture/rmm_pool_raii.hpp>
-#include <nvbench/nvbench.cuh>
-
 #include <rmm/cuda_stream_view.hpp>
 #include <rmm/device_vector.hpp>
-
 #include <rmm/exec_policy.hpp>
+
 #include <thrust/host_vector.h>
 
+#include <nvbench/nvbench.cuh>
+
 using namespace cuspatial;
 
 template <typename T>
diff --git a/cpp/benchmarks/point_in_polygon/point_in_polygon.cu b/cpp/benchmarks/point_in_polygon/point_in_polygon.cu
index 7f41dd371..71e089cd8 100644
--- a/cpp/benchmarks/point_in_polygon/point_in_polygon.cu
+++ b/cpp/benchmarks/point_in_polygon/point_in_polygon.cu
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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,7 +15,6 @@
  */
 
 #include <benchmarks/fixture/rmm_pool_raii.hpp>
-#include <nvbench/nvbench.cuh>
 
 #include <cuspatial_test/geometry_generator.cuh>
 
@@ -27,6 +26,8 @@
 
 #include <thrust/iterator/counting_iterator.h>
 
+#include <nvbench/nvbench.cuh>
+
 #include <memory>
 #include <numeric>
 
diff --git a/cpp/benchmarks/points_in_range/points_in_range.cu b/cpp/benchmarks/points_in_range/points_in_range.cu
index b9bced1be..181f48429 100644
--- a/cpp/benchmarks/points_in_range/points_in_range.cu
+++ b/cpp/benchmarks/points_in_range/points_in_range.cu
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -26,14 +26,14 @@
 #include <rmm/device_uvector.hpp>
 #include <rmm/exec_policy.hpp>
 
-#include <nvbench/nvbench.cuh>
-
 #include <thrust/iterator/counting_iterator.h>
 #include <thrust/random/linear_congruential_engine.h>
 #include <thrust/random/normal_distribution.h>
 #include <thrust/random/uniform_int_distribution.h>
 #include <thrust/tabulate.h>
 
+#include <nvbench/nvbench.cuh>
+
 #include <memory>
 
 using cuspatial::vec_2d;
diff --git a/cpp/benchmarks/synchronization/synchronization.hpp b/cpp/benchmarks/synchronization/synchronization.hpp
index 5e84e9fb9..631b34405 100644
--- a/cpp/benchmarks/synchronization/synchronization.hpp
+++ b/cpp/benchmarks/synchronization/synchronization.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019-2020, NVIDIA CORPORATION.
+ * Copyright (c) 2019-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.
@@ -14,6 +14,14 @@
  * limitations under the License.
  */
 
+#pragma once
+
+#include <rmm/cuda_stream_view.hpp>
+
+#include <driver_types.h>
+
+#include <benchmark/benchmark.h>
+
 /**
  * @file synchronization.hpp
  * @brief This is the header file for `cuda_event_timer`.
@@ -52,22 +60,8 @@
     // Register the function as a benchmark. You will need to set the `UseManualTime()`
     // flag in order to use the timer embedded in this class.
     BENCHMARK(sample_cuda_benchmark)->UseManualTime();
-
-
  **/
 
-#ifndef CUDF_BENCH_SYNCHRONIZATION_H
-#define CUDF_BENCH_SYNCHRONIZATION_H
-
-// Google Benchmark library
-#include <benchmark/benchmark.h>
-
-#include <cudf/types.hpp>
-
-#include <rmm/cuda_stream_view.hpp>
-
-#include <driver_types.h>
-
 class cuda_event_timer {
  public:
   /**
@@ -99,5 +93,3 @@ class cuda_event_timer {
   rmm::cuda_stream_view stream;
   benchmark::State* p_state;
 };
-
-#endif
diff --git a/cpp/benchmarks/utility/floating_point_equality.cu b/cpp/benchmarks/utility/floating_point_equality.cu
index f0f99c4d8..cd44b9a5a 100644
--- a/cpp/benchmarks/utility/floating_point_equality.cu
+++ b/cpp/benchmarks/utility/floating_point_equality.cu
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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,7 @@
  */
 
 #include <benchmarks/fixture/rmm_pool_raii.hpp>
+
 #include <cuspatial_test/random.cuh>
 
 #include <cuspatial/detail/utility/floating_point.cuh>
@@ -23,10 +24,10 @@
 #include <rmm/device_vector.hpp>
 #include <rmm/exec_policy.hpp>
 
-#include <nvbench/nvbench.cuh>
-
 #include <thrust/tabulate.h>
 
+#include <nvbench/nvbench.cuh>
+
 #include <memory>
 #include <type_traits>
 
diff --git a/cpp/cuproj/CMakeLists.txt b/cpp/cuproj/CMakeLists.txt
index 2e1531b09..35ba0277e 100644
--- a/cpp/cuproj/CMakeLists.txt
+++ b/cpp/cuproj/CMakeLists.txt
@@ -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.
@@ -16,7 +16,7 @@
 
 cmake_minimum_required(VERSION 3.23.1 FATAL_ERROR)
 
-include(../../fetch_rapids.cmake)
+include(../../rapids_config.cmake)
 include(rapids-cmake)
 include(rapids-cpm)
 include(rapids-cuda)
@@ -25,7 +25,7 @@ include(rapids-find)
 
 rapids_cuda_init_architectures(CUPROJ)
 
-project(CUPROJ VERSION 24.02.00 LANGUAGES C CXX CUDA)
+project(CUPROJ VERSION "${RAPIDS_VERSION}" LANGUAGES C CXX CUDA)
 
 # Needed because GoogleBenchmark changes the state of FindThreads.cmake,
 # causing subsequent runs to have different values for the `Threads::Threads` target.
@@ -237,7 +237,7 @@ if(DOXYGEN_FOUND)
 add_custom_command(
   OUTPUT CUPROJ_DOXYGEN
   WORKING_DIRECTORY ${CUPROJ_SOURCE_DIR}/doxygen
-  COMMAND ${DOXYGEN_EXECUTABLE} Doxyfile
+  COMMAND ${CMAKE_COMMAND} -E env "RAPIDS_VERSION=${RAPIDS_VERSION}" "RAPIDS_VERSION_MAJOR_MINOR=${RAPIDS_VERSION_MAJOR_MINOR}" ${DOXYGEN_EXECUTABLE} Doxyfile
   VERBATIM
   COMMENT "Custom command for building cuproj doxygen docs."
 )
diff --git a/cpp/cuproj/benchmarks/synchronization/synchronization.hpp b/cpp/cuproj/benchmarks/synchronization/synchronization.hpp
index 169450ead..631b34405 100644
--- a/cpp/cuproj/benchmarks/synchronization/synchronization.hpp
+++ b/cpp/cuproj/benchmarks/synchronization/synchronization.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2019-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.
@@ -14,6 +14,14 @@
  * limitations under the License.
  */
 
+#pragma once
+
+#include <rmm/cuda_stream_view.hpp>
+
+#include <driver_types.h>
+
+#include <benchmark/benchmark.h>
+
 /**
  * @file synchronization.hpp
  * @brief This is the header file for `cuda_event_timer`.
@@ -52,22 +60,8 @@
     // Register the function as a benchmark. You will need to set the `UseManualTime()`
     // flag in order to use the timer embedded in this class.
     BENCHMARK(sample_cuda_benchmark)->UseManualTime();
-
-
  **/
 
-#ifndef CUDF_BENCH_SYNCHRONIZATION_H
-#define CUDF_BENCH_SYNCHRONIZATION_H
-
-// Google Benchmark library
-#include <benchmark/benchmark.h>
-
-#include <cudf/types.hpp>
-
-#include <rmm/cuda_stream_view.hpp>
-
-#include <driver_types.h>
-
 class cuda_event_timer {
  public:
   /**
@@ -99,5 +93,3 @@ class cuda_event_timer {
   rmm::cuda_stream_view stream;
   benchmark::State* p_state;
 };
-
-#endif
diff --git a/cpp/cuproj/benchmarks/wgs_to_utm_bench.cu b/cpp/cuproj/benchmarks/wgs_to_utm_bench.cu
index 7fe4c04ac..0533a0d65 100644
--- a/cpp/cuproj/benchmarks/wgs_to_utm_bench.cu
+++ b/cpp/cuproj/benchmarks/wgs_to_utm_bench.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.
@@ -14,14 +14,14 @@
  * limitations under the License.
  */
 
-#include <cuproj/projection_factories.cuh>
-#include <cuspatial/geometry/vec_2d.hpp>
+#include <benchmarks/fixture/benchmark_fixture.hpp>
+#include <benchmarks/synchronization/synchronization.hpp>
 
 #include <cuproj_test/convert_coordinates.hpp>
 #include <cuproj_test/coordinate_generator.cuh>
 
-#include <benchmarks/fixture/benchmark_fixture.hpp>
-#include <benchmarks/synchronization/synchronization.hpp>
+#include <cuproj/projection_factories.cuh>
+#include <cuspatial/geometry/vec_2d.hpp>
 
 #include <rmm/cuda_stream_view.hpp>
 #include <rmm/device_vector.hpp>
diff --git a/cpp/cuproj/cmake/thirdparty/get_proj.cmake b/cpp/cuproj/cmake/thirdparty/get_proj.cmake
index cd0b914eb..7c916193b 100644
--- a/cpp/cuproj/cmake/thirdparty/get_proj.cmake
+++ b/cpp/cuproj/cmake/thirdparty/get_proj.cmake
@@ -27,6 +27,26 @@ function(find_and_configure_proj VERSION)
     GIT_TAG ${VERSION}
     GIT_SHALLOW TRUE
   )
+
+  if(PROJ_ADDED)
+    install(TARGETS proj EXPORT proj-exports)
+
+    # write build export rules
+    rapids_export(
+      BUILD PROJ
+      VERSION ${VERSION}
+      EXPORT_SET proj-exports
+      GLOBAL_TARGETS proj
+      NAMESPACE PROJ::)
+
+    include("${rapids-cmake-dir}/export/find_package_root.cmake")
+    # When using cuPROJ from the build dir, ensure PROJ is also found in cuPROJ's build dir. This
+    # line adds `set(PROJ_ROOT "${CMAKE_CURRENT_LIST_DIR}")` to build/cuproj-dependencies.cmake
+    rapids_export_find_package_root(
+      BUILD PROJ [=[${CMAKE_CURRENT_LIST_DIR}]=] EXPORT_SET cuproj-exports
+    )
+  endif()
+
 endfunction()
 
 find_and_configure_proj(9.2.0)
diff --git a/cpp/cuproj/doxygen/Doxyfile b/cpp/cuproj/doxygen/Doxyfile
index 3a3332fca..986e5d6c6 100644
--- a/cpp/cuproj/doxygen/Doxyfile
+++ b/cpp/cuproj/doxygen/Doxyfile
@@ -48,7 +48,7 @@ PROJECT_NAME           = libcuproj
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = 24.02.00
+PROJECT_NUMBER         = $(RAPIDS_VERSION)
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
@@ -2345,7 +2345,7 @@ SKIP_FUNCTION_MACROS   = YES
 # the path). If a tag file is not located in the directory in which doxygen is
 # run, you must also specify the path to the tagfile here.
 
-TAGFILES               = rmm.tag=https://docs.rapids.ai/api/librmm/24.02 "libcudf.tag=https://docs.rapids.ai/api/libcudf/24.02"
+TAGFILES               = rmm.tag=https://docs.rapids.ai/api/librmm/$(RAPIDS_VERSION_MAJOR_MINOR) "libcudf.tag=https://docs.rapids.ai/api/libcudf/$(RAPIDS_VERSION_MAJOR_MINOR)"
 
 # When a file name is specified after GENERATE_TAGFILE, doxygen will create a
 # tag file that is based on the input files it reads. See section "Linking to
diff --git a/cpp/doxygen/Doxyfile b/cpp/doxygen/Doxyfile
index 3e8ec740d..2cc6f51d3 100644
--- a/cpp/doxygen/Doxyfile
+++ b/cpp/doxygen/Doxyfile
@@ -38,7 +38,7 @@ PROJECT_NAME           = "libcuspatial"
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = 24.02.00
+PROJECT_NUMBER         = $(RAPIDS_VERSION)
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
@@ -2171,7 +2171,7 @@ SKIP_FUNCTION_MACROS   = YES
 # the path). If a tag file is not located in the directory in which doxygen is
 # run, you must also specify the path to the tagfile here.
 
-TAGFILES               = rmm.tag=https://docs.rapids.ai/api/librmm/24.02 "libcudf.tag=https://docs.rapids.ai/api/libcudf/24.02"
+TAGFILES               = rmm.tag=https://docs.rapids.ai/api/librmm/$(RAPIDS_VERSION_MAJOR_MINOR) "libcudf.tag=https://docs.rapids.ai/api/libcudf/$(RAPIDS_VERSION_MAJOR_MINOR)"
 
 # When a file name is specified after GENERATE_TAGFILE, doxygen will create a
 # tag file that is based on the input files it reads. See section "Linking to
diff --git a/cpp/include/cuspatial/detail/algorithm/is_point_in_polygon.cuh b/cpp/include/cuspatial/detail/algorithm/is_point_in_polygon.cuh
index 2bbd3839d..ef5496d1a 100644
--- a/cpp/include/cuspatial/detail/algorithm/is_point_in_polygon.cuh
+++ b/cpp/include/cuspatial/detail/algorithm/is_point_in_polygon.cuh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -16,14 +16,13 @@
 
 #pragma once
 
+#include <cuspatial/detail/utility/floating_point.cuh>
+#include <cuspatial/geometry/polygon_ref.cuh>
 #include <cuspatial/geometry/vec_2d.hpp>
 #include <cuspatial/geometry/vec_3d.hpp>
 #include <cuspatial/geometry_collection/multipoint_ref.cuh>
 #include <cuspatial/traits.hpp>
 
-#include <cuspatial/detail/utility/floating_point.cuh>
-#include <cuspatial/geometry/polygon_ref.cuh>
-
 #include <thrust/swap.h>
 
 namespace cuspatial {
diff --git a/cpp/include/cuspatial/detail/bounding_boxes.cuh b/cpp/include/cuspatial/detail/bounding_boxes.cuh
index 2e2e3f6e5..22d749e9c 100644
--- a/cpp/include/cuspatial/detail/bounding_boxes.cuh
+++ b/cpp/include/cuspatial/detail/bounding_boxes.cuh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -27,6 +27,7 @@
 #include <thrust/iterator/discard_iterator.h>
 #include <thrust/iterator/transform_iterator.h>
 #include <thrust/reduce.h>
+
 #include <type_traits>
 
 namespace cuspatial {
diff --git a/cpp/include/cuspatial/detail/distance/hausdorff.cuh b/cpp/include/cuspatial/detail/distance/hausdorff.cuh
index 3b25014a4..aa955a7d6 100644
--- a/cpp/include/cuspatial/detail/distance/hausdorff.cuh
+++ b/cpp/include/cuspatial/detail/distance/hausdorff.cuh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -24,8 +24,7 @@
 #include <rmm/cuda_stream_view.hpp>
 #include <rmm/exec_policy.hpp>
 
-#include <ranger/ranger.hpp>
-
+#include <cuda/atomic>
 #include <thrust/advance.h>
 #include <thrust/binary_search.h>
 #include <thrust/distance.h>
@@ -33,7 +32,7 @@
 #include <thrust/fill.h>
 #include <thrust/memory.h>
 
-#include <cuda/atomic>
+#include <ranger/ranger.hpp>
 
 #include <type_traits>
 
diff --git a/cpp/include/cuspatial/detail/find/find_and_combine_segment.cuh b/cpp/include/cuspatial/detail/find/find_and_combine_segment.cuh
index 5694088ad..2cdbfd425 100644
--- a/cpp/include/cuspatial/detail/find/find_and_combine_segment.cuh
+++ b/cpp/include/cuspatial/detail/find/find_and_combine_segment.cuh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -24,11 +24,11 @@
 #include <rmm/cuda_stream_view.hpp>
 #include <rmm/exec_policy.hpp>
 
-#include <ranger/ranger.hpp>
-
 #include <thrust/sort.h>
 #include <thrust/uninitialized_fill.h>
 
+#include <ranger/ranger.hpp>
+
 namespace cuspatial {
 namespace detail {
 
diff --git a/cpp/include/cuspatial/detail/find/find_duplicate_points.cuh b/cpp/include/cuspatial/detail/find/find_duplicate_points.cuh
index 430a0bc5e..de18bb927 100644
--- a/cpp/include/cuspatial/detail/find/find_duplicate_points.cuh
+++ b/cpp/include/cuspatial/detail/find/find_duplicate_points.cuh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -22,10 +22,10 @@
 #include <rmm/cuda_stream_view.hpp>
 #include <rmm/exec_policy.hpp>
 
-#include <ranger/ranger.hpp>
-
 #include <thrust/uninitialized_fill.h>
 
+#include <ranger/ranger.hpp>
+
 namespace cuspatial {
 namespace detail {
 
diff --git a/cpp/include/cuspatial/detail/geometry/linestring_ref.cuh b/cpp/include/cuspatial/detail/geometry/linestring_ref.cuh
index 2e0e7370f..4b0d9d484 100644
--- a/cpp/include/cuspatial/detail/geometry/linestring_ref.cuh
+++ b/cpp/include/cuspatial/detail/geometry/linestring_ref.cuh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -17,11 +17,11 @@
 
 #include <cuspatial/cuda_utils.hpp>
 #include <cuspatial/geometry/segment.cuh>
+#include <cuspatial/geometry/vec_2d.hpp>
+#include <cuspatial/geometry/vec_3d.hpp>
 #include <cuspatial/iterator_factory.cuh>
 #include <cuspatial/traits.hpp>
 
-#include <cuspatial/geometry/vec_2d.hpp>
-#include <cuspatial/geometry/vec_3d.hpp>
 #include <thrust/iterator/zip_iterator.h>
 #include <thrust/tuple.h>
 
diff --git a/cpp/include/cuspatial/detail/geometry/polygon_ref.cuh b/cpp/include/cuspatial/detail/geometry/polygon_ref.cuh
index ffb3ea2bb..a7da32644 100644
--- a/cpp/include/cuspatial/detail/geometry/polygon_ref.cuh
+++ b/cpp/include/cuspatial/detail/geometry/polygon_ref.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.
@@ -17,12 +17,12 @@
 
 #include <cuspatial/cuda_utils.hpp>
 #include <cuspatial/geometry/segment.cuh>
+#include <cuspatial/geometry/vec_2d.hpp>
+#include <cuspatial/geometry/vec_3d.hpp>
 #include <cuspatial/geometry_collection/multilinestring_ref.cuh>
 #include <cuspatial/iterator_factory.cuh>
 #include <cuspatial/traits.hpp>
 
-#include <cuspatial/geometry/vec_2d.hpp>
-#include <cuspatial/geometry/vec_3d.hpp>
 #include <thrust/iterator/zip_iterator.h>
 #include <thrust/tuple.h>
 
diff --git a/cpp/include/cuspatial/detail/index/construction/phase_1.cuh b/cpp/include/cuspatial/detail/index/construction/phase_1.cuh
index b06dbc6bb..3d06c93b1 100644
--- a/cpp/include/cuspatial/detail/index/construction/phase_1.cuh
+++ b/cpp/include/cuspatial/detail/index/construction/phase_1.cuh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2021, NVIDIA CORPORATION.
+ * Copyright (c) 2020-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.
@@ -25,6 +25,7 @@
 #include <rmm/device_uvector.hpp>
 #include <rmm/exec_policy.hpp>
 
+#include <cuda/functional>
 #include <thrust/copy.h>
 #include <thrust/distance.h>
 #include <thrust/fill.h>
@@ -38,8 +39,6 @@
 #include <thrust/transform.h>
 #include <thrust/tuple.h>
 
-#include <cuda/functional>
-
 #include <memory>
 #include <tuple>
 #include <utility>
diff --git a/cpp/include/cuspatial/detail/intersection/linestring_intersection.cuh b/cpp/include/cuspatial/detail/intersection/linestring_intersection.cuh
index 2db5492ed..1d88e5e36 100644
--- a/cpp/include/cuspatial/detail/intersection/linestring_intersection.cuh
+++ b/cpp/include/cuspatial/detail/intersection/linestring_intersection.cuh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -35,6 +35,7 @@
 #include <rmm/mr/device/device_memory_resource.hpp>
 #include <rmm/mr/device/per_device_resource.hpp>
 
+#include <cuda/atomic>
 #include <thrust/binary_search.h>
 #include <thrust/iterator/constant_iterator.h>
 #include <thrust/iterator/discard_iterator.h>
@@ -49,8 +50,6 @@
 #include <thrust/uninitialized_fill.h>
 #include <thrust/unique.h>
 
-#include <cuda/atomic>
-
 #include <cstdint>
 #include <memory>
 
diff --git a/cpp/include/cuspatial/detail/intersection/linestring_intersection_count.cuh b/cpp/include/cuspatial/detail/intersection/linestring_intersection_count.cuh
index a0297b05b..b164fa729 100644
--- a/cpp/include/cuspatial/detail/intersection/linestring_intersection_count.cuh
+++ b/cpp/include/cuspatial/detail/intersection/linestring_intersection_count.cuh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -23,10 +23,10 @@
 
 #include <rmm/cuda_stream_view.hpp>
 
-#include <ranger/ranger.hpp>
-
 #include <thrust/tuple.h>
 
+#include <ranger/ranger.hpp>
+
 namespace cuspatial {
 namespace detail {
 
diff --git a/cpp/include/cuspatial/detail/intersection/linestring_intersection_with_duplicates.cuh b/cpp/include/cuspatial/detail/intersection/linestring_intersection_with_duplicates.cuh
index 3279df2f9..e513cf651 100644
--- a/cpp/include/cuspatial/detail/intersection/linestring_intersection_with_duplicates.cuh
+++ b/cpp/include/cuspatial/detail/intersection/linestring_intersection_with_duplicates.cuh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -30,8 +30,6 @@
 #include <rmm/exec_policy.hpp>
 #include <rmm/mr/device/device_memory_resource.hpp>
 
-#include <ranger/ranger.hpp>
-
 #include <thrust/binary_search.h>
 #include <thrust/distance.h>
 #include <thrust/iterator/counting_iterator.h>
@@ -42,6 +40,8 @@
 #include <thrust/tuple.h>
 #include <thrust/uninitialized_fill.h>
 
+#include <ranger/ranger.hpp>
+
 #include <type_traits>
 #include <utility>
 
diff --git a/cpp/include/cuspatial/detail/join/quadtree_bbox_filtering.cuh b/cpp/include/cuspatial/detail/join/quadtree_bbox_filtering.cuh
index c3009b1b2..43ff7b0f6 100644
--- a/cpp/include/cuspatial/detail/join/quadtree_bbox_filtering.cuh
+++ b/cpp/include/cuspatial/detail/join/quadtree_bbox_filtering.cuh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -22,9 +22,8 @@
 #include <cuspatial/point_quadtree.cuh>
 #include <cuspatial/traits.hpp>
 
-#include <thrust/iterator/discard_iterator.h>
-
 #include <cuda/functional>
+#include <thrust/iterator/discard_iterator.h>
 
 #include <iterator>
 #include <utility>
diff --git a/cpp/include/cuspatial/detail/join/quadtree_point_to_nearest_linestring.cuh b/cpp/include/cuspatial/detail/join/quadtree_point_to_nearest_linestring.cuh
index f594f51a3..6335f133f 100644
--- a/cpp/include/cuspatial/detail/join/quadtree_point_to_nearest_linestring.cuh
+++ b/cpp/include/cuspatial/detail/join/quadtree_point_to_nearest_linestring.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.
@@ -28,14 +28,13 @@
 #include <rmm/device_uvector.hpp>
 #include <rmm/exec_policy.hpp>
 
+#include <cuda/functional>
 #include <thrust/detail/raw_reference_cast.h>
 #include <thrust/iterator/discard_iterator.h>
 #include <thrust/iterator/permutation_iterator.h>
 #include <thrust/iterator/transform_iterator.h>
 #include <thrust/scan.h>
 
-#include <cuda/functional>
-
 #include <cstdint>
 
 namespace cuspatial {
diff --git a/cpp/include/cuspatial/detail/kernel/pairwise_distance.cuh b/cpp/include/cuspatial/detail/kernel/pairwise_distance.cuh
index 48c139e1e..9786681d9 100644
--- a/cpp/include/cuspatial/detail/kernel/pairwise_distance.cuh
+++ b/cpp/include/cuspatial/detail/kernel/pairwise_distance.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.
@@ -21,10 +21,10 @@
 
 #include <rmm/device_uvector.hpp>
 
-#include <ranger/ranger.hpp>
-
 #include <thrust/optional.h>
 
+#include <ranger/ranger.hpp>
+
 #include <limits>
 
 namespace cuspatial {
diff --git a/cpp/include/cuspatial/detail/pairwise_multipoint_equals_count.cuh b/cpp/include/cuspatial/detail/pairwise_multipoint_equals_count.cuh
index 614a3f2d4..141a85d61 100644
--- a/cpp/include/cuspatial/detail/pairwise_multipoint_equals_count.cuh
+++ b/cpp/include/cuspatial/detail/pairwise_multipoint_equals_count.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.
@@ -25,8 +25,6 @@
 #include <cuspatial/range/range.cuh>
 #include <cuspatial/traits.hpp>
 
-#include <ranger/ranger.hpp>
-
 #include <rmm/cuda_stream_view.hpp>
 #include <rmm/device_uvector.hpp>
 #include <rmm/exec_policy.hpp>
@@ -35,6 +33,8 @@
 #include <thrust/sort.h>
 #include <thrust/transform.h>
 
+#include <ranger/ranger.hpp>
+
 #include <iterator>
 #include <type_traits>
 
diff --git a/cpp/include/cuspatial/detail/point_in_polygon.cuh b/cpp/include/cuspatial/detail/point_in_polygon.cuh
index bd7c0b805..119d48ecb 100644
--- a/cpp/include/cuspatial/detail/point_in_polygon.cuh
+++ b/cpp/include/cuspatial/detail/point_in_polygon.cuh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -24,7 +24,6 @@
 #include <cuspatial/traits.hpp>
 
 #include <rmm/cuda_stream_view.hpp>
-
 #include <rmm/exec_policy.hpp>
 
 #include <thrust/logical.h>
diff --git a/cpp/include/cuspatial/detail/point_linestring_nearest_points.cuh b/cpp/include/cuspatial/detail/point_linestring_nearest_points.cuh
index c1c7bfc77..f085204eb 100644
--- a/cpp/include/cuspatial/detail/point_linestring_nearest_points.cuh
+++ b/cpp/include/cuspatial/detail/point_linestring_nearest_points.cuh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -25,10 +25,10 @@
 #include <rmm/cuda_stream_view.hpp>
 #include <rmm/exec_policy.hpp>
 
-#include <ranger/ranger.hpp>
-
 #include <thrust/binary_search.h>
 
+#include <ranger/ranger.hpp>
+
 #include <iterator>
 #include <limits>
 #include <memory>
diff --git a/cpp/include/cuspatial/detail/point_quadtree.cuh b/cpp/include/cuspatial/detail/point_quadtree.cuh
index ebe9b02e6..7e0d70dac 100644
--- a/cpp/include/cuspatial/detail/point_quadtree.cuh
+++ b/cpp/include/cuspatial/detail/point_quadtree.cuh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -25,13 +25,12 @@
 #include <rmm/device_uvector.hpp>
 #include <rmm/mr/device/per_device_resource.hpp>
 
+#include <cuda/functional>
 #include <thrust/distance.h>
 #include <thrust/iterator/constant_iterator.h>
 #include <thrust/iterator/zip_iterator.h>
 #include <thrust/tuple.h>
 
-#include <cuda/functional>
-
 #include <tuple>
 
 namespace cuspatial {
diff --git a/cpp/include/cuspatial/detail/range/multipoint_range.cuh b/cpp/include/cuspatial/detail/range/multipoint_range.cuh
index e69351608..e73e0e0d3 100644
--- a/cpp/include/cuspatial/detail/range/multipoint_range.cuh
+++ b/cpp/include/cuspatial/detail/range/multipoint_range.cuh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -16,17 +16,17 @@
 
 #pragma once
 
-#include <thrust/binary_search.h>
-#include <thrust/distance.h>
-#include <thrust/iterator/transform_iterator.h>
-#include <thrust/pair.h>
-
 #include <cuspatial/cuda_utils.hpp>
 #include <cuspatial/geometry/vec_2d.hpp>
 #include <cuspatial/geometry_collection/multipoint_ref.cuh>
 #include <cuspatial/iterator_factory.cuh>
 #include <cuspatial/traits.hpp>
 
+#include <thrust/binary_search.h>
+#include <thrust/distance.h>
+#include <thrust/iterator/transform_iterator.h>
+#include <thrust/pair.h>
+
 namespace cuspatial {
 
 using namespace cuspatial::detail;
diff --git a/cpp/include/cuspatial/detail/trajectory/derive_trajectories.cuh b/cpp/include/cuspatial/detail/trajectory/derive_trajectories.cuh
index 6a1a1c0a7..6da914181 100644
--- a/cpp/include/cuspatial/detail/trajectory/derive_trajectories.cuh
+++ b/cpp/include/cuspatial/detail/trajectory/derive_trajectories.cuh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -23,6 +23,7 @@
 #include <rmm/device_vector.hpp>
 #include <rmm/exec_policy.hpp>
 
+#include <cub/device/device_merge_sort.cuh>
 #include <thrust/gather.h>
 #include <thrust/iterator/constant_iterator.h>
 #include <thrust/iterator/discard_iterator.h>
@@ -30,8 +31,6 @@
 #include <thrust/reduce.h>
 #include <thrust/sort.h>
 
-#include <cub/device/device_merge_sort.cuh>
-
 #include <cstdint>
 
 namespace cuspatial {
diff --git a/cpp/include/cuspatial/detail/trajectory/trajectory_distances_and_speeds.cuh b/cpp/include/cuspatial/detail/trajectory/trajectory_distances_and_speeds.cuh
index baede9b92..9ce7baef5 100644
--- a/cpp/include/cuspatial/detail/trajectory/trajectory_distances_and_speeds.cuh
+++ b/cpp/include/cuspatial/detail/trajectory/trajectory_distances_and_speeds.cuh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -23,6 +23,7 @@
 #include <rmm/device_uvector.hpp>
 #include <rmm/exec_policy.hpp>
 
+#include <cuda/std/chrono>
 #include <thrust/adjacent_difference.h>
 #include <thrust/iterator/constant_iterator.h>
 #include <thrust/iterator/discard_iterator.h>
@@ -31,8 +32,6 @@
 #include <thrust/reduce.h>
 #include <thrust/transform.h>
 
-#include <cuda/std/chrono>
-
 namespace cuspatial {
 
 template <typename IdInputIt,
diff --git a/cpp/include/cuspatial/detail/utility/device_atomics.cuh b/cpp/include/cuspatial/detail/utility/device_atomics.cuh
index 58863bcd0..d91fa9c29 100644
--- a/cpp/include/cuspatial/detail/utility/device_atomics.cuh
+++ b/cpp/include/cuspatial/detail/utility/device_atomics.cuh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -16,12 +16,11 @@
 
 #pragma once
 
+#include <cuda/atomic>
 #include <thrust/detail/raw_reference_cast.h>
 #include <thrust/device_ptr.h>
 #include <thrust/device_reference.h>
 
-#include <cuda/atomic>
-
 #include <type_traits>
 
 namespace cuspatial {
diff --git a/cpp/include/cuspatial/pairwise_multipoint_equals_count.hpp b/cpp/include/cuspatial/pairwise_multipoint_equals_count.hpp
index 8dca3185e..9bfb13700 100644
--- a/cpp/include/cuspatial/pairwise_multipoint_equals_count.hpp
+++ b/cpp/include/cuspatial/pairwise_multipoint_equals_count.hpp
@@ -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.
@@ -16,10 +16,10 @@
 
 #pragma once
 
-#include <cudf/types.hpp>
-
 #include <cuspatial/column/geometry_column_view.hpp>
 
+#include <cudf/types.hpp>
+
 #include <rmm/mr/device/per_device_resource.hpp>
 
 #include <memory>
diff --git a/cpp/src/bounding_boxes/polygon_bounding_boxes.cu b/cpp/src/bounding_boxes/polygon_bounding_boxes.cu
index 9fdca1bd5..e38e12dfd 100644
--- a/cpp/src/bounding_boxes/polygon_bounding_boxes.cu
+++ b/cpp/src/bounding_boxes/polygon_bounding_boxes.cu
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2020-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.
@@ -14,9 +14,8 @@
  * limitations under the License.
  */
 
-#include <cuspatial/error.hpp>
-
 #include <cuspatial/bounding_boxes.cuh>
+#include <cuspatial/error.hpp>
 #include <cuspatial/iterator_factory.cuh>
 
 #include <cudf/column/column_factories.hpp>
diff --git a/cpp/src/distance/linestring_polygon_distance.cu b/cpp/src/distance/linestring_polygon_distance.cu
index 347f998fa..b6d370b90 100644
--- a/cpp/src/distance/linestring_polygon_distance.cu
+++ b/cpp/src/distance/linestring_polygon_distance.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.
@@ -16,6 +16,14 @@
 
 #include "../utility/multi_geometry_dispatch.hpp"
 
+#include <cuspatial/column/geometry_column_view.hpp>
+#include <cuspatial/distance.cuh>
+#include <cuspatial/error.hpp>
+#include <cuspatial/iterator_factory.cuh>
+#include <cuspatial/range/multilinestring_range.cuh>
+#include <cuspatial/range/multipolygon_range.cuh>
+#include <cuspatial/types.hpp>
+
 #include <cudf/column/column.hpp>
 #include <cudf/column/column_device_view.cuh>
 #include <cudf/column/column_factories.hpp>
@@ -27,14 +35,6 @@
 
 #include <rmm/cuda_stream_view.hpp>
 
-#include <cuspatial/column/geometry_column_view.hpp>
-#include <cuspatial/distance.cuh>
-#include <cuspatial/error.hpp>
-#include <cuspatial/iterator_factory.cuh>
-#include <cuspatial/range/multilinestring_range.cuh>
-#include <cuspatial/range/multipolygon_range.cuh>
-#include <cuspatial/types.hpp>
-
 #include <thrust/iterator/counting_iterator.h>
 
 #include <memory>
diff --git a/cpp/src/distance/point_polygon_distance.cu b/cpp/src/distance/point_polygon_distance.cu
index ecd5e06aa..dd7364fbd 100644
--- a/cpp/src/distance/point_polygon_distance.cu
+++ b/cpp/src/distance/point_polygon_distance.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.
@@ -16,6 +16,14 @@
 
 #include "../utility/multi_geometry_dispatch.hpp"
 
+#include <cuspatial/column/geometry_column_view.hpp>
+#include <cuspatial/distance.cuh>
+#include <cuspatial/error.hpp>
+#include <cuspatial/iterator_factory.cuh>
+#include <cuspatial/range/multipoint_range.cuh>
+#include <cuspatial/range/multipolygon_range.cuh>
+#include <cuspatial/types.hpp>
+
 #include <cudf/column/column.hpp>
 #include <cudf/column/column_device_view.cuh>
 #include <cudf/column/column_factories.hpp>
@@ -27,14 +35,6 @@
 
 #include <rmm/cuda_stream_view.hpp>
 
-#include <cuspatial/column/geometry_column_view.hpp>
-#include <cuspatial/distance.cuh>
-#include <cuspatial/error.hpp>
-#include <cuspatial/iterator_factory.cuh>
-#include <cuspatial/range/multipoint_range.cuh>
-#include <cuspatial/range/multipolygon_range.cuh>
-#include <cuspatial/types.hpp>
-
 #include <thrust/iterator/counting_iterator.h>
 
 #include <memory>
diff --git a/cpp/src/distance/polygon_distance.cu b/cpp/src/distance/polygon_distance.cu
index d31db9bb9..678aa3f56 100644
--- a/cpp/src/distance/polygon_distance.cu
+++ b/cpp/src/distance/polygon_distance.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.
@@ -16,6 +16,13 @@
 
 #include "../utility/multi_geometry_dispatch.hpp"
 
+#include <cuspatial/column/geometry_column_view.hpp>
+#include <cuspatial/distance.cuh>
+#include <cuspatial/error.hpp>
+#include <cuspatial/iterator_factory.cuh>
+#include <cuspatial/range/multipolygon_range.cuh>
+#include <cuspatial/types.hpp>
+
 #include <cudf/column/column.hpp>
 #include <cudf/column/column_factories.hpp>
 #include <cudf/column/column_view.hpp>
@@ -26,13 +33,6 @@
 
 #include <rmm/cuda_stream_view.hpp>
 
-#include <cuspatial/column/geometry_column_view.hpp>
-#include <cuspatial/distance.cuh>
-#include <cuspatial/error.hpp>
-#include <cuspatial/iterator_factory.cuh>
-#include <cuspatial/range/multipolygon_range.cuh>
-#include <cuspatial/types.hpp>
-
 #include <thrust/iterator/counting_iterator.h>
 
 #include <memory>
diff --git a/cpp/src/join/quadtree_bbox_filtering.cu b/cpp/src/join/quadtree_bbox_filtering.cu
index 42b07c015..59bd369cd 100644
--- a/cpp/src/join/quadtree_bbox_filtering.cu
+++ b/cpp/src/join/quadtree_bbox_filtering.cu
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2022, NVIDIA CORPORATION.
+ * Copyright (c) 2020-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.
@@ -14,11 +14,9 @@
  * limitations under the License.
  */
 
-#include <cuspatial/iterator_factory.cuh>
-#include <cuspatial/spatial_join.cuh>
-
 #include <cuspatial/error.hpp>
 #include <cuspatial/iterator_factory.cuh>
+#include <cuspatial/spatial_join.cuh>
 #include <cuspatial/spatial_join.hpp>
 
 #include <cudf/column/column.hpp>
diff --git a/cpp/src/join/quadtree_point_in_polygon.cu b/cpp/src/join/quadtree_point_in_polygon.cu
index 2d94504af..75b723aa8 100644
--- a/cpp/src/join/quadtree_point_in_polygon.cu
+++ b/cpp/src/join/quadtree_point_in_polygon.cu
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2020-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.
@@ -14,14 +14,13 @@
  * limitations under the License.
  */
 
+#include <cuspatial/detail/utility/validation.hpp>
+#include <cuspatial/error.hpp>
 #include <cuspatial/iterator_factory.cuh>
 #include <cuspatial/range/multipoint_range.cuh>
 #include <cuspatial/range/multipolygon_range.cuh>
 #include <cuspatial/spatial_join.cuh>
 
-#include <cuspatial/detail/utility/validation.hpp>
-#include <cuspatial/error.hpp>
-
 #include <cudf/column/column_factories.hpp>
 #include <cudf/column/column_view.hpp>
 #include <cudf/table/table.hpp>
diff --git a/dependencies.yaml b/dependencies.yaml
index bf12858b3..fabb4149e 100644
--- a/dependencies.yaml
+++ b/dependencies.yaml
@@ -3,7 +3,7 @@ files:
   all:
     output: conda
     matrix:
-      cuda: ["11.8", "12.0"]
+      cuda: ["11.8", "12.2"]
       arch: [x86_64]
     includes:
       - build_cpp
@@ -124,8 +124,8 @@ dependencies:
           - cxx-compiler
           - gmock>=1.13.0
           - gtest>=1.13.0
-          - libcudf==24.2.*
-          - librmm==24.2.*
+          - libcudf==24.4.*
+          - librmm==24.4.*
           - proj
           - sqlite
     specific:
@@ -154,7 +154,7 @@ dependencies:
             packages:
               - nvcc_linux-aarch64=11.8
           - matrix:
-              cuda: "12.0"
+              cuda: "12.*"
             packages:
               - cuda-nvcc
   build_cpp_cuproj:
@@ -169,7 +169,7 @@ dependencies:
           - cxx-compiler
           - gmock>=1.13.0
           - gtest>=1.13.0
-          - librmm==24.2.*
+          - librmm==24.4.*
           - proj
           - sqlite
     specific:
@@ -198,7 +198,7 @@ dependencies:
             packages:
               - nvcc_linux-aarch64=11.8
           - matrix:
-              cuda: "12.0"
+              cuda: "12.*"
             packages:
               - cuda-nvcc
   build_python:
@@ -255,6 +255,10 @@ dependencies:
               cuda: "12.0"
             packages:
               - cuda-version=12.0
+          - matrix:
+              cuda: "12.2"
+            packages:
+              - cuda-version=12.2
   cuda:
     specific:
       - output_types: conda
@@ -320,13 +324,18 @@ dependencies:
             packages:
               - python=3.10
           - matrix:
+              py: "3.11"
             packages:
-              - python>=3.9,<3.11
+              - python=3.11
+          - matrix:
+            packages:
+              - python>=3.9,<3.12
   run_python_cuspatial:
     common:
       - output_types: [conda, requirements, pyproject]
         packages:
           - geopandas>=0.11.0
+          - &numpy numpy>=1.23,<2.0a0
   test_python_cuspatial:
     common:
       - output_types: [conda, requirements, pyproject]
@@ -338,6 +347,7 @@ dependencies:
     common:
       - output_types: [conda, requirements, pyproject]
         packages:
+          - *numpy
           - pytest
           - pytest-cov
           - pytest-xdist
@@ -350,7 +360,7 @@ dependencies:
     common:
       - output_types: conda
         packages:
-          - &rmm_conda rmm==24.2.*
+          - &rmm_conda rmm==24.4.*
       - output_types: requirements
         packages:
           # pip recognizes the index as a global option for the requirements.txt file
@@ -359,24 +369,19 @@ dependencies:
     specific:
       - output_types: [requirements, pyproject]
         matrices:
-          - matrix: {cuda: "12.2"}
-            packages: &rmm_packages_pip_cu12
-              - rmm-cu12==24.2.*
-          - {matrix: {cuda: "12.1"}, packages: *rmm_packages_pip_cu12}
-          - {matrix: {cuda: "12.0"}, packages: *rmm_packages_pip_cu12}
-          - matrix: {cuda: "11.8"}
-            packages: &rmm_packages_pip_cu11
-              - rmm-cu11==24.2.*
-          - {matrix: {cuda: "11.5"}, packages: *rmm_packages_pip_cu11}
-          - {matrix: {cuda: "11.4"}, packages: *rmm_packages_pip_cu11}
-          - {matrix: {cuda: "11.2"}, packages: *rmm_packages_pip_cu11}
+          - matrix: {cuda: "12.*"}
+            packages:
+              - rmm-cu12==24.4.*
+          - matrix: {cuda: "11.*"}
+            packages:
+              - rmm-cu11==24.4.*
           - {matrix: null, packages: [*rmm_conda]}
 
   depends_on_cudf:
     common:
       - output_types: conda
         packages:
-          - &cudf_conda cudf==24.2.*
+          - &cudf_conda cudf==24.4.*
       - output_types: requirements
         packages:
           # pip recognizes the index as a global option for the requirements.txt file
@@ -385,24 +390,19 @@ dependencies:
     specific:
       - output_types: [requirements, pyproject]
         matrices:
-          - matrix: {cuda: "12.2"}
-            packages: &cudf_packages_pip_cu12
-              - cudf-cu12==24.2.*
-          - {matrix: {cuda: "12.1"}, packages: *cudf_packages_pip_cu12}
-          - {matrix: {cuda: "12.0"}, packages: *cudf_packages_pip_cu12}
-          - matrix: {cuda: "11.8"}
-            packages: &cudf_packages_pip_cu11
-              - cudf-cu11==24.2.*
-          - {matrix: {cuda: "11.5"}, packages: *cudf_packages_pip_cu11}
-          - {matrix: {cuda: "11.4"}, packages: *cudf_packages_pip_cu11}
-          - {matrix: {cuda: "11.2"}, packages: *cudf_packages_pip_cu11}
+          - matrix: {cuda: "12.*"}
+            packages:
+              - cudf-cu12==24.4.*
+          - matrix: {cuda: "11.*"}
+            packages:
+              - cudf-cu11==24.4.*
           - {matrix: null, packages: [*cudf_conda]}
 
   depends_on_cuml:
     common:
       - output_types: conda
         packages:
-          - &cuml_conda cuml==24.2.*
+          - &cuml_conda cuml==24.4.*
       - output_types: requirements
         packages:
           # pip recognizes the index as a global option for the requirements.txt file
@@ -411,24 +411,19 @@ dependencies:
     specific:
       - output_types: [requirements, pyproject]
         matrices:
-          - matrix: {cuda: "12.2"}
-            packages: &cuml_packages_pip_cu12
-              - cuml-cu12==24.2.*
-          - {matrix: {cuda: "12.1"}, packages: *cuml_packages_pip_cu12}
-          - {matrix: {cuda: "12.0"}, packages: *cuml_packages_pip_cu12}
-          - matrix: {cuda: "11.8"}
-            packages: &cuml_packages_pip_cu11
-              - cuml-cu11==24.2.*
-          - {matrix: {cuda: "11.5"}, packages: *cuml_packages_pip_cu11}
-          - {matrix: {cuda: "11.4"}, packages: *cuml_packages_pip_cu11}
-          - {matrix: {cuda: "11.2"}, packages: *cuml_packages_pip_cu11}
+          - matrix: {cuda: "12.*"}
+            packages:
+              - cuml-cu12==24.4.*
+          - matrix: {cuda: "11.*"}
+            packages:
+              - cuml-cu11==24.4.*
           - {matrix: null, packages: [*cuml_conda]}
 
   depends_on_cuspatial:
     common:
       - output_types: conda
         packages:
-          - &cuspatial_conda cuspatial==24.2.*
+          - &cuspatial_conda cuspatial==24.4.*
       - output_types: requirements
         packages:
           # pip recognizes the index as a global option for the requirements.txt file
@@ -437,17 +432,12 @@ dependencies:
     specific:
       - output_types: [requirements, pyproject]
         matrices:
-          - matrix: {cuda: "12.2"}
-            packages: &cuspatial_packages_pip_cu12
-              - cuspatial-cu12==24.2.*
-          - {matrix: {cuda: "12.1"}, packages: *cuspatial_packages_pip_cu12}
-          - {matrix: {cuda: "12.0"}, packages: *cuspatial_packages_pip_cu12}
-          - matrix: {cuda: "11.8"}
-            packages: &cuspatial_packages_pip_cu11
-              - cuspatial-cu11==24.2.*
-          - {matrix: {cuda: "11.5"}, packages: *cuspatial_packages_pip_cu11}
-          - {matrix: {cuda: "11.4"}, packages: *cuspatial_packages_pip_cu11}
-          - {matrix: {cuda: "11.2"}, packages: *cuspatial_packages_pip_cu11}
+          - matrix: {cuda: "12.*"}
+            packages:
+              - cuspatial-cu12==24.4.*
+          - matrix: {cuda: "11.*"}
+            packages:
+              - cuspatial-cu11==24.4.*
           - {matrix: null, packages: [*cuspatial_conda]}
 
   depends_on_cupy:
@@ -458,33 +448,10 @@ dependencies:
     specific:
       - output_types: [requirements, pyproject]
         matrices:
-          # All CUDA 12 + x86_64 versions
-          - matrix: {cuda: "12.2", arch: x86_64}
-            packages: &cupy_packages_cu12_x86_64
+          - matrix: {cuda: "12.*"}
+            packages:
               - cupy-cuda12x>=12.0.0
-          - {matrix: {cuda: "12.1", arch: x86_64}, packages: *cupy_packages_cu12_x86_64}
-          - {matrix: {cuda: "12.0", arch: x86_64}, packages: *cupy_packages_cu12_x86_64}
-
-          # All CUDA 12 + aarch64 versions
-          - matrix: {cuda: "12.2", arch: aarch64}
-            packages: &cupy_packages_cu12_aarch64
-              - cupy-cuda12x -f https://pip.cupy.dev/aarch64 # TODO: Verify that this works.
-          - {matrix: {cuda: "12.1", arch: aarch64}, packages: *cupy_packages_cu12_aarch64}
-          - {matrix: {cuda: "12.0", arch: aarch64}, packages: *cupy_packages_cu12_aarch64}
-
-          # All CUDA 11 + x86_64 versions
-          - matrix: {cuda: "11.8", arch: x86_64}
-            packages: &cupy_packages_cu11_x86_64
+          - matrix: {cuda: "11.*"}
+            packages:
               - cupy-cuda11x>=12.0.0
-          - {matrix: {cuda: "11.5", arch: x86_64}, packages: *cupy_packages_cu11_x86_64}
-          - {matrix: {cuda: "11.4", arch: x86_64}, packages: *cupy_packages_cu11_x86_64}
-          - {matrix: {cuda: "11.2", arch: x86_64}, packages: *cupy_packages_cu11_x86_64}
-
-          # All CUDA 11 + aarch64 versions
-          - matrix: {cuda: "11.8", arch: aarch64}
-            packages: &cupy_packages_cu11_aarch64
-              - cupy-cuda11x -f https://pip.cupy.dev/aarch64 # TODO: Verify that this works.
-          - {matrix: {cuda: "11.5", arch: aarch64}, packages: *cupy_packages_cu11_aarch64}
-          - {matrix: {cuda: "11.4", arch: aarch64}, packages: *cupy_packages_cu11_aarch64}
-          - {matrix: {cuda: "11.2", arch: aarch64}, packages: *cupy_packages_cu11_aarch64}
           - {matrix: null, packages: [cupy-cuda11x>=12.0.0]}
diff --git a/docs/cuproj/source/conf.py b/docs/cuproj/source/conf.py
index e6c3cb45f..f11b5bd82 100644
--- a/docs/cuproj/source/conf.py
+++ b/docs/cuproj/source/conf.py
@@ -1,10 +1,14 @@
-# Copyright (c) 2023, NVIDIA CORPORATION.
+# Copyright (c) 2023-2024, NVIDIA CORPORATION.
 # -- General configuration ------------------------------------------------
 
 # If your documentation needs a minimal Sphinx version, state it here.
 #
 # needs_sphinx = '1.0'
 
+from packaging.version import Version
+
+import cuproj
+
 # Add any Sphinx extension module names here, as strings. They can be
 # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
 # ones.
@@ -49,10 +53,11 @@
 # |version| and |release|, also used in various other places throughout the
 # built documents.
 #
+CUPROJ_VERSION = Version(cuproj.__version__)
 # The short X.Y version.
-version = '24.02'
+version = f"{CUPROJ_VERSION.major:02}.{CUPROJ_VERSION.minor:02}"
 # The full version, including alpha/beta/rc tags.
-release = '24.02.00'
+release = f"{CUPROJ_VERSION.major:02}.{CUPROJ_VERSION.minor:02}.{CUPROJ_VERSION.micro:02}"
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff --git a/docs/cuproj/source/user_guide/cuproj_api_examples.ipynb b/docs/cuproj/source/user_guide/cuproj_api_examples.ipynb
index 9311b11ad..a319082b4 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.02 --solver=libmamba -c rapidsai -c conda-forge -c nvidia \\ \n",
+    "# !conda create -n rapids-24.04 --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/conf.py b/docs/source/conf.py
index 71d359a6b..569ce8806 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -1,10 +1,14 @@
-# Copyright (c) 2018-2023, NVIDIA CORPORATION.
+# Copyright (c) 2018-2024, NVIDIA CORPORATION.
 # -- General configuration ------------------------------------------------
 
 # If your documentation needs a minimal Sphinx version, state it here.
 #
 # needs_sphinx = '1.0'
 
+from packaging.version import Version
+
+import cuspatial
+
 # Add any Sphinx extension module names here, as strings. They can be
 # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
 # ones.
@@ -49,10 +53,11 @@
 # |version| and |release|, also used in various other places throughout the
 # built documents.
 #
+CUSPATIAL_VERSION = Version(cuspatial.__version__)
 # The short X.Y version.
-version = '24.02'
+version = f"{CUSPATIAL_VERSION.major:02}.{CUSPATIAL_VERSION.minor:02}"
 # The full version, including alpha/beta/rc tags.
-release = '24.02.00'
+release = f"{CUSPATIAL_VERSION.major:02}.{CUSPATIAL_VERSION.minor:02}.{CUSPATIAL_VERSION.micro:02}"
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff --git a/docs/source/developer_guide/build.md b/docs/source/developer_guide/build.md
index c7d56d41d..d20e27b3d 100644
--- a/docs/source/developer_guide/build.md
+++ b/docs/source/developer_guide/build.md
@@ -25,7 +25,7 @@ conda env create -n cuspatial --file conda/environments/all_cuda-118_arch-x86_64
 
 ### From the cuSpatial Dev Container:
 
-Execute `build-cuspatial-cpp to build `libcuspatial`. The following options may be added.
+Execute `build-cuspatial-cpp` to build `libcuspatial`. The following options may be added.
  - `-DBUILD_TESTS=ON`: build `libcuspatial` unit tests.
  - `-DBUILD_BENCHMARKS=ON`: build `libcuspatial` benchmarks.
  - `-DCMAKE_BUILD_TYPE=Debug`: Create a Debug build of `libcuspatial` (default is Release).
diff --git a/docs/source/user_guide/cuspatial_api_examples.ipynb b/docs/source/user_guide/cuspatial_api_examples.ipynb
index 836df1456..4ec66b4b8 100644
--- a/docs/source/user_guide/cuspatial_api_examples.ipynb
+++ b/docs/source/user_guide/cuspatial_api_examples.ipynb
@@ -57,8 +57,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "# !conda create -n rapids-24.02 -c rapidsai -c conda-forge -c nvidia \\ \n",
-    "#     cuspatial=24.02 python=3.9 cudatoolkit=11.5 "
+    "# !conda create -n rapids-24.04 -c rapidsai -c conda-forge -c nvidia \\ \n",
+    "#     cuspatial=24.04 python=3.9 cudatoolkit=11.5 "
    ]
   },
   {
diff --git a/fetch_rapids.cmake b/fetch_rapids.cmake
deleted file mode 100644
index 9c1a36541..000000000
--- a/fetch_rapids.cmake
+++ /dev/null
@@ -1,19 +0,0 @@
-# =============================================================================
-# Copyright (c) 2018-2022, NVIDIA CORPORATION.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
-# in compliance with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software distributed under the License
-# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
-# or implied. See the License for the specific language governing permissions and limitations under
-# the License.
-# =============================================================================
-if(NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/CUSPATIAL_RAPIDS.cmake)
-  file(DOWNLOAD https://raw.githubusercontent.com/rapidsai/rapids-cmake/branch-24.02/RAPIDS.cmake
-       ${CMAKE_BINARY_DIR}/CUSPATIAL_RAPIDS.cmake
-  )
-endif()
-include(${CMAKE_BINARY_DIR}/CUSPATIAL_RAPIDS.cmake)
diff --git a/java/src/main/native/CMakeLists.txt b/java/src/main/native/CMakeLists.txt
index 071f0ca37..b02e201d5 100755
--- a/java/src/main/native/CMakeLists.txt
+++ b/java/src/main/native/CMakeLists.txt
@@ -1,5 +1,5 @@
 #=============================================================================
-# Copyright (c) 2019-2020, NVIDIA CORPORATION.
+# Copyright (c) 2019-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,7 +15,7 @@
 #=============================================================================
 cmake_minimum_required(VERSION 3.26.4 FATAL_ERROR)
 
-include(../../../../fetch_rapids.cmake)
+include(../../../../rapids_config.cmake)
 
 # TODO: The logic for setting the architectures was previously not here. Was
 # that just an oversight, or is there a reason not to include this here?
diff --git a/python/cuproj/CMakeLists.txt b/python/cuproj/CMakeLists.txt
index ba105e594..2f7b743b0 100644
--- a/python/cuproj/CMakeLists.txt
+++ b/python/cuproj/CMakeLists.txt
@@ -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. You may obtain a copy of the License at
@@ -14,15 +14,13 @@
 
 cmake_minimum_required(VERSION 3.26.4 FATAL_ERROR)
 
-set(cuproj_version 24.02.00)
-
-include(../../fetch_rapids.cmake)
+include(../../rapids_config.cmake)
 include(rapids-cuda)
 rapids_cuda_init_architectures(cuproj-python)
 
 project(
   cuproj-python
-  VERSION ${cuproj_version}
+  VERSION "${RAPIDS_VERSION}"
   LANGUAGES CXX CUDA)
 
 option(FIND_CUPROJ_CPP "Search for existing cuproj C++ installations before defaulting to local files"
@@ -30,7 +28,7 @@ option(FIND_CUPROJ_CPP "Search for existing cuproj C++ installations before defa
 
 # If the user requested it we attempt to find cuproj.
 if(FIND_CUPROJ_CPP)
-  find_package(cuproj ${cuproj_version})
+  find_package(cuproj "${RAPIDS_VERSION}")
 else()
   set(cuproj_FOUND OFF)
 endif()
diff --git a/python/cuproj/cuproj/cuprojshim/CMakeLists.txt b/python/cuproj/cuproj/cuprojshim/CMakeLists.txt
index 315945c1d..00769965f 100644
--- a/python/cuproj/cuproj/cuprojshim/CMakeLists.txt
+++ b/python/cuproj/cuproj/cuprojshim/CMakeLists.txt
@@ -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. You may obtain a copy of the License at
@@ -14,9 +14,7 @@
 
 cmake_minimum_required(VERSION 3.26.4 FATAL_ERROR)
 
-set(cuproj_version 24.02.00)
-
-include(../../../../fetch_rapids.cmake)
+include(../../../../rapids_config.cmake)
 include(rapids-cmake)
 include(rapids-cpm)
 include(rapids-cuda)
@@ -26,7 +24,7 @@ rapids_cuda_init_architectures(CUPROJSHIM)
 
 project(
   CUPROJSHIM
-  VERSION ${cuproj_version}
+  VERSION "${RAPIDS_VERSION}"
   LANGUAGES CXX CUDA)
 
 
diff --git a/python/cuproj/pyproject.toml b/python/cuproj/pyproject.toml
index aef974ee4..698482319 100644
--- a/python/cuproj/pyproject.toml
+++ b/python/cuproj/pyproject.toml
@@ -1,4 +1,4 @@
-# Copyright (c) 2022-2023, NVIDIA CORPORATION.
+# Copyright (c) 2022-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.
@@ -18,7 +18,7 @@ requires = [
     "cmake>=3.26.4",
     "cython>=3.0.0",
     "ninja",
-    "rmm==24.2.*",
+    "rmm==24.4.*",
     "scikit-build-core[pyproject]>=0.7.0",
     "setuptools",
     "wheel",
@@ -34,7 +34,7 @@ license = { text = "Apache 2.0" }
 requires-python = ">=3.9"
 dependencies = [
     "cupy-cuda11x>=12.0.0",
-    "rmm==24.2.*",
+    "rmm==24.4.*",
 ] # 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",
@@ -44,12 +44,14 @@ classifiers = [
     "Programming Language :: Python",
     "Programming Language :: Python :: 3.9",
     "Programming Language :: Python :: 3.10",
+    "Programming Language :: Python :: 3.11",
 ]
 
 [project.optional-dependencies]
 test = [
-    "cuspatial==24.2.*",
+    "cuspatial==24.4.*",
     "geopandas>=0.11.0",
+    "numpy>=1.23,<2.0a0",
     "pyproj>=3.6.0,<3.7a0",
     "pytest",
     "pytest-cov",
diff --git a/python/cuspatial/CMakeLists.txt b/python/cuspatial/CMakeLists.txt
index a23af3125..e3678c311 100644
--- a/python/cuspatial/CMakeLists.txt
+++ b/python/cuspatial/CMakeLists.txt
@@ -1,5 +1,5 @@
 # =============================================================================
-# Copyright (c) 2022-2023, NVIDIA CORPORATION.
+# Copyright (c) 2022-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. You may obtain a copy of the License at
@@ -14,15 +14,13 @@
 
 cmake_minimum_required(VERSION 3.26.4 FATAL_ERROR)
 
-set(cuspatial_version 24.02.00)
-
-include(../../fetch_rapids.cmake)
+include(../../rapids_config.cmake)
 include(rapids-cuda)
 rapids_cuda_init_architectures(cuspatial-python)
 
 project(
   cuspatial-python
-  VERSION ${cuspatial_version}
+  VERSION "${RAPIDS_VERSION}"
   LANGUAGES CXX CUDA)
 
 option(FIND_CUSPATIAL_CPP "Search for existing cuspatial C++ installations before defaulting to local files"
@@ -30,7 +28,7 @@ option(FIND_CUSPATIAL_CPP "Search for existing cuspatial C++ installations befor
 
 # If the user requested it we attempt to find cuspatial.
 if(FIND_CUSPATIAL_CPP)
-  find_package(cuspatial ${cuspatial_version})
+  find_package(cuspatial "${RAPIDS_VERSION}")
 else()
   set(cuspatial_FOUND OFF)
 endif()
diff --git a/python/cuspatial/cuspatial/core/binops/distance_dispatch.py b/python/cuspatial/cuspatial/core/binops/distance_dispatch.py
index c19953107..db2e6339b 100644
--- a/python/cuspatial/cuspatial/core/binops/distance_dispatch.py
+++ b/python/cuspatial/cuspatial/core/binops/distance_dispatch.py
@@ -1,5 +1,5 @@
 import cudf
-from cudf.core.column import as_column, full
+from cudf.core.column import as_column
 
 from cuspatial._lib.distance import (
     pairwise_linestring_distance,
@@ -185,10 +185,11 @@ def __call__(self):
 
         # Rows with misaligned indices contains nan. Here we scatter the
         # distance values to the correct indices.
-        result = full(
-            len(self._res_index),
+        result = as_column(
             float("nan"),
+            length=len(self._res_index),
             dtype="float64",
+            nan_as_null=False,
         )
         scatter_map = as_column(
             range(len(self._res_index)), dtype="int32"
diff --git a/python/cuspatial/cuspatial/core/binops/intersection.py b/python/cuspatial/cuspatial/core/binops/intersection.py
index b043121aa..06e23a4e8 100644
--- a/python/cuspatial/cuspatial/core/binops/intersection.py
+++ b/python/cuspatial/cuspatial/core/binops/intersection.py
@@ -53,7 +53,7 @@ def pairwise_linestring_intersection(
 
     if len(linestrings1) == 0 and len(linestrings2) == 0:
         return (
-            cudf.Series([0]),
+            cudf.Series([0], dtype="i4"),
             GeoSeries([]),
             cudf.DataFrame(
                 {
@@ -61,7 +61,8 @@ def pairwise_linestring_intersection(
                     "lhs_segment_id": [],
                     "rhs_linestring_id": [],
                     "rhs_segment_id": [],
-                }
+                },
+                dtype="i4",
             ),
         )
 
diff --git a/python/cuspatial/cuspatial/core/binpreds/basic_predicates.py b/python/cuspatial/cuspatial/core/binpreds/basic_predicates.py
index 85438fefa..3ea4ed7dd 100644
--- a/python/cuspatial/cuspatial/core/binpreds/basic_predicates.py
+++ b/python/cuspatial/cuspatial/core/binpreds/basic_predicates.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2023, NVIDIA CORPORATION.
+# Copyright (c) 2023-2024, NVIDIA CORPORATION.
 
 import cudf
 
@@ -67,7 +67,7 @@ def _basic_intersects_count(lhs, rhs):
     is_degenerate = _multipoints_is_degenerate(intersections)
     # If all the points in the intersection are in the rhs
     if len(is_degenerate) > 0:
-        sizes[is_degenerate] = 1
+        sizes[is_degenerate] = sizes.dtype.type(1)
     return sizes
 
 
diff --git a/python/cuspatial/cuspatial/core/binpreds/contains_geometry_processor.py b/python/cuspatial/cuspatial/core/binpreds/contains_geometry_processor.py
index 8a1996613..8ff5dd659 100644
--- a/python/cuspatial/cuspatial/core/binpreds/contains_geometry_processor.py
+++ b/python/cuspatial/cuspatial/core/binpreds/contains_geometry_processor.py
@@ -1,10 +1,8 @@
-# Copyright (c) 2023, NVIDIA CORPORATION.
+# Copyright (c) 2023-2024, NVIDIA CORPORATION.
 
 import cupy as cp
 
 import cudf
-from cudf.core.dataframe import DataFrame
-from cudf.core.series import Series
 
 from cuspatial.core._column.geocolumn import GeoColumn
 from cuspatial.core.binpreds.binpred_interface import (
@@ -117,7 +115,7 @@ def _convert_quadtree_result_from_part_to_polygon_indices(
             ["polygon_index", "point_index"]
         ]
 
-    def _reindex_allpairs(self, lhs, op_result) -> DataFrame:
+    def _reindex_allpairs(self, lhs, op_result) -> cudf.DataFrame:
         """Prepare the allpairs result of a contains_properly call as
         the first step of postprocessing. An allpairs result is reindexed
         by replacing the polygon index with the original index of the
@@ -154,7 +152,7 @@ def _reindex_allpairs(self, lhs, op_result) -> DataFrame:
         # Replace the polygon index with the original index
         allpairs_result["polygon_index"] = allpairs_result[
             "polygon_index"
-        ].replace(Series(lhs.index, index=cp.arange(len(lhs.index))))
+        ].replace(cudf.Series(lhs.index, index=cp.arange(len(lhs.index))))
 
         return allpairs_result
 
@@ -202,7 +200,7 @@ def _postprocess_multipoint_rhs(
 
         point_indices = preprocessor_result.point_indices
         allpairs_result = self._reindex_allpairs(lhs, op_result)
-        if isinstance(allpairs_result, Series):
+        if isinstance(allpairs_result, cudf.Series):
             return allpairs_result
         # Hits is the number of calculated points in each polygon
         # Expected count is the sizes of the features in the right-hand
@@ -233,6 +231,7 @@ def _postprocess_multipoint_rhs(
                 return count_result
             hits = result_df["point_index_x"]
             hits.index = count_result.iloc[result_df["rhs_index"]].index
+            count_result = count_result.astype(hits.dtype)
             count_result.iloc[result_df["rhs_index"]] = hits
             return count_result
 
diff --git a/python/cuspatial/cuspatial/core/geoseries.py b/python/cuspatial/cuspatial/core/geoseries.py
index 9fa1e316b..acf472749 100644
--- a/python/cuspatial/cuspatial/core/geoseries.py
+++ b/python/cuspatial/cuspatial/core/geoseries.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2020-2023, NVIDIA CORPORATION
+# Copyright (c) 2020-2024, NVIDIA CORPORATION
 
 from functools import cached_property
 from numbers import Integral
@@ -660,15 +660,15 @@ def _align_to_index(
                 index, how, sort, allow_non_unique
             )
         ).astype("int32")
-        aligned_union_offsets[
-            aligned_union_offsets.isna()
-        ] = Feature_Enum.NONE.value
+        aligned_union_offsets[aligned_union_offsets.isna()] = np.int32(
+            Feature_Enum.NONE.value
+        )
         aligned_input_types = self._column._meta.input_types._align_to_index(
             index, how, sort, allow_non_unique
         ).astype("int8")
-        aligned_input_types[
-            aligned_input_types.isna()
-        ] = Feature_Enum.NONE.value
+        aligned_input_types[aligned_input_types.isna()] = np.int8(
+            Feature_Enum.NONE.value
+        )
         column = GeoColumn(
             (
                 self._column.points,
@@ -698,7 +698,11 @@ def from_points_xy(cls, points_xy):
         GeoSeries:
             A GeoSeries made of the points.
         """
-        return cls(GeoColumn._from_points_xy(as_column(points_xy)))
+        coords_dtype = _check_coords_dtype(points_xy)
+
+        return cls(
+            GeoColumn._from_points_xy(as_column(points_xy, dtype=coords_dtype))
+        )
 
     @classmethod
     def from_multipoints_xy(cls, multipoints_xy, geometry_offset):
@@ -707,8 +711,9 @@ def from_multipoints_xy(cls, multipoints_xy, geometry_offset):
 
         Parameters
         ----------
-        points_xy: array-like
-            Coordinates of the points, interpreted as interleaved x-y coords.
+        multipoints_xy: array-like
+            Coordinates of the multipoints, interpreted as interleaved x-y
+            coords.
         geometry_offset: array-like
             Offsets indicating the starting index of the multipoint. Multiply
             the index by 2 results in the starting index of the coordinate.
@@ -729,9 +734,10 @@ def from_multipoints_xy(cls, multipoints_xy, geometry_offset):
         1    MULTIPOINT (2.00000 2.00000, 3.00000 3.00000)
         dtype: geometry
         """
+        coords_dtype = coords_dtype = _check_coords_dtype(multipoints_xy)
         return cls(
             GeoColumn._from_multipoints_xy(
-                as_column(multipoints_xy),
+                as_column(multipoints_xy, dtype=coords_dtype),
                 as_column(geometry_offset, dtype="int32"),
             )
         )
@@ -746,7 +752,8 @@ def from_linestrings_xy(
         Parameters
         ----------
         linestrings_xy : array-like
-            Coordinates of the points, interpreted as interleaved x-y coords.
+            Coordinates of the linestring, interpreted as interleaved x-y
+            coords.
         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
@@ -773,9 +780,10 @@ def from_linestrings_xy(
         0    LINESTRING (0 0, 1 1, 2 2, 3 3, 4 4, 5 5)
         dtype: geometry
         """
+        coords_dtype = _check_coords_dtype(linestrings_xy)
         return cls(
             GeoColumn._from_linestrings_xy(
-                as_column(linestrings_xy),
+                as_column(linestrings_xy, dtype=coords_dtype),
                 as_column(part_offset, dtype="int32"),
                 as_column(geometry_offset, dtype="int32"),
             )
@@ -822,9 +830,10 @@ def from_polygons_xy(
         0    POLYGON (0 0, 1 1, 2 2, 3 3, 4 4, 5 5)
         dtype: geometry
         """
+        coords_dtype = _check_coords_dtype(polygons_xy)
         return cls(
             GeoColumn._from_polygons_xy(
-                as_column(polygons_xy),
+                as_column(polygons_xy, dtype=coords_dtype),
                 as_column(ring_offset, dtype="int32"),
                 as_column(part_offset, dtype="int32"),
                 as_column(geometry_offset, dtype="int32"),
@@ -1001,15 +1010,14 @@ def reset_index(
                 # The columns of the `cudf.DataFrame` are the new
                 # columns of the `GeoDataFrame`.
                 columns = {
-                    col: cudf_result[col] for col in cudf_result.columns
+                    col: cudf_result[col]
+                    for col in cudf_result.columns
+                    if col is not None
                 }
                 geo_result = GeoDataFrame(columns)
                 geo_series.index = geo_result.index
                 # Add the original `GeoSeries` as a column.
-                if name:
-                    geo_result[name] = geo_series
-                else:
-                    geo_result[0] = geo_series
+                geo_result[name] = geo_series
                 return geo_result
         else:
             self.index = cudf_series.index
@@ -1483,3 +1491,10 @@ def distance(self, other, align=True):
         if other_is_scalar:
             res.index = self.index
         return res
+
+
+def _check_coords_dtype(coords):
+    if hasattr(coords, "dtype"):
+        return coords.dtype
+    else:
+        return "f8" if len(coords) == 0 else None
diff --git a/python/cuspatial/cuspatial/core/spatial/nearest_points.py b/python/cuspatial/cuspatial/core/spatial/nearest_points.py
index 7b65155a8..9098d7864 100644
--- a/python/cuspatial/cuspatial/core/spatial/nearest_points.py
+++ b/python/cuspatial/cuspatial/core/spatial/nearest_points.py
@@ -1,5 +1,6 @@
 import cupy as cp
 
+import cudf
 from cudf.core.column import as_column
 
 import cuspatial._lib.nearest_points as nearest_points
@@ -51,9 +52,9 @@ def pairwise_point_linestring_nearest_points(
 
     if len(points) == 0:
         data = {
-            "point_geometry_id": [],
-            "linestring_geometry_id": [],
-            "segment_id": [],
+            "point_geometry_id": cudf.Series([], dtype="i4"),
+            "linestring_geometry_id": cudf.Series([], dtype="i4"),
+            "segment_id": cudf.Series([], dtype="i4"),
             "geometry": GeoSeries([]),
         }
         return GeoDataFrame._from_data(data)
diff --git a/python/cuspatial/cuspatial/core/trajectory.py b/python/cuspatial/cuspatial/core/trajectory.py
index b62fead9f..be779313f 100644
--- a/python/cuspatial/cuspatial/core/trajectory.py
+++ b/python/cuspatial/cuspatial/core/trajectory.py
@@ -122,6 +122,16 @@ def trajectory_bounding_boxes(num_trajectories, object_ids, points: GeoSeries):
     1     1.0     1.0     3.0     3.0
     """
 
+    if len(points) == 0:
+        return DataFrame(
+            {
+                "x_min": Series([], dtype=points.points.x.dtype),
+                "y_min": Series([], dtype=points.points.x.dtype),
+                "x_max": Series([], dtype=points.points.x.dtype),
+                "y_max": Series([], dtype=points.points.x.dtype),
+            }
+        )
+
     if len(points) > 0 and not contains_only_points(points):
         raise ValueError("`points` must only contain point geometries.")
 
diff --git a/python/cuspatial/cuspatial/utils/binpred_utils.py b/python/cuspatial/cuspatial/utils/binpred_utils.py
index 5a1a0fb0b..c8e2804eb 100644
--- a/python/cuspatial/cuspatial/utils/binpred_utils.py
+++ b/python/cuspatial/cuspatial/utils/binpred_utils.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2023, NVIDIA CORPORATION.
+# Copyright (c) 2023-2024, NVIDIA CORPORATION.
 
 import cupy as cp
 import numpy as np
@@ -363,7 +363,7 @@ def _points_and_lines_to_multipoints(geoseries, offsets):
     points = geoseries[points_mask]
     lines = geoseries[lines_mask]
     points_offsets = _zero_series(len(geoseries))
-    points_offsets[points_mask] = 1
+    points_offsets[points_mask] = points_offsets.dtype.type(1)
     lines_series = geoseries[lines_mask]
     lines_sizes = lines_series.sizes
     xy = _zero_series(len(points.points.xy) + len(lines.lines.xy))
@@ -372,9 +372,10 @@ def _points_and_lines_to_multipoints(geoseries, offsets):
         lines_sizes.index = points_offsets[lines_mask].index
         points_offsets[lines_mask] = lines_series.sizes.values
         sizes[lines_mask] = lines.sizes.values * 2
-    sizes[points_mask] = 2
+    sizes[points_mask] = sizes.dtype.type(2)
     # TODO Inevitable host device copy
     points_xy_mask = cp.array(np.repeat(points_mask, sizes.values_host))
+    xy = xy.astype(points.points.xy.dtype)
     xy.iloc[points_xy_mask] = points.points.xy.reset_index(drop=True)
     xy.iloc[~points_xy_mask] = lines.lines.xy.reset_index(drop=True)
     collected_offsets = cudf.concat(
@@ -446,6 +447,7 @@ def _pli_features_rebuild_offsets(pli, features):
     # Recompute the offsets for the new series
     grouped_sizes = in_sizes.groupby(level=0).sum().sort_index()
     out_sizes = _zero_series(len(pli[0]) - 1)
+    out_sizes = out_sizes.astype(grouped_sizes.dtype)
     out_sizes.iloc[grouped_sizes.index] = grouped_sizes
     offsets = cudf.concat([cudf.Series([0]), out_sizes.cumsum()])
     return offsets
diff --git a/python/cuspatial/pyproject.toml b/python/cuspatial/pyproject.toml
index 08e0c7ff9..e58b6bd54 100644
--- a/python/cuspatial/pyproject.toml
+++ b/python/cuspatial/pyproject.toml
@@ -1,4 +1,4 @@
-# Copyright (c) 2022-2023, NVIDIA CORPORATION.
+# Copyright (c) 2022-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.
@@ -16,10 +16,10 @@
 build-backend = "scikit_build_core.build"
 requires = [
     "cmake>=3.26.4",
-    "cudf==24.2.*",
+    "cudf==24.4.*",
     "cython>=3.0.0",
     "ninja",
-    "rmm==24.2.*",
+    "rmm==24.4.*",
     "scikit-build-core[pyproject]>=0.7.0",
     "setuptools",
     "wheel",
@@ -36,9 +36,10 @@ authors = [
 license = { text = "Apache 2.0" }
 requires-python = ">=3.9"
 dependencies = [
-    "cudf==24.2.*",
+    "cudf==24.4.*",
     "geopandas>=0.11.0",
-    "rmm==24.2.*",
+    "numpy>=1.23,<2.0a0",
+    "rmm==24.4.*",
 ] # 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",
@@ -48,6 +49,7 @@ classifiers = [
     "Programming Language :: Python",
     "Programming Language :: Python :: 3.9",
     "Programming Language :: Python :: 3.10",
+    "Programming Language :: Python :: 3.11",
 ]
 
 [project.optional-dependencies]
@@ -118,3 +120,9 @@ wheel.packages = ["cuspatial"]
 provider = "scikit_build_core.metadata.regex"
 input = "cuspatial/VERSION"
 regex = "(?P<value>.*)"
+
+[tool.pytest.ini_options]
+xfail_strict = true
+filterwarnings = [
+    "error:::cudf"
+]
diff --git a/rapids_config.cmake b/rapids_config.cmake
new file mode 100644
index 000000000..40207b870
--- /dev/null
+++ b/rapids_config.cmake
@@ -0,0 +1,36 @@
+# =============================================================================
+# Copyright (c) 2018-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. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software distributed under the License
+# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+# or implied. See the License for the specific language governing permissions and limitations under
+# the License.
+# =============================================================================
+file(READ "${CMAKE_CURRENT_LIST_DIR}/VERSION" _rapids_version)
+if(_rapids_version MATCHES [[^([0-9][0-9])\.([0-9][0-9])\.([0-9][0-9])]])
+  set(RAPIDS_VERSION_MAJOR "${CMAKE_MATCH_1}")
+  set(RAPIDS_VERSION_MINOR "${CMAKE_MATCH_2}")
+  set(RAPIDS_VERSION_PATCH "${CMAKE_MATCH_3}")
+  set(RAPIDS_VERSION_MAJOR_MINOR "${RAPIDS_VERSION_MAJOR}.${RAPIDS_VERSION_MINOR}")
+  set(RAPIDS_VERSION "${RAPIDS_VERSION_MAJOR}.${RAPIDS_VERSION_MINOR}.${RAPIDS_VERSION_PATCH}")
+else()
+  string(REPLACE "\n" "\n  " _rapids_version_formatted "  ${_rapids_version}")
+  message(
+    FATAL_ERROR
+      "Could not determine RAPIDS version. Contents of VERSION file:\n${_rapids_version_formatted}"
+  )
+endif()
+
+if(NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/CUSPATIAL_RAPIDS-${RAPIDS_VERSION_MAJOR_MINOR}.cmake")
+  file(
+    DOWNLOAD
+    "https://raw.githubusercontent.com/rapidsai/rapids-cmake/branch-${RAPIDS_VERSION_MAJOR_MINOR}/RAPIDS.cmake"
+    "${CMAKE_CURRENT_BINARY_DIR}/CUSPATIAL_RAPIDS-${RAPIDS_VERSION_MAJOR_MINOR}.cmake"
+  )
+endif()
+include("${CMAKE_CURRENT_BINARY_DIR}/CUSPATIAL_RAPIDS-${RAPIDS_VERSION_MAJOR_MINOR}.cmake")


Test patch:
diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml
index 81ac344a6..2adba7b3b 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.02
+    uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@branch-24.04
     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.02
+    uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@branch-24.04
     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.02
+    uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-24.04
     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.02
+    uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-24.04
     with:
       build_type: nightly
       branch: ${{ inputs.branch }}
diff --git a/ci/test_cpp.sh b/ci/test_cpp.sh
index 859820420..35a981e93 100755
--- a/ci/test_cpp.sh
+++ b/ci/test_cpp.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright (c) 2022-2023, NVIDIA CORPORATION.
+# Copyright (c) 2022-2024, NVIDIA CORPORATION.
 
 set -euo pipefail
 
@@ -11,7 +11,7 @@ rapids-dependency-file-generator \
   --file_key test_cpp \
   --matrix "cuda=${RAPIDS_CUDA_VERSION%.*};arch=$(arch)" | tee env.yaml
 
-rapids-mamba-retry env create --force -f env.yaml -n test
+rapids-mamba-retry env create --yes -f env.yaml -n test
 
 # Temporarily allow unbound variables for conda activation.
 set +u
diff --git a/ci/test_notebooks.sh b/ci/test_notebooks.sh
index 457650d78..a4ae9c21c 100755
--- a/ci/test_notebooks.sh
+++ b/ci/test_notebooks.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright (c) 2020-2023, NVIDIA CORPORATION.
+# Copyright (c) 2020-2024, NVIDIA CORPORATION.
 
 set -euo pipefail
 
@@ -11,7 +11,7 @@ rapids-dependency-file-generator \
   --file_key test_notebooks \
   --matrix "cuda=${RAPIDS_CUDA_VERSION%.*};arch=$(arch);py=${RAPIDS_PY_VERSION}" | tee env.yaml
 
-rapids-mamba-retry env create --force -f env.yaml -n test
+rapids-mamba-retry env create --yes -f env.yaml -n test
 
 # Temporarily allow unbound variables for conda activation.
 set +u
diff --git a/ci/test_python.sh b/ci/test_python.sh
index 912b2c520..c6b80ed45 100755
--- a/ci/test_python.sh
+++ b/ci/test_python.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright (c) 2022-2023, NVIDIA CORPORATION.
+# Copyright (c) 2022-2024, NVIDIA CORPORATION.
 
 set -euo pipefail
 
@@ -11,7 +11,7 @@ rapids-dependency-file-generator \
   --file_key test_python \
   --matrix "cuda=${RAPIDS_CUDA_VERSION%.*};arch=$(arch);py=${RAPIDS_PY_VERSION}" | tee env.yaml
 
-rapids-mamba-retry env create --force -f env.yaml -n test
+rapids-mamba-retry env create --yes -f env.yaml -n test
 
 # Temporarily allow unbound variables for conda activation.
 set +u
@@ -50,7 +50,7 @@ pytest \
   --cache-clear \
   --junitxml="${RAPIDS_TESTS_DIR}/junit-cuspatial.xml" \
   --numprocesses=8 \
-  --dist=loadscope \
+  --dist=worksteal \
   --cov-config=../.coveragerc \
   --cov=cuspatial \
   --cov-report=xml:"${RAPIDS_COVERAGE_DIR}/cuspatial-coverage.xml" \
@@ -65,7 +65,7 @@ pytest \
   --cache-clear \
   --junitxml="${RAPIDS_TESTS_DIR}/junit-cuproj.xml" \
   --numprocesses=8 \
-  --dist=loadscope \
+  --dist=worksteal \
   --cov-config=../.coveragerc \
   --cov=cuproj \
   --cov-report=xml:"${RAPIDS_COVERAGE_DIR}/cuproj-coverage.xml" \
diff --git a/ci/test_wheel_cuproj.sh b/ci/test_wheel_cuproj.sh
index e89d1c650..e6888134d 100755
--- a/ci/test_wheel_cuproj.sh
+++ b/ci/test_wheel_cuproj.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright (c) 2023, NVIDIA CORPORATION.
+# Copyright (c) 2023-2024, NVIDIA CORPORATION.
 
 set -eou pipefail
 
@@ -22,5 +22,13 @@ python -m pip install $(echo ./dist/cuproj*.whl)[test]
 if [[ "$(arch)" == "aarch64" && ${RAPIDS_BUILD_TYPE} == "pull-request" ]]; then
     python ./ci/wheel_smoke_test_cuproj.py
 else
-    python -m pytest -n 8 ./python/cuproj/cuproj/tests
+    rapids-logger "pytest cuproj"
+    pushd python/cuproj/cuproj
+    python -m pytest \
+      --cache-clear \
+      --junitxml="${RAPIDS_TESTS_DIR}/junit-cuproj.xml" \
+      --numprocesses=8 \
+      --dist=worksteal \
+      tests
+    popd
 fi
diff --git a/ci/test_wheel_cuspatial.sh b/ci/test_wheel_cuspatial.sh
index 13f30de2c..ff4a2405f 100755
--- a/ci/test_wheel_cuspatial.sh
+++ b/ci/test_wheel_cuspatial.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright (c) 2023, NVIDIA CORPORATION.
+# Copyright (c) 2023-2024, NVIDIA CORPORATION.
 
 set -eou pipefail
 
@@ -18,5 +18,13 @@ python -m pip install $(echo ./dist/cuspatial*.whl)[test]
 if [[ "$(arch)" == "aarch64" && ${RAPIDS_BUILD_TYPE} == "pull-request" ]]; then
     python ./ci/wheel_smoke_test_cuspatial.py
 else
-    python -m pytest -n 8 ./python/cuspatial/cuspatial/tests
+    rapids-logger "pytest cuspatial"
+    pushd python/cuspatial/cuspatial
+    python -m pytest \
+      --cache-clear \
+      --junitxml="${RAPIDS_TESTS_DIR}/junit-cuspatial.xml" \
+      --numprocesses=8 \
+      --dist=worksteal \
+      tests
+    popd
 fi
diff --git a/cpp/cuproj/tests/wgs_to_utm_test.cu b/cpp/cuproj/tests/wgs_to_utm_test.cu
index a78756802..7a732c5da 100644
--- a/cpp/cuproj/tests/wgs_to_utm_test.cu
+++ b/cpp/cuproj/tests/wgs_to_utm_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.
@@ -16,13 +16,12 @@
 
 #include <cuproj_test/convert_coordinates.hpp>
 #include <cuproj_test/coordinate_generator.cuh>
+#include <cuspatial_test/vector_equality.hpp>
 
 #include <cuproj/error.hpp>
 #include <cuproj/projection_factories.cuh>
 #include <cuproj/vec_2d.hpp>
 
-#include <cuspatial_test/vector_equality.hpp>
-
 #include <rmm/cuda_stream_view.hpp>
 #include <rmm/exec_policy.hpp>
 
@@ -30,9 +29,8 @@
 #include <thrust/host_vector.h>
 #include <thrust/tabulate.h>
 
-#include <proj.h>
-
 #include <gtest/gtest.h>
+#include <proj.h>
 
 #include <cmath>
 #include <iostream>
diff --git a/cpp/include/cuspatial_test/base_fixture.hpp b/cpp/include/cuspatial_test/base_fixture.hpp
index 44a22d2bb..c9927b489 100644
--- a/cpp/include/cuspatial_test/base_fixture.hpp
+++ b/cpp/include/cuspatial_test/base_fixture.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -16,11 +16,11 @@
 
 #pragma once
 
+#include <cudf_test/cudf_gtest.hpp>
+
 #include <rmm/cuda_stream_view.hpp>
 #include <rmm/mr/device/per_device_resource.hpp>
 
-#include <cudf_test/cudf_gtest.hpp>
-
 namespace cuspatial {
 namespace test {
 
diff --git a/cpp/include/cuspatial_test/column_factories.hpp b/cpp/include/cuspatial_test/column_factories.hpp
index 30f426cdc..14ac03bf3 100644
--- a/cpp/include/cuspatial_test/column_factories.hpp
+++ b/cpp/include/cuspatial_test/column_factories.hpp
@@ -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.
@@ -21,12 +21,12 @@
 #include <cudf/column/column_factories.hpp>
 #include <cudf/filling.hpp>
 #include <cudf/scalar/scalar_factories.hpp>
-
 #include <cudf_test/column_wrapper.hpp>
 
+#include <rmm/cuda_stream_view.hpp>
+
 #include <initializer_list>
 #include <memory>
-#include <rmm/cuda_stream_view.hpp>
 
 namespace cuspatial {
 namespace test {
diff --git a/cpp/include/cuspatial_test/geometry_fixtures.hpp b/cpp/include/cuspatial_test/geometry_fixtures.hpp
index d52775785..44d8410e2 100644
--- a/cpp/include/cuspatial_test/geometry_fixtures.hpp
+++ b/cpp/include/cuspatial_test/geometry_fixtures.hpp
@@ -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.
@@ -22,11 +22,11 @@
 #include <cuspatial/column/geometry_column_view.hpp>
 #include <cuspatial/types.hpp>
 
+#include <cudf/utilities/default_stream.hpp>
+
 #include <rmm/cuda_stream_view.hpp>
 #include <rmm/mr/device/per_device_resource.hpp>
 
-#include <cudf/utilities/default_stream.hpp>
-
 namespace cuspatial {
 namespace test {
 
diff --git a/cpp/include/cuspatial_test/geometry_generator.cuh b/cpp/include/cuspatial_test/geometry_generator.cuh
index f966664fb..a3efa5812 100644
--- a/cpp/include/cuspatial_test/geometry_generator.cuh
+++ b/cpp/include/cuspatial_test/geometry_generator.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.
@@ -28,11 +28,11 @@
 #include <rmm/device_uvector.hpp>
 #include <rmm/exec_policy.hpp>
 
-#include <ranger/ranger.hpp>
-
 #include <thrust/sequence.h>
 #include <thrust/tabulate.h>
 
+#include <ranger/ranger.hpp>
+
 namespace cuspatial {
 namespace test {
 
diff --git a/cpp/include/cuspatial_test/random.cuh b/cpp/include/cuspatial_test/random.cuh
index d2a65af3b..6fd63f79f 100644
--- a/cpp/include/cuspatial_test/random.cuh
+++ b/cpp/include/cuspatial_test/random.cuh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2022, NVIDIA CORPORATION.
+ * Copyright (c) 2020-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.
@@ -22,14 +22,13 @@
 
 #include <rmm/device_uvector.hpp>
 
+#include <cuda/std/type_traits>
 #include <thrust/execution_policy.h>
 #include <thrust/random.h>
 #include <thrust/random/normal_distribution.h>
 #include <thrust/random/uniform_int_distribution.h>
 #include <thrust/tabulate.h>
 
-#include <cuda/std/type_traits>
-
 #include <algorithm>
 #include <memory>
 
diff --git a/cpp/include/cuspatial_test/vector_equality.hpp b/cpp/include/cuspatial_test/vector_equality.hpp
index a352b6a8f..a8278f2d0 100644
--- a/cpp/include/cuspatial_test/vector_equality.hpp
+++ b/cpp/include/cuspatial_test/vector_equality.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -16,12 +16,12 @@
 
 #pragma once
 
+#include <cuspatial_test/test_util.cuh>
+
 #include <cuspatial/geometry/segment.cuh>
 #include <cuspatial/geometry/vec_2d.hpp>
 #include <cuspatial/traits.hpp>
 
-#include <cuspatial_test/test_util.cuh>
-
 #include <rmm/device_uvector.hpp>
 #include <rmm/device_vector.hpp>
 
diff --git a/cpp/tests/bounding_boxes/linestring_bounding_boxes_test.cpp b/cpp/tests/bounding_boxes/linestring_bounding_boxes_test.cpp
index d742b0cc7..fb4fab6db 100644
--- a/cpp/tests/bounding_boxes/linestring_bounding_boxes_test.cpp
+++ b/cpp/tests/bounding_boxes/linestring_bounding_boxes_test.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2022, NVIDIA CORPORATION.
+ * Copyright (c) 2020-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.
@@ -19,7 +19,6 @@
 
 #include <cudf/table/table.hpp>
 #include <cudf/table/table_view.hpp>
-
 #include <cudf_test/column_wrapper.hpp>
 
 struct LinestringBoundingBoxErrorTest : public ::testing::Test {};
diff --git a/cpp/tests/bounding_boxes/polygon_bounding_boxes_test.cpp b/cpp/tests/bounding_boxes/polygon_bounding_boxes_test.cpp
index 07f6ac2f0..83be1f845 100644
--- a/cpp/tests/bounding_boxes/polygon_bounding_boxes_test.cpp
+++ b/cpp/tests/bounding_boxes/polygon_bounding_boxes_test.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2020-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.
@@ -20,7 +20,6 @@
 #include <cudf/table/table.hpp>
 #include <cudf/table/table_view.hpp>
 #include <cudf/utilities/error.hpp>
-
 #include <cudf_test/column_utilities.hpp>
 #include <cudf_test/column_wrapper.hpp>
 
diff --git a/cpp/tests/distance/hausdorff_test.cpp b/cpp/tests/distance/hausdorff_test.cpp
index 2111e3330..10335c519 100644
--- a/cpp/tests/distance/hausdorff_test.cpp
+++ b/cpp/tests/distance/hausdorff_test.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2020-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.
@@ -18,7 +18,6 @@
 #include <cuspatial/error.hpp>
 
 #include <cudf/column/column_view.hpp>
-
 #include <cudf_test/base_fixture.hpp>
 #include <cudf_test/column_utilities.hpp>
 #include <cudf_test/column_wrapper.hpp>
diff --git a/cpp/tests/distance/hausdorff_test.cu b/cpp/tests/distance/hausdorff_test.cu
index 6ef18341f..7b923ec8c 100644
--- a/cpp/tests/distance/hausdorff_test.cu
+++ b/cpp/tests/distance/hausdorff_test.cu
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -22,6 +22,7 @@
 
 #include <rmm/device_vector.hpp>
 
+#include <cuda/functional>
 #include <thrust/host_vector.h>
 #include <thrust/iterator/constant_iterator.h>
 #include <thrust/iterator/counting_iterator.h>
@@ -30,8 +31,6 @@
 #include <gmock/gmock.h>
 #include <gtest/gtest.h>
 
-#include <cuda/functional>
-
 #include <iterator>
 
 template <typename T>
diff --git a/cpp/tests/distance/linestring_distance_test.cu b/cpp/tests/distance/linestring_distance_test.cu
index 0748d9c59..830512cc3 100644
--- a/cpp/tests/distance/linestring_distance_test.cu
+++ b/cpp/tests/distance/linestring_distance_test.cu
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -22,6 +22,7 @@
 #include <cuspatial/geometry/vec_2d.hpp>
 #include <cuspatial/iterator_factory.cuh>
 #include <cuspatial/range/multilinestring_range.cuh>
+
 #include <thrust/iterator/constant_iterator.h>
 #include <thrust/iterator/counting_iterator.h>
 
diff --git a/cpp/tests/distance/linestring_polygon_distance_test.cpp b/cpp/tests/distance/linestring_polygon_distance_test.cpp
index 95beec0bd..4ce0c9e65 100644
--- a/cpp/tests/distance/linestring_polygon_distance_test.cpp
+++ b/cpp/tests/distance/linestring_polygon_distance_test.cpp
@@ -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.
@@ -24,11 +24,10 @@
 #include <cuspatial/geometry/vec_2d.hpp>
 #include <cuspatial/types.hpp>
 
+#include <cudf/utilities/default_stream.hpp>
 #include <cudf_test/column_utilities.hpp>
 #include <cudf_test/column_wrapper.hpp>
 
-#include <cudf/utilities/default_stream.hpp>
-
 #include <rmm/cuda_stream_view.hpp>
 
 #include <initializer_list>
diff --git a/cpp/tests/distance/point_polygon_distance_test.cpp b/cpp/tests/distance/point_polygon_distance_test.cpp
index dfb486b69..07a90667b 100644
--- a/cpp/tests/distance/point_polygon_distance_test.cpp
+++ b/cpp/tests/distance/point_polygon_distance_test.cpp
@@ -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.
@@ -14,15 +14,15 @@
  * limitations under the License.
  */
 
+#include <cuspatial_test/column_factories.hpp>
+#include <cuspatial_test/vector_equality.hpp>
+
 #include <cuspatial/column/geometry_column_view.hpp>
 #include <cuspatial/distance.hpp>
 #include <cuspatial/error.hpp>
 #include <cuspatial/geometry/vec_2d.hpp>
 #include <cuspatial/types.hpp>
 
-#include <cuspatial_test/column_factories.hpp>
-#include <cuspatial_test/vector_equality.hpp>
-
 #include <cudf_test/column_utilities.hpp>
 #include <cudf_test/column_wrapper.hpp>
 
diff --git a/cpp/tests/distance/polygon_distance_test.cpp b/cpp/tests/distance/polygon_distance_test.cpp
index c1a2e8b4f..b6d345f56 100644
--- a/cpp/tests/distance/polygon_distance_test.cpp
+++ b/cpp/tests/distance/polygon_distance_test.cpp
@@ -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.
@@ -23,11 +23,10 @@
 #include <cuspatial/geometry/vec_2d.hpp>
 #include <cuspatial/types.hpp>
 
+#include <cudf/utilities/default_stream.hpp>
 #include <cudf_test/column_utilities.hpp>
 #include <cudf_test/column_wrapper.hpp>
 
-#include <cudf/utilities/default_stream.hpp>
-
 #include <rmm/cuda_stream_view.hpp>
 
 #include <initializer_list>
diff --git a/cpp/tests/equality/pairwise_multipoint_equals_count_test.cpp b/cpp/tests/equality/pairwise_multipoint_equals_count_test.cpp
index 1d2923e4b..b096abd69 100644
--- a/cpp/tests/equality/pairwise_multipoint_equals_count_test.cpp
+++ b/cpp/tests/equality/pairwise_multipoint_equals_count_test.cpp
@@ -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.
@@ -14,12 +14,12 @@
  * limitations under the License.
  */
 
-#include <cudf/utilities/default_stream.hpp>
 #include <cuspatial_test/column_factories.hpp>
 
 #include <cuspatial/error.hpp>
 #include <cuspatial/pairwise_multipoint_equals_count.hpp>
 
+#include <cudf/utilities/default_stream.hpp>
 #include <cudf_test/base_fixture.hpp>
 #include <cudf_test/column_utilities.hpp>
 #include <cudf_test/column_wrapper.hpp>
@@ -27,6 +27,7 @@
 #include <cudf_test/type_lists.hpp>
 
 #include <rmm/cuda_stream_view.hpp>
+
 #include <type_traits>
 
 using namespace cuspatial;
diff --git a/cpp/tests/find/find_duplicate_points_test.cu b/cpp/tests/find/find_duplicate_points_test.cu
index 49bc86bb9..947ebd8eb 100644
--- a/cpp/tests/find/find_duplicate_points_test.cu
+++ b/cpp/tests/find/find_duplicate_points_test.cu
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -18,12 +18,12 @@
 #include <cuspatial_test/vector_equality.hpp>
 #include <cuspatial_test/vector_factories.cuh>
 
-#include <rmm/cuda_stream_view.hpp>
-#include <rmm/device_vector.hpp>
-
 #include <cuspatial/detail/find/find_duplicate_points.cuh>
 #include <cuspatial/geometry/vec_2d.hpp>
 
+#include <rmm/cuda_stream_view.hpp>
+#include <rmm/device_vector.hpp>
+
 using namespace cuspatial;
 using namespace cuspatial::detail;
 using namespace cuspatial::test;
diff --git a/cpp/tests/find/find_points_on_segments_test.cu b/cpp/tests/find/find_points_on_segments_test.cu
index 4296f6479..cd6a2e37f 100644
--- a/cpp/tests/find/find_points_on_segments_test.cu
+++ b/cpp/tests/find/find_points_on_segments_test.cu
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -18,13 +18,13 @@
 #include <cuspatial_test/vector_equality.hpp>
 #include <cuspatial_test/vector_factories.cuh>
 
-#include <rmm/cuda_stream_view.hpp>
-#include <rmm/device_vector.hpp>
-
 #include <cuspatial/detail/find/find_points_on_segments.cuh>
 #include <cuspatial/geometry/vec_2d.hpp>
 #include <cuspatial/range/range.cuh>
 
+#include <rmm/cuda_stream_view.hpp>
+#include <rmm/device_vector.hpp>
+
 #include <initializer_list>
 
 using namespace cuspatial;
diff --git a/cpp/tests/index/point_quadtree_test.cpp b/cpp/tests/index/point_quadtree_test.cpp
index 93978e093..1f6c11dba 100644
--- a/cpp/tests/index/point_quadtree_test.cpp
+++ b/cpp/tests/index/point_quadtree_test.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2020-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.
@@ -20,7 +20,6 @@
 #include <cudf/column/column_view.hpp>
 #include <cudf/table/table.hpp>
 #include <cudf/table/table_view.hpp>
-
 #include <cudf_test/base_fixture.hpp>
 #include <cudf_test/column_utilities.hpp>
 #include <cudf_test/column_wrapper.hpp>
diff --git a/cpp/tests/intersection/linestring_intersection_count_test.cu b/cpp/tests/intersection/linestring_intersection_count_test.cu
index 24467462e..cec8be291 100644
--- a/cpp/tests/intersection/linestring_intersection_count_test.cu
+++ b/cpp/tests/intersection/linestring_intersection_count_test.cu
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -26,10 +26,10 @@
 #include <rmm/cuda_stream_view.hpp>
 #include <rmm/device_uvector.hpp>
 #include <rmm/device_vector.hpp>
-#include <thrust/uninitialized_fill.h>
-
 #include <rmm/exec_policy.hpp>
+
 #include <thrust/iterator/zip_iterator.h>
+#include <thrust/uninitialized_fill.h>
 
 #include <initializer_list>
 #include <type_traits>
diff --git a/cpp/tests/intersection/linestring_intersection_test.cpp b/cpp/tests/intersection/linestring_intersection_test.cpp
index b48d1b057..9b9318104 100644
--- a/cpp/tests/intersection/linestring_intersection_test.cpp
+++ b/cpp/tests/intersection/linestring_intersection_test.cpp
@@ -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.
@@ -14,8 +14,6 @@
  * limitations under the License.
  */
 
-#include <cudf_test/cudf_gtest.hpp>
-
 #include <cuspatial_test/base_fixture.hpp>
 #include <cuspatial_test/test_util.cuh>
 #include <cuspatial_test/vector_equality.hpp>
@@ -32,9 +30,9 @@
 #include <cudf/scalar/scalar_factories.hpp>
 #include <cudf/types.hpp>
 #include <cudf/utilities/default_stream.hpp>
-
 #include <cudf_test/column_utilities.hpp>
 #include <cudf_test/column_wrapper.hpp>
+#include <cudf_test/cudf_gtest.hpp>
 #include <cudf_test/type_lists.hpp>
 
 #include <rmm/cuda_stream_view.hpp>
diff --git a/cpp/tests/intersection/linestring_intersection_with_duplicates_test.cu b/cpp/tests/intersection/linestring_intersection_with_duplicates_test.cu
index 195968615..359b45700 100644
--- a/cpp/tests/intersection/linestring_intersection_with_duplicates_test.cu
+++ b/cpp/tests/intersection/linestring_intersection_with_duplicates_test.cu
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -32,13 +32,12 @@
 #include <rmm/mr/device/device_memory_resource.hpp>
 #include <rmm/mr/device/per_device_resource.hpp>
 
+#include <cub/device/device_segmented_sort.cuh>
 #include <thrust/gather.h>
 #include <thrust/iterator/zip_iterator.h>
 #include <thrust/sequence.h>
 #include <thrust/sort.h>
 
-#include <cub/device/device_segmented_sort.cuh>
-
 #include <initializer_list>
 #include <type_traits>
 
diff --git a/cpp/tests/join/join_quadtree_and_bounding_boxes_test.cpp b/cpp/tests/join/join_quadtree_and_bounding_boxes_test.cpp
index e7d6d5948..34a16208e 100644
--- a/cpp/tests/join/join_quadtree_and_bounding_boxes_test.cpp
+++ b/cpp/tests/join/join_quadtree_and_bounding_boxes_test.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2020-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.
@@ -21,7 +21,6 @@
 
 #include <cudf/table/table.hpp>
 #include <cudf/table/table_view.hpp>
-
 #include <cudf_test/base_fixture.hpp>
 #include <cudf_test/column_utilities.hpp>
 #include <cudf_test/column_wrapper.hpp>
diff --git a/cpp/tests/join/quadtree_point_in_polygon_test.cpp b/cpp/tests/join/quadtree_point_in_polygon_test.cpp
index c3d720c10..592e7a52e 100644
--- a/cpp/tests/join/quadtree_point_in_polygon_test.cpp
+++ b/cpp/tests/join/quadtree_point_in_polygon_test.cpp
@@ -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.
@@ -14,20 +14,20 @@
  * limitations under the License.
  */
 
-#include <cudf/column/column.hpp>
 #include <cuspatial/bounding_boxes.hpp>
 #include <cuspatial/error.hpp>
 #include <cuspatial/geometry/vec_2d.hpp>
 #include <cuspatial/point_quadtree.hpp>
 #include <cuspatial/spatial_join.hpp>
 
+#include <cudf/column/column.hpp>
 #include <cudf/table/table.hpp>
 #include <cudf/table/table_view.hpp>
 #include <cudf/utilities/error.hpp>
-
 #include <cudf_test/column_utilities.hpp>
 #include <cudf_test/column_wrapper.hpp>
 #include <cudf_test/table_utilities.hpp>
+
 #include <memory>
 
 using T = float;
diff --git a/cpp/tests/join/quadtree_point_in_polygon_test_large.cu b/cpp/tests/join/quadtree_point_in_polygon_test_large.cu
index 1be866afc..d80709486 100644
--- a/cpp/tests/join/quadtree_point_in_polygon_test_large.cu
+++ b/cpp/tests/join/quadtree_point_in_polygon_test_large.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.
@@ -30,8 +30,8 @@
 #include <rmm/device_uvector.hpp>
 #include <rmm/exec_policy.hpp>
 #include <rmm/mr/device/device_memory_resource.hpp>
-
 #include <rmm/mr/device/per_device_resource.hpp>
+
 #include <thrust/gather.h>
 #include <thrust/sort.h>
 
diff --git a/cpp/tests/join/quadtree_point_in_polygon_test_small.cu b/cpp/tests/join/quadtree_point_in_polygon_test_small.cu
index 52792dd9b..2439347b1 100644
--- a/cpp/tests/join/quadtree_point_in_polygon_test_small.cu
+++ b/cpp/tests/join/quadtree_point_in_polygon_test_small.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.
@@ -25,6 +25,7 @@
 #include <cuspatial/spatial_join.cuh>
 
 #include <gtest/gtest.h>
+
 #include <initializer_list>
 
 /*
diff --git a/cpp/tests/join/quadtree_point_to_nearest_linestring_test.cpp b/cpp/tests/join/quadtree_point_to_nearest_linestring_test.cpp
index d78cda350..bfca5b024 100644
--- a/cpp/tests/join/quadtree_point_to_nearest_linestring_test.cpp
+++ b/cpp/tests/join/quadtree_point_to_nearest_linestring_test.cpp
@@ -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.
@@ -14,20 +14,20 @@
  * limitations under the License.
  */
 
-#include <cudf/column/column.hpp>
 #include <cuspatial/bounding_boxes.hpp>
 #include <cuspatial/error.hpp>
 #include <cuspatial/geometry/vec_2d.hpp>
 #include <cuspatial/point_quadtree.hpp>
 #include <cuspatial/spatial_join.hpp>
 
+#include <cudf/column/column.hpp>
 #include <cudf/table/table.hpp>
 #include <cudf/table/table_view.hpp>
 #include <cudf/utilities/error.hpp>
-
 #include <cudf_test/column_utilities.hpp>
 #include <cudf_test/column_wrapper.hpp>
 #include <cudf_test/table_utilities.hpp>
+
 #include <memory>
 
 using T = float;
diff --git a/cpp/tests/points_in_range/points_in_range_test.cpp b/cpp/tests/points_in_range/points_in_range_test.cpp
index 37f7b153d..449a1a5b3 100644
--- a/cpp/tests/points_in_range/points_in_range_test.cpp
+++ b/cpp/tests/points_in_range/points_in_range_test.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2020-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.
@@ -18,7 +18,6 @@
 #include <cuspatial/points_in_range.hpp>
 
 #include <cudf/table/table.hpp>
-
 #include <cudf_test/base_fixture.hpp>
 #include <cudf_test/column_utilities.hpp>
 #include <cudf_test/column_wrapper.hpp>
diff --git a/cpp/tests/points_in_range/points_in_range_test.cu b/cpp/tests/points_in_range/points_in_range_test.cu
index ca638fbdc..235cd476d 100644
--- a/cpp/tests/points_in_range/points_in_range_test.cu
+++ b/cpp/tests/points_in_range/points_in_range_test.cu
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -20,15 +20,15 @@
 #include <cuspatial/geometry/vec_2d.hpp>
 #include <cuspatial/points_in_range.cuh>
 
-#include <limits>
 #include <rmm/cuda_stream_view.hpp>
 #include <rmm/device_uvector.hpp>
 #include <rmm/device_vector.hpp>
 
-#include <type_traits>
-
 #include <gtest/gtest.h>
 
+#include <limits>
+#include <type_traits>
+
 template <typename T>
 using Vec = cuspatial::vec_2d<T>;
 
diff --git a/cpp/tests/projection/sinusoidal_projection_test.cu b/cpp/tests/projection/sinusoidal_projection_test.cu
index 41c2202e1..031a15c73 100644
--- a/cpp/tests/projection/sinusoidal_projection_test.cu
+++ b/cpp/tests/projection/sinusoidal_projection_test.cu
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -14,17 +14,18 @@
  * limitations under the License.
  */
 
+#include <cuspatial_test/vector_equality.hpp>
+
 #include <cuspatial/constants.hpp>
 #include <cuspatial/error.hpp>
 #include <cuspatial/projection.cuh>
-#include <cuspatial_test/vector_equality.hpp>
 
 #include <rmm/device_vector.hpp>
 
-#include <gtest/gtest.h>
-
 #include <thrust/iterator/transform_iterator.h>
 
+#include <gtest/gtest.h>
+
 template <typename T>
 inline T midpoint(T a, T b)
 {
diff --git a/cpp/tests/range/multilinestring_range_test.cu b/cpp/tests/range/multilinestring_range_test.cu
index 11c17e5ac..4938e0df4 100644
--- a/cpp/tests/range/multilinestring_range_test.cu
+++ b/cpp/tests/range/multilinestring_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.
@@ -13,9 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#include <cuspatial_test/test_util.cuh>
-
 #include <cuspatial_test/base_fixture.hpp>
+#include <cuspatial_test/test_util.cuh>
 #include <cuspatial_test/vector_equality.hpp>
 #include <cuspatial_test/vector_factories.cuh>
 
diff --git a/cpp/tests/trajectory/trajectory_distances_and_speeds_test.cu b/cpp/tests/trajectory/trajectory_distances_and_speeds_test.cu
index 819dae901..bf084fcee 100644
--- a/cpp/tests/trajectory/trajectory_distances_and_speeds_test.cu
+++ b/cpp/tests/trajectory/trajectory_distances_and_speeds_test.cu
@@ -1,6 +1,6 @@
 
 /*
- * Copyright (c) 2022-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -26,11 +26,10 @@
 
 #include <rmm/exec_policy.hpp>
 
+#include <cuda/functional>
 #include <thrust/iterator/zip_iterator.h>
 #include <thrust/reduce.h>
 
-#include <cuda/functional>
-
 #include <gtest/gtest.h>
 
 #include <limits>
diff --git a/cpp/tests/trajectory/trajectory_test_utils.cuh b/cpp/tests/trajectory/trajectory_test_utils.cuh
index 847748fc6..b150e7284 100644
--- a/cpp/tests/trajectory/trajectory_test_utils.cuh
+++ b/cpp/tests/trajectory/trajectory_test_utils.cuh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -16,14 +16,15 @@
 
 #pragma once
 
+#include <cuspatial_test/test_util.cuh>
+
 #include <cuspatial/geometry/vec_2d.hpp>
 #include <cuspatial/iterator_factory.cuh>
 
-#include <cuspatial_test/test_util.cuh>
-
 #include <rmm/device_vector.hpp>
 #include <rmm/exec_policy.hpp>
 
+#include <cuda/std/chrono>
 #include <thrust/binary_search.h>
 #include <thrust/gather.h>
 #include <thrust/iterator/constant_iterator.h>
@@ -34,8 +35,6 @@
 #include <thrust/tabulate.h>
 #include <thrust/transform.h>
 
-#include <cuda/std/chrono>
-
 #include <cstdint>
 
 namespace cuspatial {
diff --git a/cpp/tests/utility_test/test_float_equivalent.cu b/cpp/tests/utility_test/test_float_equivalent.cu
index 8fe74c357..b459ae787 100644
--- a/cpp/tests/utility_test/test_float_equivalent.cu
+++ b/cpp/tests/utility_test/test_float_equivalent.cu
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022-2023, NVIDIA CORPORATION.
+ * Copyright (c) 2022-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.
@@ -14,14 +14,16 @@
  * limitations under the License.
  */
 
-#include <cuspatial/detail/utility/floating_point.cuh>
 #include <cuspatial_test/vector_factories.cuh>
 
-#include <limits>
+#include <cuspatial/detail/utility/floating_point.cuh>
+
 #include <rmm/device_vector.hpp>
 
 #include <gtest/gtest.h>
 
+#include <limits>
+
 using namespace cuspatial;
 using namespace cuspatial::test;
 
diff --git a/cpp/tests/utility_test/test_geometry_generators.cu b/cpp/tests/utility_test/test_geometry_generators.cu
index d0b35e9e4..70910d6aa 100644
--- a/cpp/tests/utility_test/test_geometry_generators.cu
+++ b/cpp/tests/utility_test/test_geometry_generators.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.
@@ -20,6 +20,7 @@
 #include <cuspatial/geometry/vec_2d.hpp>
 
 #include <gtest/gtest-param-test.h>
+
 #include <type_traits>
 
 using namespace cuspatial;
diff --git a/python/cuspatial/cuspatial/tests/basicpreds/test_intersections.py b/python/cuspatial/cuspatial/tests/basicpreds/test_intersections.py
index 37891366a..993eb72a8 100644
--- a/python/cuspatial/cuspatial/tests/basicpreds/test_intersections.py
+++ b/python/cuspatial/cuspatial/tests/basicpreds/test_intersections.py
@@ -22,7 +22,7 @@ def test_empty():
     s1 = gpd.GeoSeries([])
     s2 = gpd.GeoSeries([])
 
-    expect_offset = pd.Series([0])
+    expect_offset = pd.Series([0], dtype="i4")
     expect_geom = gpd.GeoSeries([])
     expect_ids = pd.DataFrame(
         {
@@ -30,7 +30,8 @@ def test_empty():
             "lhs_segment_id": [],
             "rhs_linestring_id": [],
             "rhs_segment_id": [],
-        }
+        },
+        dtype="i4",
     )
 
     run_test(s1, s2, expect_offset, expect_geom, expect_ids)
diff --git a/python/cuspatial/cuspatial/tests/spatial/bounding/test_linestring_bounding_boxes.py b/python/cuspatial/cuspatial/tests/spatial/bounding/test_linestring_bounding_boxes.py
index 154f6a22c..73984782b 100644
--- a/python/cuspatial/cuspatial/tests/spatial/bounding/test_linestring_bounding_boxes.py
+++ b/python/cuspatial/cuspatial/tests/spatial/bounding/test_linestring_bounding_boxes.py
@@ -18,10 +18,10 @@ def test_linestring_bounding_boxes_empty():
         result,
         cudf.DataFrame(
             {
-                "minx": cudf.Series([]),
-                "miny": cudf.Series([]),
-                "maxx": cudf.Series([]),
-                "maxy": cudf.Series([]),
+                "minx": cudf.Series([], dtype=np.float64),
+                "miny": cudf.Series([], dtype=np.float64),
+                "maxx": cudf.Series([], dtype=np.float64),
+                "maxy": cudf.Series([], dtype=np.float64),
             }
         ),
     )
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 89f076c17..d4fb1d819 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
@@ -247,7 +247,7 @@ def test_pip_bitmap_column_to_binary_array():
     )
     np.testing.assert_array_equal(got.copy_to_host(), expected)
 
-    col = cudf.Series([])._column
+    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)
diff --git a/python/cuspatial/cuspatial/tests/spatial/nearest_points/test_nearest_points.py b/python/cuspatial/cuspatial/tests/spatial/nearest_points/test_nearest_points.py
index 9c94a1106..77280ac50 100644
--- a/python/cuspatial/cuspatial/tests/spatial/nearest_points/test_nearest_points.py
+++ b/python/cuspatial/cuspatial/tests/spatial/nearest_points/test_nearest_points.py
@@ -1,4 +1,5 @@
 import geopandas as gpd
+import pandas as pd
 import pytest
 import shapely
 from geopandas.testing import assert_geodataframe_equal
@@ -73,9 +74,9 @@ def test_empty_input():
     )
     expected = gpd.GeoDataFrame(
         {
-            "point_geometry_id": [],
-            "linestring_geometry_id": [],
-            "segment_id": [],
+            "point_geometry_id": pd.Series([], dtype="i4"),
+            "linestring_geometry_id": pd.Series([], dtype="i4"),
+            "segment_id": pd.Series([], dtype="i4"),
             "geometry": gpd.GeoSeries(),
         }
     )
diff --git a/python/cuspatial/cuspatial/tests/test_geodataframe.py b/python/cuspatial/cuspatial/tests/test_geodataframe.py
index a3e96a0fb..876e30dc5 100644
--- a/python/cuspatial/cuspatial/tests/test_geodataframe.py
+++ b/python/cuspatial/cuspatial/tests/test_geodataframe.py
@@ -1,4 +1,6 @@
-# Copyright (c) 2020-2021, NVIDIA CORPORATION.
+# Copyright (c) 2020-2024, NVIDIA CORPORATION.
+import sys
+
 import geopandas as gpd
 import numpy as np
 import pandas as pd
@@ -320,6 +322,11 @@ def test_boolmask(gpdf, df_boolmask):
     assert_eq_geo_df(gi[df_boolmask], cugpdf_back[df_boolmask])
 
 
+@pytest.mark.xfail(
+    sys.version_info.major >= 3 and sys.version_info.minor >= 11,
+    reason="Size discrepancies between Python versions. See "
+    "https://github.com/rapidsai/cuspatial/issues/1352",
+)
 def test_memory_usage(gs):
     assert gs.memory_usage() == 224
     host_dataframe = gpd.read_file(
@@ -435,8 +442,20 @@ def test_reset_index(level, drop, inplace, col_level, col_fill):
         index=midx,
     )
     gdf = cuspatial.from_geopandas(gpdf)
-    expected = gpdf.reset_index(level, drop, inplace, col_level, col_fill)
-    got = gdf.reset_index(level, drop, inplace, col_level, col_fill)
+    expected = gpdf.reset_index(
+        level=level,
+        drop=drop,
+        inplace=inplace,
+        col_level=col_level,
+        col_fill=col_fill,
+    )
+    got = gdf.reset_index(
+        level=level,
+        drop=drop,
+        inplace=inplace,
+        col_level=col_level,
+        col_fill=col_fill,
+    )
     if inplace:
         expected = gpdf
         got = gdf
diff --git a/python/cuspatial/cuspatial/tests/test_geoseries.py b/python/cuspatial/cuspatial/tests/test_geoseries.py
index ce2f8ff3a..395b58512 100644
--- a/python/cuspatial/cuspatial/tests/test_geoseries.py
+++ b/python/cuspatial/cuspatial/tests/test_geoseries.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2020-2021, NVIDIA CORPORATION.
+# Copyright (c) 2020-2024, NVIDIA CORPORATION.
 
 from enum import Enum
 from numbers import Integral
@@ -27,7 +27,7 @@
 np.random.seed(0)
 
 
-class Test_Feature_Enum(Enum):
+class Example_Feature_Enum(Enum):
     POINT = 0
     MULTIPOINT = 1
     LINESTRING = 2
@@ -54,7 +54,7 @@ def random_multipolygon(size):
 
 
 def generate_random_shapely_feature(
-    size: Integral, has_z: bool = False, obj_type: Test_Feature_Enum = None
+    size: Integral, has_z: bool = False, obj_type: Example_Feature_Enum = None
 ):
     obj_type = obj_type.value if obj_type else np.random.randint(1, 7)
     if obj_type == 1:
@@ -78,7 +78,7 @@ def generate_random_shapely_feature(
             return random_multipolygon(size)
 
 
-def generator(size: Integral, obj_type: Test_Feature_Enum = None):
+def generator(size: Integral, obj_type: Example_Feature_Enum = None):
     geos_list = []
     for i in range(size):
         geo = generate_random_shapely_feature(3, obj_type)
@@ -257,7 +257,7 @@ def test_getitem_lines():
 
 
 def test_getitem_slice_same_index():
-    gps = gpd.GeoSeries(generator(3, Test_Feature_Enum.POINT))
+    gps = gpd.GeoSeries(generator(3, Example_Feature_Enum.POINT))
     cus = cuspatial.from_geopandas(gps)
     assert_eq_geo(cus[0:1].to_geopandas(), gps[0:1])
     assert_eq_geo(cus[0:1].to_geopandas(), gps[0:1])
@@ -576,8 +576,10 @@ def test_reset_index(level, drop, name, inplace):
         [Point(0, 0), Point(0, 1), Point(2, 2), Point(3, 3)], index=midx
     )
     gs = cuspatial.from_geopandas(gps)
-    expected = gps.reset_index(level, drop, name, inplace)
-    got = gs.reset_index(level, drop, name, inplace)
+    expected = gps.reset_index(
+        level=level, drop=drop, name=name, inplace=inplace
+    )
+    got = gs.reset_index(level=level, drop=drop, name=name, inplace=inplace)
     if inplace:
         expected = gps
         got = gs