This is an automated email from the ASF dual-hosted git repository.
jiayu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sedona.git
The following commit(s) were added to refs/heads/master by this push:
new 7a004efdce [GH-1973] Upgrade to GeoTools 33 (#1967)
7a004efdce is described below
commit 7a004efdce92740a04636b37703a21f2a3b82920
Author: jp <[email protected]>
AuthorDate: Thu Jun 5 13:14:35 2025 -0700
[GH-1973] Upgrade to GeoTools 33 (#1967)
* Upgrade to geotools33
* update geotools in examples
* ran spotless
* revert changes that are out of the main run
* Update workflows to use geotools 33
* Update .github/workflows/pyflink.yml
* Update examples/spark-sql/pom.xml
* Update .github/workflows/docker-build.yml
* update r workflow
* use the specialized 33.1-rc1 for the geotools wrapper workflow
---------
Co-authored-by: Jia Yu <[email protected]>
---
.github/workflows/docker-build.yml | 7 +--
.github/workflows/example.yml | 3 -
.github/workflows/pyflink.yml | 4 +-
.github/workflows/r.yml | 2 +-
.../apache/sedona/common/FunctionsGeoTools.java | 14 ++---
.../sedona/common/raster/GeometryFunctions.java | 8 +--
.../sedona/common/raster/PixelFunctionEditors.java | 4 +-
.../sedona/common/raster/PixelFunctions.java | 12 ++--
.../sedona/common/raster/RasterAccessors.java | 8 +--
.../sedona/common/raster/RasterBandAccessors.java | 2 +-
.../sedona/common/raster/RasterBandEditors.java | 12 ++--
.../sedona/common/raster/RasterConstructors.java | 14 ++---
.../raster/RasterConstructorsForTesting.java | 6 +-
.../apache/sedona/common/raster/RasterEditors.java | 22 ++++----
.../apache/sedona/common/raster/RasterOutputs.java | 6 +-
.../sedona/common/raster/RasterPredicates.java | 12 ++--
.../apache/sedona/common/raster/Rasterization.java | 40 ++++++-------
.../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 | 31 +++++-----
.../org/apache/sedona/common/FunctionsTest.java | 66 ++++++++++------------
.../sedona/common/raster/FunctionEditorsTest.java | 4 +-
.../apache/sedona/common/raster/FunctionsTest.java | 10 ++--
.../common/raster/GeometryFunctionsTest.java | 4 +-
.../sedona/common/raster/MapAlgebraTest.java | 2 +-
.../sedona/common/raster/RasterAccessorsTest.java | 4 +-
.../common/raster/RasterBandAccessorsTest.java | 2 +-
.../common/raster/RasterBandEditorsTest.java | 4 +-
.../common/raster/RasterConstructorsTest.java | 22 ++++----
.../sedona/common/raster/RasterEditorsTest.java | 24 ++++----
.../sedona/common/raster/RasterOutputTest.java | 2 +-
.../sedona/common/raster/RasterPredicatesTest.java | 8 +--
.../sedona/common/raster/RasterTestBase.java | 30 +++++-----
.../common/raster/serde/CRSSerializerTest.java | 4 +-
.../sedona/common/raster/serde/SerdeTest.java | 2 +-
.../apache/sedona/flink/expressions/Functions.java | 4 +-
.../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 +-
.../geopackage/model/TileMetadata.scala | 2 +-
.../datasources/geopackage/transform/Image.scala | 12 ++--
.../strategy/join/JoinedGeometryRaster.scala | 12 ++--
.../shapefileParser/shapes/ShapefileRDDTest.java | 12 ++--
.../shapes/ShapefileReaderTest.java | 14 ++---
.../org/apache/sedona/sql/functionTestScala.scala | 4 +-
.../org/apache/sedona/sql/rasteralgebraTest.scala | 6 +-
50 files changed, 237 insertions(+), 258 deletions(-)
diff --git a/.github/workflows/docker-build.yml
b/.github/workflows/docker-build.yml
index 2d083a918f..2fdeabdcc3 100644
--- a/.github/workflows/docker-build.yml
+++ b/.github/workflows/docker-build.yml
@@ -46,17 +46,14 @@ jobs:
fail-fast: true
matrix:
os: ['ubuntu-latest']
- spark: ['3.5.1', '3.4.3', '3.3.4']
+ spark: ['3.5.1', '3.4.3']
include:
- spark: 3.5.1
sedona: 'latest'
- geotools: 'auto'
+ geotools: '33.1-rc1'
- spark: 3.4.3
sedona: 1.6.0
geotools: 28.2
- - spark: 3.3.4
- sedona: 1.6.0
- geotools: 28.2
runs-on: ${{ matrix.os }}
defaults:
run:
diff --git a/.github/workflows/example.yml b/.github/workflows/example.yml
index 9b0f8e84a6..733d457cd7 100644
--- a/.github/workflows/example.yml
+++ b/.github/workflows/example.yml
@@ -50,9 +50,6 @@ jobs:
- spark: 3.4.2
spark-compat: '3.4'
sedona: 1.5.1
- - spark: 3.3.4
- spark-compat: '3.0'
- sedona: 1.5.1
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
diff --git a/.github/workflows/pyflink.yml b/.github/workflows/pyflink.yml
index d93e431544..572fec4051 100644
--- a/.github/workflows/pyflink.yml
+++ b/.github/workflows/pyflink.yml
@@ -71,6 +71,6 @@ jobs:
- run: uv add apache-flink==1.20.1 shapely attr setuptools
- run: uv add pytest --dev
- run: |
- wget
https://repo1.maven.org/maven2/org/datasyslab/geotools-wrapper/1.7.1-28.5/geotools-wrapper-1.7.1-28.5.jar
- export SEDONA_PYFLINK_EXTRA_JARS=${PWD}/$(find flink-shaded/target
-name sedona-flink*.jar),${PWD}/geotools-wrapper-1.7.1-28.5.jar
+ wget
https://repo1.maven.org/maven2/org/datasyslab/geotools-wrapper/1.8.0-33.1-rc1/geotools-wrapper-1.8.0-33.1-rc1.jar
+ export SEDONA_PYFLINK_EXTRA_JARS=${PWD}/$(find flink-shaded/target
-name sedona-flink*.jar),${PWD}/geotools-wrapper-1.8.0-33.1-rc1.jar
(cd python; PYTHONPATH=$(pwd) uv run pytest -v -s ./tests/flink)
diff --git a/.github/workflows/r.yml b/.github/workflows/r.yml
index dcd48743cb..55951c4036 100644
--- a/.github/workflows/r.yml
+++ b/.github/workflows/r.yml
@@ -124,7 +124,7 @@ jobs:
- name: Build Sedona libraries
run: |
SPARK_COMPAT_VERSION=${SPARK_VERSION:0:3}
- mvn -q clean install -DskipTests -Dspark=${SPARK_COMPAT_VERSION}
-Dscala=${SCALA_VERSION:0:4}
+ mvn -q clean install -DskipTests -Dspark=${SPARK_COMPAT_VERSION}
-Dscala=${SCALA_VERSION:0:4} -Dgeotools
- name: Run tests
run: |
if [[ "${SPARK_VERSION:0:3}" < "3.3" ]]; then
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 0fa390023e..3ae6f5b105 100644
--- a/common/src/main/java/org/apache/sedona/common/FunctionsGeoTools.java
+++ b/common/src/main/java/org/apache/sedona/common/FunctionsGeoTools.java
@@ -19,6 +19,12 @@
package org.apache.sedona.common;
import java.util.Set;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.NoSuchAuthorityCodeException;
+import org.geotools.api.referencing.ReferenceIdentifier;
+import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
+import org.geotools.api.referencing.operation.MathTransform;
+import org.geotools.api.referencing.operation.TransformException;
import org.geotools.geometry.jts.JTS;
import org.geotools.referencing.CRS;
import org.geotools.referencing.ReferencingFactoryFinder;
@@ -28,12 +34,6 @@ import org.locationtech.jts.geom.Geometry;
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.ReferenceIdentifier;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
-import org.opengis.referencing.operation.MathTransform;
-import org.opengis.referencing.operation.TransformException;
public class FunctionsGeoTools {
@@ -202,8 +202,6 @@ public class FunctionsGeoTools {
if (Functions.crossesDateLine(geometry)) {
Functions.shiftLongitude(geometry);
}
- // geometry = (Predicates.crossesDateLine(geometry)) ?
Functions.shiftLongitude(geometry)
- // : geometry;
// If originalCRS is not set, use WGS84 as the originalCRS for
transformation
String sourceCRSCode = (originalCRS == 0) ? "EPSG:" + WGS84CRS : "EPSG:" +
originalCRS;
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 19e0ef1fd8..15221c7158 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
@@ -20,12 +20,12 @@ package org.apache.sedona.common.raster;
import java.awt.geom.Point2D;
import org.apache.sedona.common.utils.RasterUtils;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
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.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
public class GeometryFunctions {
@@ -140,7 +140,7 @@ public class GeometryFunctions {
}
public static Geometry envelope(GridCoverage2D raster) throws
FactoryException {
- Envelope2D envelope2D = raster.getEnvelope2D();
+ ReferencedEnvelope envelope2D = raster.getEnvelope2D();
Envelope envelope =
new Envelope(
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 5a5db76cf7..ea88350049 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
@@ -25,10 +25,10 @@ import java.awt.image.WritableRaster;
import javax.media.jai.RasterFactory;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.sedona.common.utils.RasterUtils;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
import org.geotools.coverage.grid.GridCoverage2D;
import org.locationtech.jts.geom.Geometry;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
public class PixelFunctionEditors {
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 867f041187..148431f009 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
@@ -25,15 +25,15 @@ import java.util.Arrays;
import java.util.List;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.sedona.common.utils.RasterUtils;
+import org.geotools.api.coverage.PointOutsideCoverageException;
+import org.geotools.api.geometry.Position;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
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;
public class PixelFunctions {
private static GeometryFactory GEOMETRY_FACTORY = new GeometryFactory();
@@ -289,7 +289,7 @@ public class PixelFunctions {
result.add(null);
} else {
Point point = ensurePoint(geom);
- DirectPosition directPosition2D = new DirectPosition2D(point.getX(),
point.getY());
+ Position directPosition2D = new Position2D(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 cdf08d56a2..49a9223908 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
@@ -23,6 +23,10 @@ import java.awt.image.RenderedImage;
import java.util.Arrays;
import java.util.Set;
import org.apache.sedona.common.utils.RasterUtils;
+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 org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.coverage.grid.GridEnvelope2D;
import org.geotools.referencing.crs.DefaultEngineeringCRS;
@@ -31,10 +35,6 @@ 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;
public class RasterAccessors {
public static int srid(GridCoverage2D raster) throws FactoryException {
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 f5011d5a1c..94746f9f78 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
@@ -30,10 +30,10 @@ import
org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
import org.apache.commons.math3.stat.descriptive.moment.StandardDeviation;
import org.apache.sedona.common.Functions;
import org.apache.sedona.common.utils.RasterUtils;
+import org.geotools.api.referencing.FactoryException;
import org.geotools.coverage.GridSampleDimension;
import org.geotools.coverage.grid.GridCoverage2D;
import org.locationtech.jts.geom.Geometry;
-import org.opengis.referencing.FactoryException;
public class RasterBandAccessors {
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 3abd56869e..51c906429f 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
@@ -27,17 +27,17 @@ import javax.media.jai.RasterFactory;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.sedona.common.utils.RasterUtils;
+import org.geotools.api.geometry.BoundingBox;
+import org.geotools.api.parameter.ParameterValueGroup;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
import org.geotools.coverage.GridSampleDimension;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.coverage.processing.CannotCropException;
import org.geotools.coverage.processing.operation.Crop;
-import org.geotools.geometry.Envelope2D;
import org.geotools.geometry.jts.JTS;
+import org.geotools.geometry.jts.ReferencedEnvelope;
import org.locationtech.jts.geom.Geometry;
-import org.opengis.geometry.BoundingBox;
-import org.opengis.parameter.ParameterValueGroup;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
public class RasterBandEditors {
/**
@@ -303,7 +303,7 @@ public class RasterBandEditors {
// Use rasterizeGeomExtent for AOI geometries smaller than a pixel
double[] metadata = RasterAccessors.metadata(singleBandRaster);
- Envelope2D geomEnvelope =
+ ReferencedEnvelope geomEnvelope =
Rasterization.rasterizeGeomExtent(geometry, singleBandRaster,
metadata, allTouched);
Geometry geomExtent = JTS.toGeometry((BoundingBox) geomEnvelope);
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 c43596c6dd..e379b24648 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
@@ -32,6 +32,13 @@ import
org.apache.sedona.common.raster.inputstream.ByteArrayImageInputStream;
import org.apache.sedona.common.raster.netcdf.NetCdfReader;
import org.apache.sedona.common.utils.ImageUtils;
import org.apache.sedona.common.utils.RasterUtils;
+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 org.geotools.coverage.GridSampleDimension;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.coverage.grid.GridEnvelope2D;
@@ -46,13 +53,6 @@ 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 ucar.nc2.NetcdfFile;
import ucar.nc2.NetcdfFiles;
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 b9d2a047b7..e9af594ea8 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
@@ -39,6 +39,9 @@ import javax.media.jai.RasterFactory;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.sedona.common.FunctionsGeoTools;
import org.apache.sedona.common.utils.RasterUtils;
+import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
+import org.geotools.api.referencing.datum.PixelInCell;
+import org.geotools.api.referencing.operation.MathTransform;
import org.geotools.coverage.CoverageFactoryFinder;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.coverage.grid.GridCoverageFactory;
@@ -46,9 +49,6 @@ 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;
/** Raster constructor for testing the Python implementation of raster
deserializer. */
public class RasterConstructorsForTesting {
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 eab88525bc..f28fd77c6a 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
@@ -31,6 +31,15 @@ import javax.media.jai.RasterFactory;
import org.apache.sedona.common.FunctionsGeoTools;
import org.apache.sedona.common.utils.RasterInterpolate;
import org.apache.sedona.common.utils.RasterUtils;
+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 org.geotools.coverage.CoverageFactoryFinder;
import org.geotools.coverage.GridSampleDimension;
import org.geotools.coverage.grid.GridCoverage2D;
@@ -38,19 +47,10 @@ 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;
public class RasterEditors {
@@ -224,7 +224,7 @@ public class RasterEditors {
return raster;
}
- 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 6a1a9d191f..77d115352f 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
@@ -36,15 +36,15 @@ import javax.media.jai.InterpolationNearest;
import javax.media.jai.JAI;
import javax.media.jai.RenderedOp;
import org.apache.sedona.common.utils.RasterUtils;
+import org.geotools.api.coverage.grid.GridCoverageWriter;
+import org.geotools.api.parameter.GeneralParameterValue;
+import org.geotools.api.parameter.ParameterValueGroup;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.coverage.grid.io.AbstractGridFormat;
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;
public class RasterOutputs {
public static byte[] asGeoTiff(
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 41efb3a778..3bceb34de3 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
@@ -23,18 +23,18 @@ import org.apache.commons.lang3.tuple.Pair;
import org.apache.sedona.common.FunctionsGeoTools;
import org.apache.sedona.common.utils.CachedCRSTransformFinder;
import org.apache.sedona.common.utils.GeomUtils;
+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;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.geometry.jts.JTS;
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;
public class RasterPredicates {
/**
diff --git
a/common/src/main/java/org/apache/sedona/common/raster/Rasterization.java
b/common/src/main/java/org/apache/sedona/common/raster/Rasterization.java
index 5d15990d6f..b62a615b1c 100644
--- a/common/src/main/java/org/apache/sedona/common/raster/Rasterization.java
+++ b/common/src/main/java/org/apache/sedona/common/raster/Rasterization.java
@@ -25,13 +25,13 @@ import java.util.*;
import javax.media.jai.RasterFactory;
import org.apache.sedona.common.Functions;
import org.apache.sedona.common.utils.RasterUtils;
+import org.geotools.api.geometry.BoundingBox;
+import org.geotools.api.referencing.FactoryException;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.coverage.grid.GridCoverageFactory;
-import org.geotools.geometry.Envelope2D;
import org.geotools.geometry.jts.JTS;
+import org.geotools.geometry.jts.ReferencedEnvelope;
import org.locationtech.jts.geom.*;
-import org.opengis.geometry.BoundingBox;
-import org.opengis.referencing.FactoryException;
public class Rasterization {
protected static List<Object> rasterize(
@@ -50,9 +50,9 @@ public class Rasterization {
throw new IllegalArgumentException("Geometry does not intersect
Raster.");
}
- Envelope2D rasterExtent = raster.getEnvelope2D();
+ ReferencedEnvelope rasterExtent = raster.getEnvelope2D();
- Envelope2D geomExtent = rasterizeGeomExtent(geom, raster, metadata,
allTouched);
+ ReferencedEnvelope geomExtent = rasterizeGeomExtent(geom, raster,
metadata, allTouched);
RasterizationParams params =
calculateRasterizationParams(raster, useGeometryExtent, metadata,
geomExtent, pixelType);
@@ -82,7 +82,7 @@ public class Rasterization {
double[] metadata,
Geometry geom,
RasterizationParams params,
- Envelope2D geomExtent,
+ ReferencedEnvelope geomExtent,
double value,
boolean allTouched)
throws FactoryException {
@@ -118,13 +118,13 @@ public class Rasterization {
for (int i = 0; i < geom.getNumGeometries(); i++) {
Geometry subGeom = geom.getGeometryN(i);
- Envelope2D subGeomExtent = rasterizeGeomExtent(subGeom, raster,
metadata, allTouched);
+ ReferencedEnvelope subGeomExtent = rasterizeGeomExtent(subGeom, raster,
metadata, allTouched);
rasterizeGeometry(raster, metadata, subGeom, params, subGeomExtent,
value, allTouched);
}
}
private static void rasterizePoint(
- Geometry geom, RasterizationParams params, Envelope2D geomExtent, double
value) {
+ Geometry geom, RasterizationParams params, ReferencedEnvelope
geomExtent, double value) {
int startX = (int) Math.round(((geomExtent.getMinX() - params.upperLeftX)
/ params.scaleX));
int startY = (int) Math.round(((geomExtent.getMinY() - params.upperLeftY)
/ params.scaleY));
@@ -157,7 +157,7 @@ public class Rasterization {
}
private static void rasterizeLineString(
- Geometry geom, RasterizationParams params, double value, Envelope2D
geomExtent) {
+ Geometry geom, RasterizationParams params, double value,
ReferencedEnvelope geomExtent) {
for (int i = 0; i < geom.getNumGeometries(); i++) {
LineString line = (LineString) geom.getGeometryN(i);
Coordinate[] coords = line.getCoordinates();
@@ -231,7 +231,7 @@ public class Rasterization {
}
private static LineSegment clipSegmentToRasterBounds(
- Coordinate p1, Coordinate p2, Envelope2D geomExtent) {
+ Coordinate p1, Coordinate p2, ReferencedEnvelope geomExtent) {
double minX = geomExtent.getMinX();
double maxX = geomExtent.getMaxX();
double minY = geomExtent.getMinY();
@@ -303,7 +303,7 @@ public class Rasterization {
return x >= minX && x <= maxX && y >= minY && y <= maxY;
}
- protected static Envelope2D rasterizeGeomExtent(
+ protected static ReferencedEnvelope rasterizeGeomExtent(
Geometry geom, GridCoverage2D raster, double[] metadata, boolean
allTouched) {
if (Objects.equals(geom.getGeometryType(), "MultiLineString")) {
@@ -313,8 +313,8 @@ public class Rasterization {
allTouched = true;
}
- Envelope2D rasterExtent =
- JTS.getEnvelope2D(geom.getEnvelopeInternal(),
raster.getCoordinateReferenceSystem2D());
+ ReferencedEnvelope rasterExtent =
+ new ReferencedEnvelope(geom.getEnvelopeInternal(),
raster.getCoordinateReferenceSystem2D());
// Using BigDecimal to avoid floating point errors
BigDecimal upperLeftX = BigDecimal.valueOf(metadata[0]);
@@ -387,13 +387,13 @@ public class Rasterization {
alignedMaxY = Math.min(alignedMaxY, originalMaxY);
// Create the aligned raster extent
- Envelope2D alignedRasterExtent =
- new Envelope2D(
- rasterExtent.getCoordinateReferenceSystem(),
+ ReferencedEnvelope alignedRasterExtent =
+ ReferencedEnvelope.rect(
alignedMinX,
alignedMinY,
alignedMaxX - alignedMinX,
- alignedMaxY - alignedMinY);
+ alignedMaxY - alignedMinY,
+ rasterExtent.getCoordinateReferenceSystem());
return alignedRasterExtent;
}
@@ -402,7 +402,7 @@ public class Rasterization {
GridCoverage2D raster,
boolean useGeometryExtent,
double[] metadata,
- Envelope2D geomExtent,
+ ReferencedEnvelope geomExtent,
String pixelType) {
double upperLeftX = 0;
@@ -474,7 +474,7 @@ public class Rasterization {
public static void rasterizePolygon(
Geometry geom,
RasterizationParams params,
- Envelope2D geomExtent,
+ ReferencedEnvelope geomExtent,
double value,
boolean allTouched) {
if (!(geom instanceof Polygon)) {
@@ -512,7 +512,7 @@ public class Rasterization {
Polygon polygon,
RasterizationParams params,
double value,
- Envelope2D geomExtent,
+ ReferencedEnvelope geomExtent,
boolean allTouched) {
Map<Double, TreeSet<Double>> scanlineIntersections = new HashMap<>();
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 945e57618f..7ca8c164ca 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
@@ -22,9 +22,9 @@ import com.google.common.collect.ImmutableList;
import java.io.IOException;
import java.util.*;
import org.apache.sedona.common.raster.RasterConstructors;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.datum.PixelInCell;
import org.geotools.coverage.grid.GridCoverage2D;
-import org.opengis.referencing.FactoryException;
-import org.opengis.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 26d52ac737..81c98bd722 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
@@ -29,10 +29,10 @@ import java.util.zip.DeflaterOutputStream;
import java.util.zip.InflaterInputStream;
import javax.measure.IncommensurableException;
import org.apache.commons.io.IOUtils;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
import org.geotools.referencing.CRS;
import org.geotools.referencing.wkt.Formattable;
-import org.opengis.referencing.FactoryException;
-import org.opengis.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 5125e64532..d085f191f0 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
@@ -31,6 +31,7 @@ import java.io.Serializable;
import java.net.URI;
import javax.media.jai.RenderedImageAdapter;
import org.apache.sedona.common.raster.DeepCopiedRenderedImage;
+import org.geotools.api.referencing.operation.MathTransform;
import org.geotools.coverage.GridSampleDimension;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.coverage.grid.GridCoverageFactory;
@@ -38,7 +39,6 @@ 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;
public class Serde {
private Serde() {}
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 1d125cf9d6..bb98cfa483 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
@@ -20,10 +20,10 @@ package org.apache.sedona.common.utils;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.LoadingCache;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
+import org.geotools.api.referencing.operation.MathTransform;
import org.geotools.referencing.CRS;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
-import org.opengis.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 f1425ca8e9..f962bb9260 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
@@ -41,6 +41,13 @@ import org.apache.sedona.common.Functions;
import org.apache.sedona.common.FunctionsGeoTools;
import org.apache.sedona.common.raster.RasterAccessors;
import org.apache.sedona.common.raster.RasterEditors;
+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 org.geotools.coverage.Category;
import org.geotools.coverage.CoverageFactoryFinder;
import org.geotools.coverage.GridSampleDimension;
@@ -49,20 +56,12 @@ 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;
/** Utility functions for working with GridCoverage2D objects. */
public class RasterUtils {
@@ -466,7 +465,7 @@ public class RasterUtils {
public static Point2D getWorldCornerCoordinates(GridCoverage2D raster, int
colX, int rowY)
throws TransformException {
- Point2D.Double gridCoord = new DirectPosition2D(colX - 1, rowY - 1);
+ Point2D.Double gridCoord = new Position2D(colX - 1, rowY - 1);
return raster
.getGridGeometry()
.getGridToCRS2D(PixelOrientation.UPPER_LEFT)
@@ -488,7 +487,7 @@ public class RasterUtils {
public static Point2D getWorldCornerCoordinatesWithRangeCheck(
GridCoverage2D raster, int colX, int rowY)
throws IndexOutOfBoundsException, TransformException {
- Point2D.Double gridCoordinates2D = new DirectPosition2D(colX - 1, rowY -
1);
+ Point2D.Double gridCoordinates2D = new Position2D(colX - 1, rowY - 1);
if
(!(raster.getGridGeometry().getGridRange2D().contains(gridCoordinates2D)))
throw new IndexOutOfBoundsException(
String.format(
@@ -501,14 +500,14 @@ public class RasterUtils {
public static int[] getGridCoordinatesFromWorld(
GridCoverage2D raster, double longitude, double latitude) throws
TransformException {
- DirectPosition2D directPosition2D =
- new DirectPosition2D(raster.getCoordinateReferenceSystem2D(),
longitude, latitude);
- DirectPosition worldCoord =
+ Point2D directPosition2D =
+ new Position2D(raster.getCoordinateReferenceSystem2D(), longitude,
latitude);
+ Point2D worldCoord =
raster
.getGridGeometry()
.getCRSToGrid2D(PixelOrientation.UPPER_LEFT)
- .transform((DirectPosition) directPosition2D, null);
- double[] coords = worldCoord.getCoordinate();
+ .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 8cafb9c648..65a294ad31 100644
--- a/common/src/test/java/org/apache/sedona/common/FunctionsTest.java
+++ b/common/src/test/java/org/apache/sedona/common/FunctionsTest.java
@@ -29,6 +29,8 @@ import java.util.stream.Collectors;
import org.apache.sedona.common.sphere.Haversine;
import org.apache.sedona.common.sphere.Spheroid;
import org.apache.sedona.common.utils.*;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
import org.geotools.referencing.CRS;
import org.geotools.referencing.operation.projection.ProjectionException;
import org.junit.Test;
@@ -38,14 +40,13 @@ import
org.locationtech.jts.geom.prep.PreparedGeometryFactory;
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;
public class FunctionsTest extends TestBase {
public static final GeometryFactory GEOMETRY_FACTORY = new GeometryFactory();
protected static final double FP_TOLERANCE = 1e-12;
protected static final double FP_TOLERANCE2 = 1e-4;
+ protected static final double IOU_TOLERANCE = 1E-8;
protected static final CoordinateSequenceComparator
COORDINATE_SEQUENCE_COMPARATOR =
new CoordinateSequenceComparator(2) {
@Override
@@ -2965,7 +2966,8 @@ public class FunctionsTest extends TestBase {
"POLYGON((-120.00898315284118
29.999999999999993,-120.00898315284118 49.99999999999999,-120.00881054407824
50.00112962562472,-120.0082993510474 50.00221581519921,-120.00746921861011
50.003216831392564,-120.00635204829044 50.004094212187034,-120.00499077231723
50.00481424796622,-120.00343770376273 50.00534927579437,-120.00175252618051
50.00567874132504,-119.99999999999999 50.00578998770771,-80
50.00578998770771,-79.99824747381949 50.00567874132504,-79.99656229623727
50.0053492 [...]
Geometry postgis_result3 =
geomFromEWKT(
- "POLYGON((-179.99820962883618
59.99995929000264,-179.99825989222717 59.999785136194745,-179.9983770256619
59.99961923984817,-179.99855652693947 59.99946797609105,-179.99879149742534
59.99933715766465,-179.999072907238 59.99923181157932,-179.99938994227725
59.9991559859705,-179.99973041975517 59.999112594569745,179.9999187437317
59.999103304762926,179.99957102955932 59.999128473531854,179.9992397991585
59.99918713373882,179.99893778069907 59.999277031280386,179.99867658007986
[...]
+ "POLYGON((-179.99820962883618
59.99995929000264,-179.99825989222717 59.999785136194745,-179.9983770256619
59.99961923984817,-179.99855652693947 59.99946797609105,-179.99879149742534
59.99933715766465,-179.999072907238 59.99923181157932,-179.99938994227725
59.9991559859705,-179.99973041975517 59.99911259456973,179.9999187437317
59.999103304762926,179.99957102955932 59.999128473531854,179.9992397991585
59.99918713373882,179.99893778069907 59.999277031280386,179.99867658007986 5
[...]
+
Geometry postgis_result4 =
geomFromEWKT(
"POLYGON((-91.18706814560713 30.45193179814003,-91.1890681473133
30.453431798552806,-91.18908219578012 30.453444627151963,-91.18909308551447
30.453459583698564,-91.18910039802891 30.453476093421752,-91.18910385230598
30.453493521862622,-91.1891033155977 30.453511199256216,-91.18909880852735
30.453528446270074,-91.18909050429724 30.453544600110646,-91.18907872203292
30.453559039994175,-91.18906391451956 30.453571211003144,-91.18904665080186
30.453580645411602,-91.1890275943157 [...]
@@ -2973,42 +2975,38 @@ public class FunctionsTest extends TestBase {
geomFromEWKT(
"POLYGON((-120.08983152841193
29.999999999999993,-120.08983152841193 49.99999999999999,-120.08810544078257
50.011295055230505,-120.082993510474 50.02215353089088,-120.07469218610122
50.032158574496115,-120.06352048290445 50.040926345165026,-120.04990772317234
50.04812066585569,-120.03437703762728 50.0534658262464,-120.01752526180509
50.05675706194147,-119.99999999999999 50.05786832496988,-80
50.05786832496988,-79.98247473819491 50.05675706194147,-79.9656229623727
50.053465826 [...]
- assertEquals(Functions.reducePrecision(expected1, 8),
Functions.reducePrecision(result1, 8));
assertEquals(4326, Functions.getSRID(result1));
- assertEquals(7.424558176442617E-8, comparePolygons(postgis_result1,
result1), FP_TOLERANCE2);
- assertEquals(Spheroid.area(postgis_result1), Spheroid.area(result1),
FP_TOLERANCE2);
+ assertEquals(1.0, intersectionOverUnion(expected1, result1),
IOU_TOLERANCE);
+ assertEquals(1.0, intersectionOverUnion(postgis_result1, result1),
IOU_TOLERANCE);
- assertEquals(Functions.reducePrecision(expected2, 8),
Functions.reducePrecision(result2, 8));
assertEquals(4269, Functions.getSRID(result2));
- assertEquals(Spheroid.area(postgis_result2), Spheroid.area(result2), 10);
- assertEquals(7.424558176442617E-8, comparePolygons(postgis_result2,
result2), FP_TOLERANCE2);
+ assertEquals(1.0, intersectionOverUnion(expected2, result2),
IOU_TOLERANCE);
+ assertEquals(1.0, intersectionOverUnion(postgis_result2, result2),
IOU_TOLERANCE);
- assertEquals(Functions.reducePrecision(expected3, 8),
Functions.reducePrecision(result3, 8));
+ // Note tolerance for error higher for points due to algorithmic
differences
assertEquals(4269, Functions.getSRID(result3));
- assertEquals(Spheroid.area(postgis_result3), Spheroid.area(result3),
FP_TOLERANCE2);
- assertEquals(7.424558176442617E-8, comparePolygons(postgis_result3,
result3), FP_TOLERANCE2);
+ assertEquals(1.0, intersectionOverUnion(expected3, result3), 1e-4);
+ assertEquals(1.0, intersectionOverUnion(postgis_result3, result3), 1e-4);
- assertEquals(Functions.reducePrecision(expected4, 8),
Functions.reducePrecision(result4, 8));
assertEquals(4326, Functions.getSRID(result4));
- assertEquals(Spheroid.area(postgis_result4), Spheroid.area(result4),
FP_TOLERANCE2);
- assertEquals(7.424558176442617E-8, comparePolygons(postgis_result4,
result4), FP_TOLERANCE2);
+ assertEquals(1.0, intersectionOverUnion(expected4, result4),
IOU_TOLERANCE);
+ assertEquals(1.0, intersectionOverUnion(postgis_result4, result4),
IOU_TOLERANCE);
- assertEquals(Functions.reducePrecision(expected5, 8),
Functions.reducePrecision(result5, 8));
assertEquals(4269, Functions.getSRID(result5));
- assertEquals(Spheroid.area(postgis_result5), Spheroid.area(result5), 10);
- assertEquals(7.424558176442617E-8, comparePolygons(postgis_result5,
result5), FP_TOLERANCE2);
+ assertEquals(1.0, intersectionOverUnion(expected5, result5),
IOU_TOLERANCE);
+ assertEquals(1.0, intersectionOverUnion(postgis_result5, result5),
IOU_TOLERANCE);
- assertEquals(Functions.reducePrecision(expected6, 8),
Functions.reducePrecision(result6, 8));
assertEquals(4326, Functions.getSRID(result6));
+ assertEquals(1.0, intersectionOverUnion(expected6, result6),
IOU_TOLERANCE);
- assertEquals(Functions.reducePrecision(expected7, 8),
Functions.reducePrecision(result7, 8));
assertEquals(4326, Functions.getSRID(result6));
+ assertEquals(1.0, intersectionOverUnion(expected7, result7),
IOU_TOLERANCE);
- assertEquals(Functions.reducePrecision(expected8, 8),
Functions.reducePrecision(result8, 8));
assertEquals(4326, Functions.getSRID(result6));
+ assertEquals(1.0, intersectionOverUnion(expected8, result8),
IOU_TOLERANCE);
- assertEquals(Functions.reducePrecision(expected9, 8),
Functions.reducePrecision(result9, 8));
assertEquals(4326, Functions.getSRID(result6));
+ assertEquals(1.0, intersectionOverUnion(expected9, result9),
IOU_TOLERANCE);
}
@Test
@@ -3047,20 +3045,6 @@ public class FunctionsTest extends TestBase {
assertEquals(expected8, Functions.shiftLongitude(geomCollection));
}
- private static double comparePolygons(Geometry p1, Geometry p2) {
- Coordinate[] coords1 = p1.getCoordinates();
- Coordinate[] coords2 = p2.getCoordinates();
-
- double maxDistance = 0.0;
- for (int i = 0; i < Math.min(coords1.length, coords2.length); i++) {
- Geometry point1 = GEOMETRY_FACTORY.createPoint(coords1[i]);
- Geometry point2 = GEOMETRY_FACTORY.createPoint(coords2[i]);
- double distance = Spheroid.distance(point1, point2);
- maxDistance = Math.max(maxDistance, distance);
- }
- return maxDistance;
- }
-
@Test
public void testBestSRID() throws ParseException {
int[][] testCases_special = {
@@ -4428,4 +4412,14 @@ public class FunctionsTest extends TestBase {
assertThrows(IllegalArgumentException.class, () ->
Functions.subDivide(lineString, 4));
assertEquals("ST_Subdivide needs 5 or more max vertices", e.getMessage());
}
+
+ /**
+ * Computes the intersection over union (IoU) between two geometries. 1.0
indicates a perfect
+ * match, while 0.0 indicates no overlap.
+ */
+ private double intersectionOverUnion(Geometry expected, Geometry actual) {
+ double intersectionArea = expected.intersection(actual).getArea();
+ double actualArea = actual.getArea();
+ return intersectionArea / actualArea;
+ }
}
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 93aa474588..679c4c2920 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
@@ -22,12 +22,12 @@ import static org.junit.Assert.*;
import java.io.IOException;
import org.apache.sedona.common.Constructors;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
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;
public class FunctionEditorsTest extends RasterTestBase {
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 cd8f54621e..dca3f14948 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
@@ -27,6 +27,8 @@ import java.util.Objects;
import org.apache.sedona.common.Constructors;
import org.apache.sedona.common.Functions;
import org.apache.sedona.common.utils.RasterUtils;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.referencing.operation.transform.AffineTransform2D;
import org.junit.Assert;
@@ -36,8 +38,6 @@ 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;
public class FunctionsTest extends RasterTestBase {
@@ -88,10 +88,8 @@ public class FunctionsTest extends RasterTestBase {
GridCoverage2D raster =
rasterFromGeoTiff(resourceFolder +
"raster_geotiff_color/FAA_UTM18N_NAD83.tif");
- Geometry point = Constructors.geomFromWKT("POINT (-100 100)", 0);
- assertNull(
- "Points outside of the envelope should return null.",
- PixelFunctions.value(raster, point, 1));
+ Geometry point = Constructors.geomFromWKT("POINT (-90 50)", 0);
+ assertNull(PixelFunctions.value(raster, point, 1));
point = Constructors.geomFromWKT("POINT (-77.9146 37.8916)", 0);
Double value = PixelFunctions.value(raster, point, 1);
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 7b3dbb4834..a609cd5ddc 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
@@ -23,13 +23,13 @@ import static org.junit.Assert.assertThrows;
import java.io.IOException;
import org.apache.sedona.common.Functions;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
import org.geotools.coverage.grid.GridCoverage2D;
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;
public class GeometryFunctionsTest extends RasterTestBase {
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 3caa4ede65..3ae9111bc8 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
@@ -23,10 +23,10 @@ import static org.junit.Assert.*;
import java.awt.image.DataBuffer;
import java.util.Random;
import org.apache.sedona.common.utils.RasterUtils;
+import org.geotools.api.referencing.FactoryException;
import org.geotools.coverage.grid.GridCoverage2D;
import org.junit.Assert;
import org.junit.Test;
-import org.opengis.referencing.FactoryException;
public class MapAlgebraTest extends RasterTestBase {
@Test
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 f1a256d2c4..347309cf00 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
@@ -21,14 +21,14 @@ package org.apache.sedona.common.raster;
import static org.junit.Assert.*;
import java.io.IOException;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
import org.geotools.coverage.grid.GridCoordinates2D;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.geometry.jts.JTS;
import org.geotools.referencing.CRS;
import org.junit.Test;
import org.locationtech.jts.geom.*;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
public class RasterAccessorsTest extends RasterTestBase {
@Test
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 e0efb21897..54613223dd 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
@@ -23,11 +23,11 @@ import static org.junit.Assert.*;
import java.io.IOException;
import java.util.Arrays;
import org.apache.sedona.common.Constructors;
+import org.geotools.api.referencing.FactoryException;
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;
public class RasterBandAccessorsTest extends RasterTestBase {
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 45de7c7e30..c46dd601b0 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
@@ -31,13 +31,13 @@ import java.util.function.Function;
import java.util.stream.Collectors;
import org.apache.sedona.common.Constructors;
import org.apache.sedona.common.raster.serde.Serde;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.coverage.processing.CannotCropException;
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;
public class RasterBandEditorsTest extends RasterTestBase {
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 e5b7c2d2bf..bff8261d48 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
@@ -32,16 +32,16 @@ import java.util.Set;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.sedona.common.Constructors;
import org.apache.sedona.common.utils.RasterUtils;
+import org.geotools.api.coverage.SampleDimensionType;
+import org.geotools.api.geometry.Position;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
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.locationtech.jts.io.ParseException;
-import org.opengis.coverage.SampleDimensionType;
-import org.opengis.geometry.DirectPosition;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
public class RasterConstructorsTest extends RasterTestBase {
@@ -324,10 +324,10 @@ public class RasterConstructorsTest extends
RasterTestBase {
Constructors.geomFromWKT("POLYGON((0.1 0.1, 0.1 0.4, 0.4 0.4, 0.4 0.1,
0.1 0.1))", 0);
GridCoverage2D rasterized =
RasterConstructors.asRasterWithRasterExtent(geom, raster, "d", false,
100d, 0d);
- assertEquals(0, rasterized.getEnvelope2D().x, 1e-6);
- assertEquals(0, rasterized.getEnvelope2D().y, 1e-6);
- assertEquals(0.5, rasterized.getEnvelope2D().width, 1e-6);
- assertEquals(0.5, rasterized.getEnvelope2D().height, 1e-6);
+ assertEquals(0, rasterized.getEnvelope2D().getMinX(), 1e-6);
+ assertEquals(0, rasterized.getEnvelope2D().getMinY(), 1e-6);
+ assertEquals(0.5, rasterized.getEnvelope2D().getWidth(), 1e-6);
+ assertEquals(0.5, rasterized.getEnvelope2D().getHeight(), 1e-6);
assertEquals(5, RasterAccessors.getWidth(rasterized));
assertEquals(5, RasterAccessors.getHeight(rasterized));
double sum = Arrays.stream(MapAlgebra.bandAsArray(rasterized, 1)).sum();
@@ -624,10 +624,8 @@ public class RasterConstructorsTest extends RasterTestBase
{
// 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 809052d3f2..8022ed734c 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
@@ -25,20 +25,20 @@ import java.awt.image.DataBuffer;
import java.io.IOException;
import java.util.Arrays;
import org.apache.sedona.common.utils.RasterUtils;
+import org.geotools.api.geometry.Bounds;
+import org.geotools.api.geometry.Position;
+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.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;
public class RasterEditorsTest extends RasterTestBase {
@@ -4140,9 +4140,9 @@ public class RasterEditorsTest extends RasterTestBase {
GridCoverage2D source, GridCoverage2D target, GridCoverage2D transformed)
throws TransformException, FactoryException {
// Check the envelope and CRS
- Envelope expectedEnvelope = target.getEnvelope();
- Envelope actualEnvelope = transformed.getEnvelope();
- assertSameEnvelope(expectedEnvelope, actualEnvelope, 1e-6);
+ Bounds expectedEnvelope = target.getEnvelope();
+ Bounds actualEnvelope = transformed.getEnvelope();
+ assertSameBounds(expectedEnvelope, actualEnvelope, 1e-6);
CoordinateReferenceSystem expectedCrs =
target.getCoordinateReferenceSystem();
CoordinateReferenceSystem actualCrs =
transformed.getCoordinateReferenceSystem();
Assert.assertTrue(CRS.equalsIgnoreMetadata(expectedCrs, actualCrs));
@@ -4170,11 +4170,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 dcc2a28dd7..846414ab1b 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
@@ -23,9 +23,9 @@ import static org.junit.Assert.*;
import java.io.File;
import java.io.IOException;
import java.net.URLConnection;
+import org.geotools.api.referencing.FactoryException;
import org.geotools.coverage.grid.GridCoverage2D;
import org.junit.Test;
-import org.opengis.referencing.FactoryException;
public class RasterOutputTest extends RasterTestBase {
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 ee243d7124..0b1f79ca7c 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
@@ -20,6 +20,10 @@ package org.apache.sedona.common.raster;
import java.awt.image.DataBuffer;
import java.io.IOException;
+import org.geotools.api.geometry.BoundingBox;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
+import org.geotools.api.referencing.operation.TransformException;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.geometry.jts.JTS;
import org.geotools.referencing.CRS;
@@ -32,10 +36,6 @@ 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;
public class RasterPredicatesTest extends RasterTestBase {
private static final GeometryFactory GEOMETRY_FACTORY = new
GeometryFactory();
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 3bbcd50d64..fb8d9eaf22 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
@@ -27,24 +27,23 @@ import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import javax.media.jai.RasterFactory;
+import org.geotools.api.geometry.Bounds;
+import org.geotools.api.geometry.Position;
+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 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.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;
public class RasterTestBase {
String arc =
@@ -128,7 +127,8 @@ 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) {
@@ -137,16 +137,16 @@ 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();
- assertSameEnvelope(expectedEnvelope, actualEnvelope, 1e-6);
+ Bounds expectedEnvelope = expected.getEnvelope();
+ Bounds actualEnvelope = actual.getEnvelope();
+ assertSameBounds(expectedEnvelope, actualEnvelope, 1e-6);
CoordinateReferenceSystem expectedCrs =
expected.getCoordinateReferenceSystem();
CoordinateReferenceSystem actualCrs =
actual.getCoordinateReferenceSystem();
Assert.assertTrue(CRS.equalsIgnoreMetadata(expectedCrs, actualCrs));
assertSameValues(expected, actual, density);
}
- protected void assertSameEnvelope(Envelope expected, Envelope actual, double
epsilon) {
+ protected void assertSameBounds(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);
@@ -154,7 +154,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;
@@ -166,7 +166,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 469be91b14..abed63aafb 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
@@ -18,11 +18,11 @@
*/
package org.apache.sedona.common.raster.serde;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
import org.geotools.referencing.CRS;
import org.junit.Assert;
import org.junit.Test;
-import org.opengis.referencing.FactoryException;
-import org.opengis.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 63975d9e8a..fc734105a7 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
@@ -24,10 +24,10 @@ import java.io.File;
import java.io.IOException;
import org.apache.sedona.common.raster.RasterConstructors;
import org.apache.sedona.common.raster.RasterTestBase;
+import org.geotools.api.referencing.FactoryException;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.gce.geotiff.GeoTiffReader;
import org.junit.Test;
-import org.opengis.referencing.FactoryException;
public class SerdeTest extends RasterTestBase {
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 af90fabbe6..7a4fe38853 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
@@ -24,10 +24,10 @@ import org.apache.flink.table.annotation.DataTypeHint;
import org.apache.flink.table.annotation.InputGroup;
import org.apache.flink.table.functions.ScalarFunction;
import org.apache.sedona.common.FunctionsGeoTools;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.operation.buffer.BufferParameters;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
public class Functions {
public static class GeometryType extends ScalarFunction {
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 f93053f7e0..1085bc6656 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
@@ -20,9 +20,9 @@ package org.apache.sedona.flink.expressions;
import org.apache.flink.table.annotation.DataTypeHint;
import org.apache.flink.table.functions.ScalarFunction;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
import org.locationtech.jts.geom.Geometry;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
public class FunctionsGeoTools {
public static class ST_Transform extends ScalarFunction {
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 b85a9f0ae5..0c9cae9920 100644
--- a/flink/src/test/java/org/apache/sedona/flink/FunctionTest.java
+++ b/flink/src/test/java/org/apache/sedona/flink/FunctionTest.java
@@ -31,6 +31,8 @@ import org.apache.commons.lang3.tuple.Pair;
import org.apache.flink.table.api.Table;
import org.apache.sedona.flink.expressions.Functions;
import org.apache.sedona.flink.expressions.FunctionsGeoTools;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
import org.geotools.referencing.CRS;
import org.junit.Assert;
import org.junit.BeforeClass;
@@ -38,8 +40,6 @@ 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;
public class FunctionTest extends TestBase {
diff --git a/pom.xml b/pom.xml
index ffe64586fa..1b7ab17cce 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.5</geotools.version>
+ <geotools.version>33.1</geotools.version>
<hadoop.version>3.2.4</hadoop.version>
<jackson.version>2.13.4</jackson.version>
<jts.version>1.20.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 94388bf90b..fbb7963b61 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
@@ -19,9 +19,9 @@
package org.apache.sedona.snowflake.snowsql;
import org.apache.sedona.common.FunctionsGeoTools;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
import org.locationtech.jts.geom.Geometry;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
public class GeoToolsWrapper {
public static Geometry transform(
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 c23d049f15..5b4e0d248a 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,9 +26,9 @@ import org.apache.sedona.core.knnJudgement.KnnJudgement;
import org.apache.sedona.core.knnJudgement.KnnJudgementUsingIndex;
import org.apache.sedona.core.spatialRDD.SpatialRDD;
import org.apache.spark.api.java.JavaRDD;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.operation.TransformException;
import org.locationtech.jts.geom.Geometry;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.TransformException;
// TODO: Auto-generated Javadoc
diff --git
a/spark/common/src/main/scala/org/apache/sedona/sql/datasources/geopackage/model/TileMetadata.scala
b/spark/common/src/main/scala/org/apache/sedona/sql/datasources/geopackage/model/TileMetadata.scala
index 278f513cd1..88fdd3ca2f 100644
---
a/spark/common/src/main/scala/org/apache/sedona/sql/datasources/geopackage/model/TileMetadata.scala
+++
b/spark/common/src/main/scala/org/apache/sedona/sql/datasources/geopackage/model/TileMetadata.scala
@@ -19,7 +19,7 @@
package org.apache.sedona.sql.datasources.geopackage.model
import org.geotools.referencing.CRS
-import org.opengis.referencing.crs.CoordinateReferenceSystem
+import org.geotools.api.referencing.crs.CoordinateReferenceSystem
import scala.collection.mutable
diff --git
a/spark/common/src/main/scala/org/apache/sedona/sql/datasources/geopackage/transform/Image.scala
b/spark/common/src/main/scala/org/apache/sedona/sql/datasources/geopackage/transform/Image.scala
index 40daf0d460..0ee662ad09 100644
---
a/spark/common/src/main/scala/org/apache/sedona/sql/datasources/geopackage/transform/Image.scala
+++
b/spark/common/src/main/scala/org/apache/sedona/sql/datasources/geopackage/transform/Image.scala
@@ -22,8 +22,7 @@ import
org.apache.sedona.sql.datasources.geopackage.model.ImageFileFormat.ImageF
import org.apache.sedona.sql.datasources.geopackage.model.{ImageFileFormat,
TileMetadata, TileRowMetadata}
import org.geotools.coverage.grid.{GridCoverage2D, GridCoverageFactory}
import org.geotools.gce.geotiff.GeoTiffReader
-import org.geotools.geometry.GeneralEnvelope
-
+import org.geotools.geometry.GeneralBounds
import java.awt.image.BufferedImage
import java.io.ByteArrayInputStream
import javax.imageio.ImageIO
@@ -92,14 +91,13 @@ object Image {
tileRowMetadata: TileRowMetadata): GridCoverage2D = {
val envelope = tileMetadata.getEnvelope(tileRowMetadata)
- val genevelope = new GeneralEnvelope(
- Array(envelope.minX, envelope.minY),
- Array(envelope.maxX, envelope.maxY))
+ val genEnvelope =
+ new GeneralBounds(Array(envelope.minX, envelope.minY),
Array(envelope.maxX, envelope.maxY))
- genevelope.setCoordinateReferenceSystem(tileMetadata.getSRID())
val coverageFactory = new GridCoverageFactory()
- coverageFactory.create("coverage", image, genevelope)
+ genEnvelope.setCoordinateReferenceSystem(tileMetadata.getSRID())
+ coverageFactory.create("coverage", image, genEnvelope)
}
def readImageFromBinary(imageBinary: Array[Byte]): BufferedImage = {
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 bc9570fcb0..dd98888b27 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
+import org.geotools.api.referencing.crs.{CoordinateReferenceSystem,
GeographicCRS}
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}
object JoinedGeometryRaster {
@@ -63,14 +62,15 @@ object JoinedGeometryRaster {
geom
} else {
val env = geom.getEnvelopeInternal
- val envelope = new Envelope2D(null, env.getMinX, env.getMinY,
env.getWidth, env.getHeight)
val crs = FunctionsGeoTools.sridToCRS(srid)
+ val envelope =
+ new ReferencedEnvelope(env.getMinX, env.getMaxX, env.getMinY,
env.getMaxY, null)
transformToWGS84Envelope(envelope, crs)
}
}
private def transformToWGS84Envelope(
- envelope: org.opengis.geometry.Envelope,
+ envelope: ReferencedEnvelope,
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
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 05ac0b1252..16a85fc2f1 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
@@ -36,9 +36,12 @@ 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.api.feature.simple.SimpleFeature;
+import org.geotools.api.feature.simple.SimpleFeatureType;
+import org.geotools.api.filter.Filter;
import org.geotools.data.shapefile.files.ShpFiles;
import org.geotools.data.shapefile.shp.ShapefileReader;
import org.geotools.feature.FeatureCollection;
@@ -51,9 +54,6 @@ 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;
public class ShapefileRDDTest implements Serializable {
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 4a7654aa2d..0e721084d5 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
@@ -47,9 +47,13 @@ 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.api.feature.Property;
+import org.geotools.api.feature.simple.SimpleFeature;
+import org.geotools.api.feature.simple.SimpleFeatureType;
+import org.geotools.api.filter.Filter;
import org.geotools.data.shapefile.files.ShpFiles;
import org.geotools.feature.FeatureCollection;
import org.geotools.feature.FeatureIterator;
@@ -60,10 +64,6 @@ 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;
public class ShapefileReaderTest extends TestBase {
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 1f6140e991..303966722d 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
@@ -31,7 +31,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
@@ -449,7 +449,7 @@ class functionTestScala
val EPSG_TGT_WKT = EPSG_TGT_CRS.toWKT()
val epsgFactoryErrorString = EPSG_TGT_WKT.substring(0,
EPSG_TGT_WKT.length() - 1)
val epsgString = "EPSG:4326"
- val epsgNoSuchAuthorityString = "EPSG:9377"
+ val epsgNoSuchAuthorityString = "EPSG:11111"
val polygon =
"POLYGON ((110.54671 55.818002, 110.54671 55.143743, 110.940494
55.143743, 110.940494 55.818002, 110.54671 55.818002))"
import org.locationtech.jts.io.WKTReader
diff --git
a/spark/common/src/test/scala/org/apache/sedona/sql/rasteralgebraTest.scala
b/spark/common/src/test/scala/org/apache/sedona/sql/rasteralgebraTest.scala
index ff5dc7109b..be0c69a722 100644
--- a/spark/common/src/test/scala/org/apache/sedona/sql/rasteralgebraTest.scala
+++ b/spark/common/src/test/scala/org/apache/sedona/sql/rasteralgebraTest.scala
@@ -21,9 +21,9 @@ package org.apache.sedona.sql
import org.apache.sedona.common.raster.MapAlgebra
import org.apache.sedona.common.utils.RasterUtils
import org.apache.spark.sql.expressions.Window
-import org.apache.spark.sql.{DataFrame, Row, SaveMode}
-import org.apache.spark.sql.functions.{col, collect_list, expr, lit,
row_number}
+import org.apache.spark.sql.functions._
import org.apache.spark.sql.types.{DoubleType, IntegerType, StructField,
StructType}
+import org.apache.spark.sql.{DataFrame, Row, SaveMode}
import org.geotools.coverage.grid.GridCoverage2D
import org.junit.Assert.{assertEquals, assertNotNull, assertNull, assertTrue}
import org.locationtech.jts.geom.{Coordinate, Geometry}
@@ -1039,7 +1039,7 @@ class rasteralgebraTest extends TestBaseScala with
BeforeAndAfter with GivenWhen
// Test with a polygon that does not intersect the raster in lenient mode
val actual = df
.selectExpr(
- "RS_Clip(raster, 1, ST_GeomFromWKT('POLYGON((274157 4174899,263510
4174947,269859 4183348,274157 4174899))'))")
+ "RS_Clip(raster, 1, ST_GeomFromWKT('POLYGON((274157 4174899,263510
4174947,269859 4183348,274157 4174899))', 26918))")
.first()
.get(0)
assertNull(actual)