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 <202656197+jess...@users.noreply.github.com> 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 <ji...@wherobots.com> --- .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)