You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sedona.apache.org by ji...@apache.org on 2024/04/29 07:47:24 UTC

(sedona) 01/01: Initial upgrade

This is an automated email from the ASF dual-hosted git repository.

jiayu pushed a commit to branch SEDONA-551
in repository https://gitbox.apache.org/repos/asf/sedona.git

commit 5975d8ac209a1b4288bc9e9250ef537a6d5a6cb0
Author: Jia Yu <ji...@apache.org>
AuthorDate: Mon Apr 29 00:47:13 2024 -0700

    Initial upgrade
---
 .github/workflows/java.yml                         | 20 +++++---------
 .github/workflows/python.yml                       |  2 +-
 .github/workflows/r.yml                            |  2 +-
 .../apache/sedona/common/FunctionsGeoTools.java    | 10 +++----
 .../sedona/common/raster/GeometryFunctions.java    |  8 +++---
 .../sedona/common/raster/PixelFunctionEditors.java |  9 +++----
 .../sedona/common/raster/PixelFunctions.java       | 11 ++++----
 .../sedona/common/raster/RasterAccessors.java      |  8 +++---
 .../sedona/common/raster/RasterBandAccessors.java  |  2 +-
 .../sedona/common/raster/RasterBandEditors.java    |  6 ++---
 .../sedona/common/raster/RasterConstructors.java   | 28 +++++++++----------
 .../raster/RasterConstructorsForTesting.java       |  6 ++---
 .../apache/sedona/common/raster/RasterEditors.java | 22 +++++++--------
 .../apache/sedona/common/raster/RasterOutputs.java |  6 ++---
 .../sedona/common/raster/RasterPredicates.java     | 12 ++++-----
 .../sedona/common/raster/netcdf/NetCdfReader.java  |  4 +--
 .../sedona/common/raster/serde/CRSSerializer.java  |  4 +--
 .../apache/sedona/common/raster/serde/Serde.java   |  2 +-
 .../common/utils/CachedCRSTransformFinder.java     |  6 ++---
 .../apache/sedona/common/utils/RasterUtils.java    | 23 ++++++++--------
 .../org/apache/sedona/common/FunctionsTest.java    |  4 +--
 .../sedona/common/raster/FunctionEditorsTest.java  |  4 +--
 .../apache/sedona/common/raster/FunctionsTest.java |  4 +--
 .../common/raster/GeometryFunctionsTest.java       |  4 +--
 .../sedona/common/raster/MapAlgebraTest.java       |  2 +-
 .../sedona/common/raster/RasterAccessorsTest.java  |  4 +--
 .../common/raster/RasterBandAccessorsTest.java     |  4 +--
 .../common/raster/RasterBandEditorsTest.java       |  4 +--
 .../common/raster/RasterConstructorsTest.java      | 12 ++++-----
 .../sedona/common/raster/RasterEditorsTest.java    | 22 +++++++--------
 .../sedona/common/raster/RasterOutputTest.java     |  2 +-
 .../sedona/common/raster/RasterPredicatesTest.java |  8 +++---
 .../sedona/common/raster/RasterTestBase.java       | 31 +++++++++++-----------
 .../common/raster/serde/CRSSerializerTest.java     |  4 +--
 .../sedona/common/raster/serde/SerdeTest.java      |  2 +-
 .../apache/sedona/flink/expressions/Functions.java |  9 +++----
 .../flink/expressions/FunctionsGeoTools.java       |  4 +--
 .../java/org/apache/sedona/flink/FunctionTest.java |  4 +--
 pom.xml                                            |  2 +-
 .../sedona/snowflake/snowsql/GeoToolsWrapper.java  |  4 +--
 .../sedona/core/spatialOperator/KNNQuery.java      |  4 +--
 .../strategy/join/JoinedGeometryRaster.scala       | 11 ++++----
 .../shapefileParser/shapes/ShapefileRDDTest.java   | 12 ++++-----
 .../shapes/ShapefileReaderTest.java                | 14 +++++-----
 .../org/apache/sedona/sql/functionTestScala.scala  |  2 +-
 45 files changed, 176 insertions(+), 192 deletions(-)

diff --git a/.github/workflows/java.yml b/.github/workflows/java.yml
index 3d780c7ae..616e3e2d1 100644
--- a/.github/workflows/java.yml
+++ b/.github/workflows/java.yml
@@ -41,11 +41,7 @@ jobs:
         include:
           - spark: 3.5.0
             scala: 2.13.8
-            jdk: '8'
-            skipTests: ''
-          - spark: 3.5.0
-            scala: 2.12.15
-            jdk: '8'
+            jdk: '11'
             skipTests: ''
           - spark: 3.5.0
             scala: 2.12.15
@@ -53,11 +49,7 @@ jobs:
             skipTests: ''
           - spark: 3.4.0
             scala: 2.13.8
-            jdk: '8'
-            skipTests: ''
-          - spark: 3.4.0
-            scala: 2.12.15
-            jdk: '8'
+            jdk: '11'
             skipTests: ''
           - spark: 3.4.0
             scala: 2.12.15
@@ -65,19 +57,19 @@ jobs:
             skipTests: ''
           - spark: 3.3.0
             scala: 2.12.15
-            jdk: '8'
+            jdk: '11'
             skipTests: ''
           - spark: 3.2.3
             scala: 2.12.15
-            jdk: '8'
+            jdk: '11'
             skipTests: ''
           - spark: 3.1.2
             scala: 2.12.15
-            jdk: '8'
+            jdk: '11'
             skipTests: ''
           - spark: 3.0.3
             scala: 2.12.15
-            jdk: '8'
+            jdk: '11'
             skipTests: ''
 
     steps:
diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml
index 9e5546677..a5d623dd5 100644
--- a/.github/workflows/python.yml
+++ b/.github/workflows/python.yml
@@ -97,7 +97,7 @@ jobs:
     - uses: actions/setup-java@v4
       with:
         distribution: 'zulu'
-        java-version: '8'
+        java-version: '11'
     - uses: actions/setup-python@v5
       with:
         python-version: ${{ matrix.python }}
diff --git a/.github/workflows/r.yml b/.github/workflows/r.yml
index 199e03077..aa28e7f19 100644
--- a/.github/workflows/r.yml
+++ b/.github/workflows/r.yml
@@ -86,7 +86,7 @@ jobs:
       - uses: actions/setup-java@v4
         with:
           distribution: 'temurin'
-          java-version: '8'
+          java-version: '11'
           cache: 'maven'
       - name: Get OS name
         id: os-name
diff --git a/common/src/main/java/org/apache/sedona/common/FunctionsGeoTools.java b/common/src/main/java/org/apache/sedona/common/FunctionsGeoTools.java
index b47c5ce8f..4b15a639c 100644
--- a/common/src/main/java/org/apache/sedona/common/FunctionsGeoTools.java
+++ b/common/src/main/java/org/apache/sedona/common/FunctionsGeoTools.java
@@ -23,11 +23,11 @@ import org.locationtech.jts.geom.GeometryFactory;
 import org.locationtech.jts.operation.buffer.BufferOp;
 import org.locationtech.jts.operation.buffer.BufferParameters;
 import org.locationtech.jts.triangulate.VoronoiDiagramBuilder;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.NoSuchAuthorityCodeException;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
-import org.opengis.referencing.operation.MathTransform;
-import org.opengis.referencing.operation.TransformException;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.NoSuchAuthorityCodeException;
+import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
+import org.geotools.api.referencing.operation.MathTransform;
+import org.geotools.api.referencing.operation.TransformException;
 
 
 
diff --git a/common/src/main/java/org/apache/sedona/common/raster/GeometryFunctions.java b/common/src/main/java/org/apache/sedona/common/raster/GeometryFunctions.java
index a2c91fbd8..ff215776c 100644
--- a/common/src/main/java/org/apache/sedona/common/raster/GeometryFunctions.java
+++ b/common/src/main/java/org/apache/sedona/common/raster/GeometryFunctions.java
@@ -22,11 +22,11 @@ package org.apache.sedona.common.raster;
 import org.apache.sedona.common.utils.RasterUtils;
 import org.geotools.coverage.grid.GridCoordinates2D;
 import org.geotools.coverage.grid.GridCoverage2D;
