Skip to content

Commit

Permalink
[SEDONA-505] Fix handling of geometries with SRID=0 in some raster fu…
Browse files Browse the repository at this point in the history
…nctions (#1256)
  • Loading branch information
Kontinuation authored Feb 28, 2024
1 parent 5885ef1 commit a5aeef3
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -456,10 +456,13 @@ public static Geometry convertCRSIfNeeded(Geometry geometry, CoordinateReference
// to the raster CRS.
// Note that:
// In Sedona vector, we do not perform implicit CRS transform. Everything must be done explicitly via ST_Transform
// In Sedona raster, we do implicit CRS transform if the geometry has a SRID and the raster has a CRS
if (targetCRS != null && !(targetCRS instanceof DefaultEngineeringCRS) && geomSRID > 0) {
// In Sedona raster, we do implicit CRS transform if the raster has a CRS. If the the SRID of the geometry is 0, we assume it is 4326.
if (geomSRID == 0) {
geomSRID = 4326;
}
if (targetCRS != null && !(targetCRS instanceof DefaultEngineeringCRS)) {
try {
geometry = FunctionsGeoTools.transformToGivenTarget(geometry, null, targetCRS, true);
geometry = FunctionsGeoTools.transformToGivenTarget(geometry, "epsg:" + geomSRID, targetCRS, true);
} catch (FactoryException | TransformException e) {
throw new RuntimeException("Cannot transform CRS of query window", e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.{Row, SaveMode}
import org.apache.spark.sql.functions.{col, collect_list, expr, row_number}
import org.geotools.coverage.grid.GridCoverage2D
import org.junit.Assert.{assertEquals, assertNull, assertTrue}
import org.junit.Assert.{assertEquals, assertNotNull, assertNull, assertTrue}
import org.locationtech.jts.geom.{Coordinate, Geometry}
import org.scalatest.{BeforeAndAfter, GivenWhenThen}

Expand Down Expand Up @@ -988,6 +988,10 @@ class rasteralgebraTest extends TestBaseScala with BeforeAndAfter with GivenWhen

actual = df.selectExpr("RS_ZonalStats(raster, geom, 'sd')").first().get(0)
assertEquals(92.13277429243035, actual)

// Test with a polygon in EPSG:4326
actual = df.selectExpr("RS_ZonalStats(raster, ST_GeomFromWKT('POLYGON ((-77.96672569800863073 37.91971182746296876, -77.9688630154902711 37.89620133516485367, -77.93936803424354309 37.90517806858776595, -77.96672569800863073 37.91971182746296876))'), 1, 'mean', false)").first().get(0)
assertNotNull(actual)
}

it("Passed RS_ZonalStats - Raster with no data") {
Expand Down Expand Up @@ -1235,25 +1239,37 @@ class rasteralgebraTest extends TestBaseScala with BeforeAndAfter with GivenWhen
it("Passed RS_WorldToRasterCoord with raster - geom parameter") {
var df = sparkSession.read.format("binaryFile").load(resourceFolder + "raster/test1.tiff")
df = df.selectExpr("RS_FromGeoTiff(content) as raster")
val result = df.selectExpr("ST_AsText(RS_WorldToRasterCoord(raster, ST_GeomFromText('POINT (-13095817.809482181 4021262.7487925636)')))").first().getString(0);
val results = df.selectExpr(
"ST_AsText(RS_WorldToRasterCoord(raster, ST_GeomFromText('POINT (-13095817.809482181 4021262.7487925636)', 3857)))",
"ST_AsText(RS_WorldToRasterCoord(raster, ST_GeomFromText('POINT (-117.64173 33.943833)')))"
).first()
val expected = "POINT (1 1)"
assertEquals(expected, result)
assertEquals(expected, results.getString(0))
assertEquals(expected, results.getString(1))
}

it("Passed RS_WorldToRasterCoordX with raster - geom parameter") {
var df = sparkSession.read.format("binaryFile").load(resourceFolder + "raster/test1.tiff")
df = df.selectExpr("RS_FromGeoTiff(content) as raster")
val result = df.selectExpr("RS_WorldToRasterCoordX(raster, ST_GeomFromText('POINT (-13095817.809482181 4021262.7487925636)'))").first().getInt(0);
val results = df.selectExpr(
"RS_WorldToRasterCoordX(raster, ST_GeomFromText('POINT (-13095817.809482181 4021262.7487925636)', 3857))",
"RS_WorldToRasterCoordX(raster, ST_GeomFromText('POINT (-117.64173 33.943833)'))"
).first()
val expected = 1
assertEquals(expected, result)
assertEquals(expected, results.getInt(0))
assertEquals(expected, results.getInt(1))
}

it("Passed RS_WorldToRasterCoordY with raster - geom parameter") {
var df = sparkSession.read.format("binaryFile").load(resourceFolder + "raster/test1.tiff")
df = df.selectExpr("RS_FromGeoTiff(content) as raster")
val result = df.selectExpr("RS_WorldToRasterCoordY(raster, ST_GeomFromText('POINT (-13095817.809482181 4021262.7487925636)'))").first().getInt(0);
val results = df.selectExpr(
"RS_WorldToRasterCoordY(raster, ST_GeomFromText('POINT (-13095817.809482181 4021262.7487925636)', 3857))",
"RS_WorldToRasterCoordY(raster, ST_GeomFromText('POINT (-117.64173 33.943833)'))"
).first()
val expected = 1
assertEquals(expected, result)
assertEquals(expected, results.getInt(0))
assertEquals(expected, results.getInt(1))
}

it("Passed RS_Contains") {
Expand Down

0 comments on commit a5aeef3

Please sign in to comment.