-import org.geotools.geometry.Envelope2D;
+import org.geotools.geometry.jts.ReferencedEnvelope;
 import org.locationtech.jts.geom.*;
 import org.locationtech.jts.geom.impl.CoordinateArraySequence;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
 
 import java.awt.geom.Point2D;
 
@@ -118,7 +118,7 @@ public class GeometryFunctions {
     }
 
     public static Geometry envelope(GridCoverage2D raster) throws FactoryException {
-        Envelope2D envelope2D = raster.getEnvelope2D();
+        ReferencedEnvelope envelope2D = raster.getEnvelope2D();
 
         Envelope envelope = new Envelope(envelope2D.getMinX(), envelope2D.getMaxX(), envelope2D.getMinY(), envelope2D.getMaxY());
         int srid = RasterAccessors.srid(raster);
diff --git a/common/src/main/java/org/apache/sedona/common/raster/PixelFunctionEditors.java b/common/src/main/java/org/apache/sedona/common/raster/PixelFunctionEditors.java
index 9e5f8456c..88afdb867 100644
--- a/common/src/main/java/org/apache/sedona/common/raster/PixelFunctionEditors.java
+++ b/common/src/main/java/org/apache/sedona/common/raster/PixelFunctionEditors.java
@@ -19,14 +19,13 @@
 package org.apache.sedona.common.raster;
 
 import org.apache.commons.lang3.tuple.Pair;
-import org.apache.sedona.common.Functions;
 import org.apache.sedona.common.utils.RasterUtils;
 import org.geotools.coverage.grid.GridCoverage2D;
-import org.geotools.geometry.DirectPosition2D;
+import org.geotools.geometry.Position2D;
 import org.locationtech.jts.geom.Coordinate;
 import org.locationtech.jts.geom.Geometry;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
 
 import javax.media.jai.RasterFactory;
 import java.awt.*;
@@ -143,7 +142,7 @@ public class PixelFunctionEditors {
         if (geometryType.equalsIgnoreCase(Geometry.TYPENAME_POINT) || geometryType.equalsIgnoreCase(Geometry.TYPENAME_MULTIPOINT)) {
             Coordinate[] coordinates = geom.getCoordinates();
             for (Coordinate pointCoordinate: coordinates) {
-                int[] pointLocation = raster.getGridGeometry().worldToGrid(new DirectPosition2D(pointCoordinate.x, pointCoordinate.y)).getCoordinateValues();
+                int[] pointLocation = raster.getGridGeometry().worldToGrid(new Position2D(pointCoordinate.x, pointCoordinate.y)).getCoordinateValues();
                 double[] pixel = rasterCopied.getPixel(pointLocation[0], pointLocation[1], (double[]) null);
                 pixel[band - 1] = rasterizedGeomData.getPixel(0, 0, (double[]) null)[0];
                 rasterCopied.setPixel(pointLocation[0], pointLocation[1], pixel);
diff --git a/common/src/main/java/org/apache/sedona/common/raster/PixelFunctions.java b/common/src/main/java/org/apache/sedona/common/raster/PixelFunctions.java
index 65d0a040d..c6757b638 100644
--- a/common/src/main/java/org/apache/sedona/common/raster/PixelFunctions.java
+++ b/common/src/main/java/org/apache/sedona/common/raster/PixelFunctions.java
@@ -23,13 +23,12 @@ import org.apache.sedona.common.Functions;
 import org.apache.sedona.common.utils.RasterUtils;
 import org.geotools.coverage.grid.GridCoordinates2D;
 import org.geotools.coverage.grid.GridCoverage2D;
-import org.geotools.geometry.DirectPosition2D;
+import org.geotools.geometry.Position2D;
 import org.geotools.referencing.operation.transform.AffineTransform2D;
 import org.locationtech.jts.geom.*;
-import org.opengis.coverage.PointOutsideCoverageException;
-import org.opengis.geometry.DirectPosition;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
+import org.geotools.api.coverage.PointOutsideCoverageException;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
 
 import java.awt.geom.Point2D;
 import java.awt.image.Raster;
@@ -277,7 +276,7 @@ public class PixelFunctions
                 result.add(null);
             } else {
                 Point point = ensurePoint(geom);
-                DirectPosition directPosition2D = new DirectPosition2D(point.getX(), point.getY());
+                Point2D.Double directPosition2D = new Point2D.Double(point.getX(), point.getY());
                 try {
                     rasterGeom.evaluate(directPosition2D, pixelBuffer);
                     double pixel = pixelBuffer[band - 1];
diff --git a/common/src/main/java/org/apache/sedona/common/raster/RasterAccessors.java b/common/src/main/java/org/apache/sedona/common/raster/RasterAccessors.java
index 4d04bd0a5..61a9cef0e 100644
--- a/common/src/main/java/org/apache/sedona/common/raster/RasterAccessors.java
+++ b/common/src/main/java/org/apache/sedona/common/raster/RasterAccessors.java
@@ -27,10 +27,10 @@ import org.locationtech.jts.geom.Coordinate;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.GeometryFactory;
 import org.locationtech.jts.geom.Point;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.ReferenceIdentifier;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
-import org.opengis.referencing.operation.TransformException;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.ReferenceIdentifier;
+import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
+import org.geotools.api.referencing.operation.TransformException;
 
 import java.awt.geom.Point2D;
 import java.util.Arrays;
diff --git a/common/src/main/java/org/apache/sedona/common/raster/RasterBandAccessors.java b/common/src/main/java/org/apache/sedona/common/raster/RasterBandAccessors.java
index 7022a503c..62fa7f0cb 100644
--- a/common/src/main/java/org/apache/sedona/common/raster/RasterBandAccessors.java
+++ b/common/src/main/java/org/apache/sedona/common/raster/RasterBandAccessors.java
@@ -26,7 +26,7 @@ import org.apache.sedona.common.utils.RasterUtils;
 import org.geotools.coverage.GridSampleDimension;
 import org.geotools.coverage.grid.GridCoverage2D;
 import org.locationtech.jts.geom.Geometry;
-import org.opengis.referencing.FactoryException;
+import org.geotools.api.referencing.FactoryException;
 
 import javax.media.jai.RasterFactory;
 import java.awt.image.Raster;
diff --git a/common/src/main/java/org/apache/sedona/common/raster/RasterBandEditors.java b/common/src/main/java/org/apache/sedona/common/raster/RasterBandEditors.java
index 68feb92d2..8d39ed370 100644
--- a/common/src/main/java/org/apache/sedona/common/raster/RasterBandEditors.java
+++ b/common/src/main/java/org/apache/sedona/common/raster/RasterBandEditors.java
@@ -25,9 +25,9 @@ import org.geotools.coverage.GridSampleDimension;
 import org.geotools.coverage.grid.GridCoverage2D;
 import org.geotools.coverage.processing.operation.Crop;
 import org.locationtech.jts.geom.Geometry;
-import org.opengis.parameter.ParameterValueGroup;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
+import org.geotools.api.parameter.ParameterValueGroup;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
 
 import javax.media.jai.RasterFactory;
 import java.awt.geom.Point2D;
diff --git a/common/src/main/java/org/apache/sedona/common/raster/RasterConstructors.java b/common/src/main/java/org/apache/sedona/common/raster/RasterConstructors.java
index c7635c70b..67b3ad812 100644
--- a/common/src/main/java/org/apache/sedona/common/raster/RasterConstructors.java
+++ b/common/src/main/java/org/apache/sedona/common/raster/RasterConstructors.java
@@ -27,7 +27,6 @@ import org.geotools.feature.simple.SimpleFeatureBuilder;
 import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
 import org.geotools.gce.arcgrid.ArcGridReader;
 import org.geotools.gce.geotiff.GeoTiffReader;
-import org.geotools.geometry.Envelope2D;
 import org.geotools.geometry.jts.JTS;
 import org.geotools.geometry.jts.ReferencedEnvelope;
 import org.geotools.process.vector.VectorToRasterProcess;
@@ -36,13 +35,13 @@ import org.geotools.referencing.crs.DefaultEngineeringCRS;
 import org.geotools.referencing.operation.transform.AffineTransform2D;
 import org.geotools.util.factory.Hints;
 import org.locationtech.jts.geom.Geometry;
-import org.opengis.feature.simple.SimpleFeature;
-import org.opengis.feature.simple.SimpleFeatureType;
-import org.opengis.metadata.spatial.PixelOrientation;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
-import org.opengis.referencing.datum.PixelInCell;
-import org.opengis.referencing.operation.MathTransform;
+import org.geotools.api.feature.simple.SimpleFeature;
+import org.geotools.api.feature.simple.SimpleFeatureType;
+import org.geotools.api.metadata.spatial.PixelOrientation;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
+import org.geotools.api.referencing.datum.PixelInCell;
+import org.geotools.api.referencing.operation.MathTransform;
 import ucar.nc2.NetcdfFile;
 import ucar.nc2.NetcdfFiles;
 
@@ -176,26 +175,25 @@ public class RasterConstructors
             throw new IllegalArgumentException(String.format("SkewY %d of the raster is not zero.", metadata[7]));
         }
 
-        Envelope2D bound = null;
+        ReferencedEnvelope bound = null;
 
         if (useGeometryExtent) {
-            bound = JTS.getEnvelope2D(geom.getEnvelopeInternal(), raster.getCoordinateReferenceSystem2D());
+            bound = ReferencedEnvelope.envelope(geom.getEnvelopeInternal(), raster.getCoordinateReferenceSystem2D());
         } else {
-            ReferencedEnvelope envelope = ReferencedEnvelope.create(raster.getEnvelope(), raster.getCoordinateReferenceSystem());
-            bound = JTS.getEnvelope2D(envelope, raster.getCoordinateReferenceSystem2D());
+            bound = ReferencedEnvelope.create(raster.getEnvelope(), raster.getCoordinateReferenceSystem());
         }
 
         double scaleX = Math.abs(metadata[4]), scaleY = Math.abs(metadata[5]);
         int width = (int) bound.getWidth(), height = (int) bound.getHeight();
         if (width == 0 && height == 0) {
-            bound = new Envelope2D(bound.getCoordinateReferenceSystem(), bound.getCenterX() - scaleX * 0.5, bound.getCenterY() - scaleY * 0.5, scaleX, scaleY);
+            bound = ReferencedEnvelope.rect(bound.getCenterX() - scaleX * 0.5, bound.getCenterY() - scaleY * 0.5, scaleX, scaleY, bound.getCoordinateReferenceSystem());
             width = 1;
             height = 1;
         } else if (height == 0) {
-            bound = new Envelope2D(bound.getCoordinateReferenceSystem(), bound.getCenterX() - scaleX * 0.5, bound.getCenterY() - scaleY * 0.5, width, scaleY);
+            bound = ReferencedEnvelope.rect(bound.getCenterX() - scaleX * 0.5, bound.getCenterY() - scaleY * 0.5, width, scaleY, bound.getCoordinateReferenceSystem());
             height = 1;
         } else if (width == 0) {
-            bound = new Envelope2D(bound.getCoordinateReferenceSystem(), bound.getCenterX() - scaleX * 0.5, bound.getCenterY() - scaleY * 0.5, scaleX, height);
+            bound = ReferencedEnvelope.rect(bound.getCenterX() - scaleX * 0.5, bound.getCenterY() - scaleY * 0.5, scaleX, height, bound.getCoordinateReferenceSystem());
             width = 1;
         } else {
             // To preserve scale of reference raster
diff --git a/common/src/main/java/org/apache/sedona/common/raster/RasterConstructorsForTesting.java b/common/src/main/java/org/apache/sedona/common/raster/RasterConstructorsForTesting.java
index 47667b9b8..6890ee6db 100644
--- a/common/src/main/java/org/apache/sedona/common/raster/RasterConstructorsForTesting.java
+++ b/common/src/main/java/org/apache/sedona/common/raster/RasterConstructorsForTesting.java
@@ -24,9 +24,9 @@ import org.geotools.coverage.grid.GridEnvelope2D;
 import org.geotools.coverage.grid.GridGeometry2D;
 import org.geotools.referencing.crs.DefaultEngineeringCRS;
 import org.geotools.referencing.operation.transform.AffineTransform2D;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
-import org.opengis.referencing.datum.PixelInCell;
-import org.opengis.referencing.operation.MathTransform;
+import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
+import org.geotools.api.referencing.datum.PixelInCell;
+import org.geotools.api.referencing.operation.MathTransform;
 
 import javax.media.jai.RasterFactory;
 import java.awt.Transparency;
diff --git a/common/src/main/java/org/apache/sedona/common/raster/RasterEditors.java b/common/src/main/java/org/apache/sedona/common/raster/RasterEditors.java
index 235ae8cbd..fa9cefd9c 100644
--- a/common/src/main/java/org/apache/sedona/common/raster/RasterEditors.java
+++ b/common/src/main/java/org/apache/sedona/common/raster/RasterEditors.java
@@ -28,19 +28,19 @@ import org.geotools.coverage.grid.GridCoverageFactory;
 import org.geotools.coverage.grid.GridEnvelope2D;
 import org.geotools.coverage.grid.GridGeometry2D;
 import org.geotools.coverage.processing.Operations;
-import org.geotools.geometry.Envelope2D;
+import org.geotools.geometry.jts.ReferencedEnvelope;
 import org.geotools.referencing.crs.DefaultEngineeringCRS;
 import org.geotools.referencing.operation.transform.AffineTransform2D;
 import org.locationtech.jts.index.strtree.STRtree;
-import org.opengis.coverage.grid.GridCoverage;
-import org.opengis.coverage.grid.GridGeometry;
-import org.opengis.metadata.spatial.PixelOrientation;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
-import org.opengis.referencing.datum.PixelInCell;
-import org.opengis.referencing.operation.MathTransform;
-import org.opengis.referencing.operation.MathTransform2D;
-import org.opengis.referencing.operation.TransformException;
+import org.geotools.api.coverage.grid.GridCoverage;
+import org.geotools.api.coverage.grid.GridGeometry;
+import org.geotools.api.metadata.spatial.PixelOrientation;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
+import org.geotools.api.referencing.datum.PixelInCell;
+import org.geotools.api.referencing.operation.MathTransform;
+import org.geotools.api.referencing.operation.MathTransform2D;
+import org.geotools.api.referencing.operation.TransformException;
 
 import javax.media.jai.Interpolation;
 import javax.media.jai.RasterFactory;
@@ -178,7 +178,7 @@ public class RasterEditors
         }
 
 
-        Envelope2D envelope2D = raster.getEnvelope2D();
+        ReferencedEnvelope envelope2D = raster.getEnvelope2D();
         //process scale changes due to changes in widthOrScale and heightOrScale
         if (!useScale) {
             newScaleX = (Math.abs(envelope2D.getMaxX() - envelope2D.getMinX())) / newWidth;
diff --git a/common/src/main/java/org/apache/sedona/common/raster/RasterOutputs.java b/common/src/main/java/org/apache/sedona/common/raster/RasterOutputs.java
index ed585a015..42333d25c 100644
--- a/common/src/main/java/org/apache/sedona/common/raster/RasterOutputs.java
+++ b/common/src/main/java/org/apache/sedona/common/raster/RasterOutputs.java
@@ -25,9 +25,9 @@ import org.geotools.gce.arcgrid.ArcGridWriteParams;
 import org.geotools.gce.arcgrid.ArcGridWriter;
 import org.geotools.gce.geotiff.GeoTiffWriteParams;
 import org.geotools.gce.geotiff.GeoTiffWriter;
-import org.opengis.coverage.grid.GridCoverageWriter;
-import org.opengis.parameter.GeneralParameterValue;
-import org.opengis.parameter.ParameterValueGroup;
+import org.geotools.api.coverage.grid.GridCoverageWriter;
+import org.geotools.api.parameter.GeneralParameterValue;
+import org.geotools.api.parameter.ParameterValueGroup;
 
 import javax.imageio.ImageIO;
 import javax.imageio.ImageWriteParam;
diff --git a/common/src/main/java/org/apache/sedona/common/raster/RasterPredicates.java b/common/src/main/java/org/apache/sedona/common/raster/RasterPredicates.java
index c45db0bb1..e330475cf 100644
--- a/common/src/main/java/org/apache/sedona/common/raster/RasterPredicates.java
+++ b/common/src/main/java/org/apache/sedona/common/raster/RasterPredicates.java
@@ -30,12 +30,12 @@ import org.geotools.referencing.CRS;
 import org.geotools.referencing.crs.DefaultEngineeringCRS;
 import org.geotools.referencing.crs.DefaultGeographicCRS;
 import org.locationtech.jts.geom.Geometry;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.ReferenceIdentifier;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
-import org.opengis.referencing.crs.GeographicCRS;
-import org.opengis.referencing.operation.MathTransform;
-import org.opengis.referencing.operation.TransformException;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.ReferenceIdentifier;
+import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
+import org.geotools.api.referencing.crs.GeographicCRS;
+import org.geotools.api.referencing.operation.MathTransform;
+import org.geotools.api.referencing.operation.TransformException;
 
 public class RasterPredicates {
     /**
diff --git a/common/src/main/java/org/apache/sedona/common/raster/netcdf/NetCdfReader.java b/common/src/main/java/org/apache/sedona/common/raster/netcdf/NetCdfReader.java
index ad8f42370..032aa5193 100644
--- a/common/src/main/java/org/apache/sedona/common/raster/netcdf/NetCdfReader.java
+++ b/common/src/main/java/org/apache/sedona/common/raster/netcdf/NetCdfReader.java
@@ -21,8 +21,8 @@ package org.apache.sedona.common.raster.netcdf;
 import com.google.common.collect.ImmutableList;
 import org.apache.sedona.common.raster.RasterConstructors;
 import org.geotools.coverage.grid.GridCoverage2D;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.datum.PixelInCell;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.datum.PixelInCell;
 import ucar.ma2.Array;
 import ucar.nc2.*;
 
diff --git a/common/src/main/java/org/apache/sedona/common/raster/serde/CRSSerializer.java b/common/src/main/java/org/apache/sedona/common/raster/serde/CRSSerializer.java
index 9c427e34f..7e3c9fdfd 100644
--- a/common/src/main/java/org/apache/sedona/common/raster/serde/CRSSerializer.java
+++ b/common/src/main/java/org/apache/sedona/common/raster/serde/CRSSerializer.java
@@ -23,8 +23,8 @@ import com.github.benmanes.caffeine.cache.LoadingCache;
 import org.apache.commons.io.IOUtils;
 import org.geotools.referencing.CRS;
 import org.geotools.referencing.wkt.Formattable;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
 import si.uom.NonSI;
 import si.uom.SI;
 
diff --git a/common/src/main/java/org/apache/sedona/common/raster/serde/Serde.java b/common/src/main/java/org/apache/sedona/common/raster/serde/Serde.java
index 848c00b3f..e775ee46a 100644
--- a/common/src/main/java/org/apache/sedona/common/raster/serde/Serde.java
+++ b/common/src/main/java/org/apache/sedona/common/raster/serde/Serde.java
@@ -28,7 +28,7 @@ import org.geotools.coverage.grid.GridEnvelope2D;
 import org.geotools.coverage.grid.GridGeometry2D;
 import org.geotools.referencing.operation.transform.AffineTransform2D;
 import org.objenesis.strategy.StdInstantiatorStrategy;
-import org.opengis.referencing.operation.MathTransform;
+import org.geotools.api.referencing.operation.MathTransform;
 
 import javax.media.jai.RenderedImageAdapter;
 import java.awt.image.RenderedImage;
diff --git a/common/src/main/java/org/apache/sedona/common/utils/CachedCRSTransformFinder.java b/common/src/main/java/org/apache/sedona/common/utils/CachedCRSTransformFinder.java
index 7d0cd1117..c3305733a 100644
--- a/common/src/main/java/org/apache/sedona/common/utils/CachedCRSTransformFinder.java
+++ b/common/src/main/java/org/apache/sedona/common/utils/CachedCRSTransformFinder.java
@@ -21,9 +21,9 @@ package org.apache.sedona.common.utils;
 import com.github.benmanes.caffeine.cache.Caffeine;
 import com.github.benmanes.caffeine.cache.LoadingCache;
 import org.geotools.referencing.CRS;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
-import org.opengis.referencing.operation.MathTransform;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
+import org.geotools.api.referencing.operation.MathTransform;
 
 /**
  * A utility class for finding CRS transforms. It avoids the expensive equals() call on CRS objects
diff --git a/common/src/main/java/org/apache/sedona/common/utils/RasterUtils.java b/common/src/main/java/org/apache/sedona/common/utils/RasterUtils.java
index e6e51495a..7cc6c5080 100644
--- a/common/src/main/java/org/apache/sedona/common/utils/RasterUtils.java
+++ b/common/src/main/java/org/apache/sedona/common/utils/RasterUtils.java
@@ -34,20 +34,19 @@ import org.geotools.coverage.grid.GridCoverage2D;
 import org.geotools.coverage.grid.GridCoverageFactory;
 import org.geotools.coverage.grid.GridEnvelope2D;
 import org.geotools.coverage.grid.GridGeometry2D;
-import org.geotools.geometry.DirectPosition2D;
+import org.geotools.geometry.Position2D;
 import org.geotools.referencing.crs.DefaultEngineeringCRS;
 import org.geotools.referencing.operation.transform.AffineTransform2D;
 import org.geotools.util.ClassChanger;
 import org.geotools.util.NumberRange;
 import org.locationtech.jts.geom.Geometry;
-import org.opengis.coverage.grid.GridEnvelope;
-import org.opengis.geometry.DirectPosition;
-import org.opengis.metadata.spatial.PixelOrientation;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
-import org.opengis.referencing.operation.MathTransform;
-import org.opengis.referencing.operation.TransformException;
-import org.opengis.util.InternationalString;
+import org.geotools.api.coverage.grid.GridEnvelope;
+import org.geotools.api.metadata.spatial.PixelOrientation;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
+import org.geotools.api.referencing.operation.MathTransform;
+import org.geotools.api.referencing.operation.TransformException;
+import org.geotools.api.util.InternationalString;
 
 import javax.media.jai.RasterFactory;
 import javax.media.jai.RenderedImageAdapter;
@@ -418,9 +417,9 @@ public class RasterUtils {
         return raster.getGridGeometry().getGridToCRS2D(PixelOrientation.UPPER_LEFT).transform(gridCoordinates2D, null);
     }
     public static int[] getGridCoordinatesFromWorld(GridCoverage2D raster, double longitude, double latitude) throws TransformException {
-        DirectPosition2D directPosition2D = new DirectPosition2D(raster.getCoordinateReferenceSystem2D(), longitude, latitude);
-        DirectPosition worldCoord = raster.getGridGeometry().getCRSToGrid2D(PixelOrientation.UPPER_LEFT).transform((DirectPosition) directPosition2D, null);
-        double[] coords = worldCoord.getCoordinate();
+        Point2D directPosition2D = new Position2D(raster.getCoordinateReferenceSystem2D(), longitude, latitude);
+        Point2D worldCoord = raster.getGridGeometry().getCRSToGrid2D(PixelOrientation.UPPER_LEFT).transform(directPosition2D, null);
+        double[] coords = new double[] {worldCoord.getX(), worldCoord.getY()};
         int[] gridCoords = new int[] {(int) Math.floor(coords[0]), (int) Math.floor(coords[1])};
         return gridCoords;
     }
diff --git a/common/src/test/java/org/apache/sedona/common/FunctionsTest.java b/common/src/test/java/org/apache/sedona/common/FunctionsTest.java
index 701a24594..1512bb0b4 100644
--- a/common/src/test/java/org/apache/sedona/common/FunctionsTest.java
+++ b/common/src/test/java/org/apache/sedona/common/FunctionsTest.java
@@ -27,8 +27,8 @@ import org.locationtech.jts.geom.*;
 import org.locationtech.jts.io.ParseException;
 import org.locationtech.jts.io.WKTReader;
 import org.locationtech.jts.io.WKTWriter;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
 
 import java.util.*;
 import java.util.stream.Collectors;
diff --git a/common/src/test/java/org/apache/sedona/common/raster/FunctionEditorsTest.java b/common/src/test/java/org/apache/sedona/common/raster/FunctionEditorsTest.java
index b324e54eb..0e50749e5 100644
--- a/common/src/test/java/org/apache/sedona/common/raster/FunctionEditorsTest.java
+++ b/common/src/test/java/org/apache/sedona/common/raster/FunctionEditorsTest.java
@@ -26,8 +26,8 @@ import org.geotools.coverage.grid.GridCoverage2D;
 import org.junit.Test;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.io.ParseException;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
 
 import java.io.IOException;
 import java.util.Arrays;
diff --git a/common/src/test/java/org/apache/sedona/common/raster/FunctionsTest.java b/common/src/test/java/org/apache/sedona/common/raster/FunctionsTest.java
index 2bf3d491b..7327d614f 100644
--- a/common/src/test/java/org/apache/sedona/common/raster/FunctionsTest.java
+++ b/common/src/test/java/org/apache/sedona/common/raster/FunctionsTest.java
@@ -26,8 +26,8 @@ import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.GeometryFactory;
 import org.locationtech.jts.geom.Point;
 import org.locationtech.jts.io.ParseException;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
 
 import java.io.IOException;
 import java.util.ArrayList;
diff --git a/common/src/test/java/org/apache/sedona/common/raster/GeometryFunctionsTest.java b/common/src/test/java/org/apache/sedona/common/raster/GeometryFunctionsTest.java
index a01fb5a88..703050c84 100644
--- a/common/src/test/java/org/apache/sedona/common/raster/GeometryFunctionsTest.java
+++ b/common/src/test/java/org/apache/sedona/common/raster/GeometryFunctionsTest.java
@@ -24,8 +24,8 @@ import org.junit.Test;
 import org.locationtech.jts.geom.Coordinate;
 import org.locationtech.jts.geom.Envelope;
 import org.locationtech.jts.geom.Geometry;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
 
 import java.io.IOException;
 
diff --git a/common/src/test/java/org/apache/sedona/common/raster/MapAlgebraTest.java b/common/src/test/java/org/apache/sedona/common/raster/MapAlgebraTest.java
index 7bf17044c..79acf3af6 100644
--- a/common/src/test/java/org/apache/sedona/common/raster/MapAlgebraTest.java
+++ b/common/src/test/java/org/apache/sedona/common/raster/MapAlgebraTest.java
@@ -22,7 +22,7 @@ import org.apache.sedona.common.utils.RasterUtils;
 import org.geotools.coverage.grid.GridCoverage2D;
 import org.junit.Assert;
 import org.junit.Test;
-import org.opengis.referencing.FactoryException;
+import org.geotools.api.referencing.FactoryException;
 
 import java.awt.image.DataBuffer;
 import java.util.Random;
diff --git a/common/src/test/java/org/apache/sedona/common/raster/RasterAccessorsTest.java b/common/src/test/java/org/apache/sedona/common/raster/RasterAccessorsTest.java
index d8f52fca8..143d1d88a 100644
--- a/common/src/test/java/org/apache/sedona/common/raster/RasterAccessorsTest.java
+++ b/common/src/test/java/org/apache/sedona/common/raster/RasterAccessorsTest.java
@@ -26,8 +26,8 @@ import org.geotools.referencing.CRS;
 import org.geotools.referencing.operation.transform.AffineTransform2D;
 import org.junit.Test;
 import org.locationtech.jts.geom.*;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
 
 import java.io.IOException;
 
diff --git a/common/src/test/java/org/apache/sedona/common/raster/RasterBandAccessorsTest.java b/common/src/test/java/org/apache/sedona/common/raster/RasterBandAccessorsTest.java
index 306aed86f..5514ac890 100644
--- a/common/src/test/java/org/apache/sedona/common/raster/RasterBandAccessorsTest.java
+++ b/common/src/test/java/org/apache/sedona/common/raster/RasterBandAccessorsTest.java
@@ -24,8 +24,8 @@ import org.geotools.coverage.grid.GridCoverage2D;
 import org.junit.Test;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.io.ParseException;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
 
 import java.io.IOException;
 import java.util.Arrays;
diff --git a/common/src/test/java/org/apache/sedona/common/raster/RasterBandEditorsTest.java b/common/src/test/java/org/apache/sedona/common/raster/RasterBandEditorsTest.java
index 19b932ad7..0d8d147f3 100644
--- a/common/src/test/java/org/apache/sedona/common/raster/RasterBandEditorsTest.java
+++ b/common/src/test/java/org/apache/sedona/common/raster/RasterBandEditorsTest.java
@@ -24,8 +24,8 @@ import org.geotools.coverage.grid.GridCoverage2D;
 import org.junit.Test;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.io.ParseException;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
 
 import java.io.IOException;
 import java.text.DecimalFormat;
diff --git a/common/src/test/java/org/apache/sedona/common/raster/RasterConstructorsTest.java b/common/src/test/java/org/apache/sedona/common/raster/RasterConstructorsTest.java
index 56427f567..80afd7860 100644
--- a/common/src/test/java/org/apache/sedona/common/raster/RasterConstructorsTest.java
+++ b/common/src/test/java/org/apache/sedona/common/raster/RasterConstructorsTest.java
@@ -16,16 +16,16 @@ package org.apache.sedona.common.raster;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.sedona.common.Constructors;
 import org.apache.sedona.common.utils.RasterUtils;
+import org.geotools.api.geometry.Position;
 import org.geotools.coverage.grid.GridCoordinates2D;
 import org.geotools.coverage.grid.GridCoverage2D;
 import org.junit.Assert;
 import org.junit.Test;
 import org.locationtech.jts.geom.Geometry;
-import org.opengis.coverage.SampleDimensionType;
-import org.opengis.geometry.DirectPosition;
+import org.geotools.api.coverage.SampleDimensionType;
 import org.locationtech.jts.io.ParseException;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
 
 import java.awt.image.DataBuffer;
 import java.awt.image.Raster;
@@ -415,8 +415,8 @@ public class RasterConstructorsTest
                     // Check that the pixel at the point translates to the same world coordinate as the corresponding
                     // pixel in the grid coverage
                     try {
-                        DirectPosition actualWorldCoord = tileRaster.getGridGeometry().gridToWorld(tileGridCoord);
-                        DirectPosition expectedWorldCoord = gridCoverage2D.getGridGeometry().gridToWorld(gridCoord);
+                        Position actualWorldCoord = tileRaster.getGridGeometry().gridToWorld(tileGridCoord);
+                        Position expectedWorldCoord = gridCoverage2D.getGridGeometry().gridToWorld(gridCoord);
                         Assert.assertEquals(expectedWorldCoord, actualWorldCoord);
                     } catch (TransformException e) {
                         throw new RuntimeException(e);
diff --git a/common/src/test/java/org/apache/sedona/common/raster/RasterEditorsTest.java b/common/src/test/java/org/apache/sedona/common/raster/RasterEditorsTest.java
index 0b811ba88..07af75b28 100644
--- a/common/src/test/java/org/apache/sedona/common/raster/RasterEditorsTest.java
+++ b/common/src/test/java/org/apache/sedona/common/raster/RasterEditorsTest.java
@@ -19,20 +19,20 @@
 package org.apache.sedona.common.raster;
 
 import org.apache.sedona.common.utils.RasterUtils;
+import org.geotools.api.geometry.Bounds;
+import org.geotools.api.geometry.Position;
 import org.geotools.coverage.grid.GridCoordinates2D;
 import org.geotools.coverage.grid.GridCoverage2D;
 import org.geotools.coverage.grid.GridEnvelope2D;
-import org.geotools.geometry.DirectPosition2D;
+import org.geotools.geometry.Position2D;
 import org.geotools.referencing.CRS;
 import org.geotools.referencing.operation.transform.AffineTransform2D;
 import org.junit.Assert;
 import org.junit.Test;
-import org.opengis.geometry.DirectPosition;
-import org.opengis.geometry.Envelope;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
-import org.opengis.referencing.operation.MathTransform;
-import org.opengis.referencing.operation.TransformException;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
+import org.geotools.api.referencing.operation.MathTransform;
+import org.geotools.api.referencing.operation.TransformException;
 
 import java.awt.image.DataBuffer;
 import java.io.IOException;
@@ -698,8 +698,8 @@ public class RasterEditorsTest extends RasterTestBase {
     private void verifyReprojectMatchResult(GridCoverage2D source, GridCoverage2D target, GridCoverage2D transformed)
             throws TransformException, FactoryException {
         // Check the envelope and CRS
-        Envelope expectedEnvelope = target.getEnvelope();
-        Envelope actualEnvelope = transformed.getEnvelope();
+        Bounds expectedEnvelope = target.getEnvelope();
+        Bounds actualEnvelope = transformed.getEnvelope();
         assertSameEnvelope(expectedEnvelope, actualEnvelope, 1e-6);
         CoordinateReferenceSystem expectedCrs = target.getCoordinateReferenceSystem();
         CoordinateReferenceSystem actualCrs = transformed.getCoordinateReferenceSystem();
@@ -726,11 +726,11 @@ public class RasterEditorsTest extends RasterTestBase {
         for (double worldY = ipY; worldY > expectedEnvelope.getMinimum(1); worldY += scaleY) {
             for (double worldX = ipX; worldX < expectedEnvelope.getMaximum(0); worldX += scaleX) {
                 // Fetch the pixel values from the transformed raster
-                DirectPosition worldPos = new DirectPosition2D(worldX, worldY);
+                Position worldPos = new Position2D(worldX, worldY);
                 transformed.evaluate(worldPos, values);
 
                 // Find the corresponding grid coordinates on the source raster
-                DirectPosition srcWorldPos = crsTrans.transform(worldPos, null);
+                Position srcWorldPos = crsTrans.transform(worldPos, null);
                 GridCoordinates2D sourceGridPos = source.getGridGeometry().worldToGrid(srcWorldPos);
                 GridEnvelope2D sourceGridRange = source.getGridGeometry().getGridRange2D();
 
diff --git a/common/src/test/java/org/apache/sedona/common/raster/RasterOutputTest.java b/common/src/test/java/org/apache/sedona/common/raster/RasterOutputTest.java
index dded35ca5..d75cd7576 100644
--- a/common/src/test/java/org/apache/sedona/common/raster/RasterOutputTest.java
+++ b/common/src/test/java/org/apache/sedona/common/raster/RasterOutputTest.java
@@ -21,7 +21,7 @@ package org.apache.sedona.common.raster;
 import org.apache.sedona.common.utils.RasterUtils;
 import org.geotools.coverage.grid.GridCoverage2D;
 import org.junit.Test;
-import org.opengis.referencing.FactoryException;
+import org.geotools.api.referencing.FactoryException;
 
 import javax.imageio.ImageIO;
 import java.io.File;
diff --git a/common/src/test/java/org/apache/sedona/common/raster/RasterPredicatesTest.java b/common/src/test/java/org/apache/sedona/common/raster/RasterPredicatesTest.java
index 05d9605b9..c9c535985 100644
--- a/common/src/test/java/org/apache/sedona/common/raster/RasterPredicatesTest.java
+++ b/common/src/test/java/org/apache/sedona/common/raster/RasterPredicatesTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.sedona.common.raster;
 
+import org.geotools.api.geometry.BoundingBox;
 import org.geotools.coverage.grid.GridCoverage2D;
 import org.geotools.geometry.jts.JTS;
 import org.geotools.referencing.CRS;
@@ -30,10 +31,9 @@ import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.GeometryFactory;
 import org.locationtech.jts.geom.PrecisionModel;
 import org.locationtech.jts.io.ParseException;
-import org.opengis.geometry.BoundingBox;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
-import org.opengis.referencing.operation.TransformException;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
+import org.geotools.api.referencing.operation.TransformException;
 
 import java.awt.image.DataBuffer;
 import java.io.IOException;
diff --git a/common/src/test/java/org/apache/sedona/common/raster/RasterTestBase.java b/common/src/test/java/org/apache/sedona/common/raster/RasterTestBase.java
index d531c77f6..b2b512f80 100644
--- a/common/src/test/java/org/apache/sedona/common/raster/RasterTestBase.java
+++ b/common/src/test/java/org/apache/sedona/common/raster/RasterTestBase.java
@@ -13,24 +13,25 @@
  */
 package org.apache.sedona.common.raster;
 
+ import org.geotools.api.geometry.Bounds;
+ import org.geotools.api.geometry.Position;
  import org.geotools.coverage.grid.GridCoordinates2D;
 import org.geotools.coverage.grid.GridCoverage2D;
 import org.geotools.coverage.grid.GridCoverageFactory;
 import org.geotools.gce.geotiff.GeoTiffReader;
 import org.geotools.gce.geotiff.GeoTiffWriter;
-import org.geotools.geometry.DirectPosition2D;
-import org.geotools.geometry.Envelope2D;
-import org.geotools.geometry.jts.ReferencedEnvelope;
+
+ import org.geotools.geometry.Position2D;
+ import org.geotools.geometry.jts.ReferencedEnvelope;
 import org.geotools.referencing.CRS;
 import org.geotools.referencing.crs.DefaultGeographicCRS;
 import org.junit.Assert;
 import org.junit.Before;
-import org.opengis.geometry.DirectPosition;
-import org.opengis.geometry.Envelope;
-import org.opengis.parameter.GeneralParameterValue;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
-import org.opengis.referencing.operation.TransformException;
+
+import org.geotools.api.parameter.GeneralParameterValue;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
+import org.geotools.api.referencing.operation.TransformException;
 
 import javax.media.jai.RasterFactory;
 import java.awt.*;
@@ -118,7 +119,7 @@ public class RasterTestBase {
                 image.setRGB(i, j, new Color(color, color, color).getRGB());
             }
         }
-        return factory.create("test", image, new Envelope2D(DefaultGeographicCRS.WGS84, 0, 0, 10, 10));
+        return factory.create("test", image, ReferencedEnvelope.rect(0, 0, 10, 10, DefaultGeographicCRS.WGS84));
     }
 
     protected void assertSameCoverage(GridCoverage2D expected, GridCoverage2D actual) {
@@ -127,8 +128,8 @@ public class RasterTestBase {
 
     protected void assertSameCoverage(GridCoverage2D expected, GridCoverage2D actual, int density) {
         Assert.assertEquals(expected.getNumSampleDimensions(), actual.getNumSampleDimensions());
-        Envelope expectedEnvelope = expected.getEnvelope();
-        Envelope actualEnvelope = actual.getEnvelope();
+        Bounds expectedEnvelope = expected.getEnvelope();
+        Bounds actualEnvelope = actual.getEnvelope();
         assertSameEnvelope(expectedEnvelope, actualEnvelope, 1e-6);
         CoordinateReferenceSystem expectedCrs = expected.getCoordinateReferenceSystem();
         CoordinateReferenceSystem actualCrs = actual.getCoordinateReferenceSystem();
@@ -136,7 +137,7 @@ public class RasterTestBase {
         assertSameValues(expected, actual, density);
     }
 
-    protected void assertSameEnvelope(Envelope expected, Envelope actual, double epsilon) {
+    protected void assertSameEnvelope(Bounds expected, Bounds actual, double epsilon) {
         Assert.assertEquals(expected.getMinimum(0), actual.getMinimum(0), epsilon);
         Assert.assertEquals(expected.getMinimum(1), actual.getMinimum(1), epsilon);
         Assert.assertEquals(expected.getMaximum(0), actual.getMaximum(0), epsilon);
@@ -144,7 +145,7 @@ public class RasterTestBase {
     }
 
     protected void assertSameValues(GridCoverage2D expected, GridCoverage2D actual, int density) {
-        Envelope expectedEnvelope = expected.getEnvelope();
+        Bounds expectedEnvelope = expected.getEnvelope();
         double x0 = expectedEnvelope.getMinimum(0);
         double y0 = expectedEnvelope.getMinimum(1);
         double xStep = (expectedEnvelope.getMaximum(0) - x0) / density;
@@ -156,7 +157,7 @@ public class RasterTestBase {
             for (int j = 0; j < density; j++) {
                 double x = x0 + j * xStep;
                 double y = y0 + i * yStep;
-                DirectPosition position = new DirectPosition2D(x, y);
+                Position position = new Position2D(x, y);
                 try {
                     GridCoordinates2D gridPosition = expected.getGridGeometry().worldToGrid(position);
                     if (Double.isNaN(gridPosition.getX()) || Double.isNaN(gridPosition.getY())) {
diff --git a/common/src/test/java/org/apache/sedona/common/raster/serde/CRSSerializerTest.java b/common/src/test/java/org/apache/sedona/common/raster/serde/CRSSerializerTest.java
index bb5399fd0..8603deea1 100644
--- a/common/src/test/java/org/apache/sedona/common/raster/serde/CRSSerializerTest.java
+++ b/common/src/test/java/org/apache/sedona/common/raster/serde/CRSSerializerTest.java
@@ -21,8 +21,8 @@ package org.apache.sedona.common.raster.serde;
 import org.geotools.referencing.CRS;
 import org.junit.Assert;
 import org.junit.Test;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
 
 public class CRSSerializerTest {
     @Test
diff --git a/common/src/test/java/org/apache/sedona/common/raster/serde/SerdeTest.java b/common/src/test/java/org/apache/sedona/common/raster/serde/SerdeTest.java
index 844c3d34f..3535775b7 100644
--- a/common/src/test/java/org/apache/sedona/common/raster/serde/SerdeTest.java
+++ b/common/src/test/java/org/apache/sedona/common/raster/serde/SerdeTest.java
@@ -23,7 +23,7 @@ import org.apache.sedona.common.raster.RasterTestBase;
 import org.geotools.coverage.grid.GridCoverage2D;
 import org.geotools.gce.geotiff.GeoTiffReader;
 import org.junit.Test;
-import org.opengis.referencing.FactoryException;
+import org.geotools.api.referencing.FactoryException;
 
 import java.io.File;
 import java.io.IOException;
diff --git a/flink/src/main/java/org/apache/sedona/flink/expressions/Functions.java b/flink/src/main/java/org/apache/sedona/flink/expressions/Functions.java
index 013fb7241..fe34c38ea 100644
--- a/flink/src/main/java/org/apache/sedona/flink/expressions/Functions.java
+++ b/flink/src/main/java/org/apache/sedona/flink/expressions/Functions.java
@@ -13,7 +13,6 @@
  */
 package org.apache.sedona.flink.expressions;
 
-import org.apache.calcite.runtime.Geometries;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.flink.table.annotation.DataTypeHint;
 import org.apache.flink.table.annotation.InputGroup;
@@ -21,8 +20,6 @@ import org.apache.flink.table.functions.ScalarFunction;
 import org.apache.sedona.common.FunctionsGeoTools;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.operation.buffer.BufferParameters;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
 
 import java.util.Arrays;
 
@@ -72,21 +69,21 @@ public class Functions {
     public static class ST_Buffer extends ScalarFunction {
         @DataTypeHint(value = "RAW", bridgedTo = org.locationtech.jts.geom.Geometry.class)
         public Geometry eval(@DataTypeHint(value = "RAW", bridgedTo = org.locationtech.jts.geom.Geometry.class)
-        Object o, @DataTypeHint("Double") Double radius) throws FactoryException, TransformException {
+        Object o, @DataTypeHint("Double") Double radius) {
             Geometry geom = (Geometry) o;
             return org.apache.sedona.common.Functions.buffer(geom, radius);
         }
 
         @DataTypeHint(value = "RAW", bridgedTo = org.locationtech.jts.geom.Geometry.class)
         public Geometry eval(@DataTypeHint(value = "RAW", bridgedTo = org.locationtech.jts.geom.Geometry.class)
-                             Object o, @DataTypeHint("Double") Double radius, @DataTypeHint("Boolean") Boolean useSpheroid) throws FactoryException, TransformException {
+                             Object o, @DataTypeHint("Double") Double radius, @DataTypeHint("Boolean") Boolean useSpheroid) {
             Geometry geom = (Geometry) o;
             return org.apache.sedona.common.Functions.buffer(geom, radius, useSpheroid);
         }
 
         @DataTypeHint(value = "RAW", bridgedTo = org.locationtech.jts.geom.Geometry.class)
         public Geometry eval(@DataTypeHint(value = "RAW", bridgedTo = org.locationtech.jts.geom.Geometry.class)
-                             Object o, @DataTypeHint("Double") Double radius, @DataTypeHint("Boolean") Boolean useSpheroid, @DataTypeHint("String") String params) throws FactoryException, TransformException {
+                             Object o, @DataTypeHint("Double") Double radius, @DataTypeHint("Boolean") Boolean useSpheroid, @DataTypeHint("String") String params) {
             Geometry geom = (Geometry) o;
             return org.apache.sedona.common.Functions.buffer(geom, radius, useSpheroid, params);
         }
diff --git a/flink/src/main/java/org/apache/sedona/flink/expressions/FunctionsGeoTools.java b/flink/src/main/java/org/apache/sedona/flink/expressions/FunctionsGeoTools.java
index 65054cf11..842ef42eb 100644
--- a/flink/src/main/java/org/apache/sedona/flink/expressions/FunctionsGeoTools.java
+++ b/flink/src/main/java/org/apache/sedona/flink/expressions/FunctionsGeoTools.java
@@ -15,8 +15,8 @@ package org.apache.sedona.flink.expressions;
 import org.apache.flink.table.annotation.DataTypeHint;
 import org.apache.flink.table.functions.ScalarFunction;
 import org.locationtech.jts.geom.Geometry;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
 
 
 public class FunctionsGeoTools {
diff --git a/flink/src/test/java/org/apache/sedona/flink/FunctionTest.java b/flink/src/test/java/org/apache/sedona/flink/FunctionTest.java
index 0306e5b52..daef6d9b1 100644
--- a/flink/src/test/java/org/apache/sedona/flink/FunctionTest.java
+++ b/flink/src/test/java/org/apache/sedona/flink/FunctionTest.java
@@ -27,8 +27,8 @@ import org.junit.Test;
 import org.locationtech.jts.geom.*;
 import org.locationtech.jts.io.ParseException;
 import org.locationtech.jts.operation.buffer.BufferParameters;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
 import scala.collection.immutable.Stream;
 
 import java.util.Arrays;
diff --git a/pom.xml b/pom.xml
index d4f4265c0..6ecc8eefe 100644
--- a/pom.xml
+++ b/pom.xml
@@ -68,7 +68,7 @@
         <maven.compiler.plugin.version>3.10.1</maven.compiler.plugin.version>
 
         <cdm.version>5.4.2</cdm.version>
-        <geotools.version>28.2</geotools.version>
+        <geotools.version>31.0</geotools.version>
         <hadoop.version>3.2.4</hadoop.version>
         <jackson.version>2.13.4</jackson.version>
         <jts.version>1.19.0</jts.version>
diff --git a/snowflake/src/main/java/org/apache/sedona/snowflake/snowsql/GeoToolsWrapper.java b/snowflake/src/main/java/org/apache/sedona/snowflake/snowsql/GeoToolsWrapper.java
index ef96ab05a..9f53fce7b 100644
--- a/snowflake/src/main/java/org/apache/sedona/snowflake/snowsql/GeoToolsWrapper.java
+++ b/snowflake/src/main/java/org/apache/sedona/snowflake/snowsql/GeoToolsWrapper.java
@@ -15,8 +15,8 @@ package org.apache.sedona.snowflake.snowsql;
 
 import org.apache.sedona.common.FunctionsGeoTools;
 import org.locationtech.jts.geom.Geometry;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
 
 public class GeoToolsWrapper {
     public static Geometry transform(Geometry geometry, String sourceCRS, String targetCRS, boolean lenient) {
diff --git a/spark/common/src/main/java/org/apache/sedona/core/spatialOperator/KNNQuery.java b/spark/common/src/main/java/org/apache/sedona/core/spatialOperator/KNNQuery.java
index 71bf27756..775c477b0 100644
--- a/spark/common/src/main/java/org/apache/sedona/core/spatialOperator/KNNQuery.java
+++ b/spark/common/src/main/java/org/apache/sedona/core/spatialOperator/KNNQuery.java
@@ -26,8 +26,8 @@ import org.apache.sedona.core.knnJudgement.KnnJudgementUsingIndex;
 import org.apache.sedona.core.spatialRDD.SpatialRDD;
 import org.apache.spark.api.java.JavaRDD;
 import org.locationtech.jts.geom.Geometry;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
 
 import java.io.Serializable;
 import java.util.List;
diff --git a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/strategy/join/JoinedGeometryRaster.scala b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/strategy/join/JoinedGeometryRaster.scala
index a3fd7d3c4..03d6fd617 100644
--- a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/strategy/join/JoinedGeometryRaster.scala
+++ b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/strategy/join/JoinedGeometryRaster.scala
@@ -20,14 +20,13 @@ package org.apache.spark.sql.sedona_sql.strategy.join
 
 import org.apache.sedona.common.FunctionsGeoTools
 import org.apache.sedona.common.utils.{CachedCRSTransformFinder, GeomUtils}
+import org.geotools.api.geometry.{BoundingBox, Bounds}
 import org.geotools.coverage.grid.GridCoverage2D
-import org.geotools.geometry.Envelope2D
-import org.geotools.geometry.jts.JTS
+import org.geotools.geometry.jts.{JTS, ReferencedEnvelope}
 import org.geotools.referencing.CRS
 import org.geotools.referencing.crs.{DefaultEngineeringCRS, DefaultGeographicCRS}
 import org.locationtech.jts.geom.{Envelope, Geometry}
-import org.opengis.geometry.BoundingBox
-import org.opengis.referencing.crs.{CoordinateReferenceSystem, GeographicCRS}
+import org.geotools.api.referencing.crs.{CoordinateReferenceSystem, GeographicCRS}
 
 object JoinedGeometryRaster {
   /**
@@ -58,13 +57,13 @@ object JoinedGeometryRaster {
       geom
     } else {
       val env = geom.getEnvelopeInternal
-      val envelope = new Envelope2D(null, env.getMinX, env.getMinY, env.getWidth, env.getHeight)
+      val envelope = ReferencedEnvelope.rect(env.getMinX, env.getMinY, env.getWidth, env.getHeight, null)
       val crs = FunctionsGeoTools.sridToCRS(srid)
       transformToWGS84Envelope(envelope, crs)
     }
   }
 
-  private def transformToWGS84Envelope(envelope: org.opengis.geometry.Envelope, crs: CoordinateReferenceSystem): Geometry = {
+  private def transformToWGS84Envelope(envelope: Bounds, crs: CoordinateReferenceSystem): Geometry = {
     // We use CRS.transform for envelopes to transform envelopes between different CRSs. This transformation function
     // could handle envelope crossing the anti-meridian and envelope near or covering poles correctly. We won't have
     // these cases properly handled if we transform the original geometries using JTS.transform.
diff --git a/spark/common/src/test/java/org/apache/sedona/core/formatMapper/shapefileParser/shapes/ShapefileRDDTest.java b/spark/common/src/test/java/org/apache/sedona/core/formatMapper/shapefileParser/shapes/ShapefileRDDTest.java
index 2c2d4b7ca..52a626707 100644
--- a/spark/common/src/test/java/org/apache/sedona/core/formatMapper/shapefileParser/shapes/ShapefileRDDTest.java
+++ b/spark/common/src/test/java/org/apache/sedona/core/formatMapper/shapefileParser/shapes/ShapefileRDDTest.java
@@ -29,9 +29,9 @@ import org.apache.sedona.core.spatialRDD.PointRDD;
 import org.apache.sedona.core.spatialRDD.PolygonRDD;
 import org.apache.spark.SparkConf;
 import org.apache.spark.api.java.JavaSparkContext;
-import org.geotools.data.DataStore;
-import org.geotools.data.DataStoreFinder;
-import org.geotools.data.FeatureSource;
+import org.geotools.api.data.DataStore;
+import org.geotools.api.data.DataStoreFinder;
+import org.geotools.api.data.FeatureSource;
 import org.geotools.data.shapefile.files.ShpFiles;
 import org.geotools.data.shapefile.shp.ShapefileReader;
 import org.geotools.feature.FeatureCollection;
@@ -44,9 +44,9 @@ import org.locationtech.jts.geom.Envelope;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.GeometryFactory;
 import org.locationtech.jts.geom.MultiPolygon;
-import org.opengis.feature.simple.SimpleFeature;
-import org.opengis.feature.simple.SimpleFeatureType;
-import org.opengis.filter.Filter;
+import org.geotools.api.feature.simple.SimpleFeature;
+import org.geotools.api.feature.simple.SimpleFeatureType;
+import org.geotools.api.filter.Filter;
 
 import java.io.File;
 import java.io.IOException;
diff --git a/spark/common/src/test/java/org/apache/sedona/core/formatMapper/shapefileParser/shapes/ShapefileReaderTest.java b/spark/common/src/test/java/org/apache/sedona/core/formatMapper/shapefileParser/shapes/ShapefileReaderTest.java
index 65d145ed5..545545a03 100644
--- a/spark/common/src/test/java/org/apache/sedona/core/formatMapper/shapefileParser/shapes/ShapefileReaderTest.java
+++ b/spark/common/src/test/java/org/apache/sedona/core/formatMapper/shapefileParser/shapes/ShapefileReaderTest.java
@@ -37,9 +37,9 @@ import org.apache.sedona.core.spatialRDD.PointRDD;
 import org.apache.sedona.core.spatialRDD.PolygonRDD;
 import org.apache.sedona.core.spatialRDD.SpatialRDD;
 import org.apache.spark.SparkException;
-import org.geotools.data.DataStore;
-import org.geotools.data.DataStoreFinder;
-import org.geotools.data.FeatureSource;
+import org.geotools.api.data.DataStore;
+import org.geotools.api.data.DataStoreFinder;
+import org.geotools.api.data.FeatureSource;
 import org.geotools.data.shapefile.files.ShpFiles;
 import org.geotools.feature.FeatureCollection;
 import org.geotools.feature.FeatureIterator;
@@ -50,10 +50,10 @@ import org.locationtech.jts.geom.Envelope;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.GeometryFactory;
 import org.locationtech.jts.geom.MultiPolygon;
-import org.opengis.feature.Property;
-import org.opengis.feature.simple.SimpleFeature;
-import org.opengis.feature.simple.SimpleFeatureType;
-import org.opengis.filter.Filter;
+import org.geotools.api.feature.Property;
+import org.geotools.api.feature.simple.SimpleFeature;
+import org.geotools.api.feature.simple.SimpleFeatureType;
+import org.geotools.api.filter.Filter;
 
 import java.io.File;
 import java.io.IOException;
diff --git a/spark/common/src/test/scala/org/apache/sedona/sql/functionTestScala.scala b/spark/common/src/test/scala/org/apache/sedona/sql/functionTestScala.scala
index 3fee1e53c..f880b0700 100644
--- a/spark/common/src/test/scala/org/apache/sedona/sql/functionTestScala.scala
+++ b/spark/common/src/test/scala/org/apache/sedona/sql/functionTestScala.scala
@@ -32,7 +32,7 @@ import org.locationtech.jts.geom.{Coordinate, Geometry, GeometryFactory, Polygon
 import org.locationtech.jts.io.WKTWriter
 import org.locationtech.jts.linearref.LengthIndexedLine
 import org.locationtech.jts.operation.distance3d.Distance3DOp
-import org.opengis.referencing.FactoryException
+import org.geotools.api.referencing.FactoryException
 import org.scalatest.{GivenWhenThen, Matchers}
 import org.xml.sax.InputSource