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

paleolimbot pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/sedona-db.git


The following commit(s) were added to refs/heads/main by this push:
     new 47f7beec feat(rust/sedona-proj): Let ST_Transform() handle 3D 
coordinates (#544)
47f7beec is described below

commit 47f7beec5599c9ac5bc737231d59a75dc0fd2251
Author: Hiroaki Yutani <[email protected]>
AuthorDate: Tue Jan 27 06:43:55 2026 +0900

    feat(rust/sedona-proj): Let ST_Transform() handle 3D coordinates (#544)
---
 c/sedona-proj/src/proj.rs                          | 11 +++++++++++
 c/sedona-proj/src/transform.rs                     | 12 ++++++++++++
 python/sedonadb/tests/functions/test_transforms.py | 10 ++++++++++
 3 files changed, 33 insertions(+)

diff --git a/c/sedona-proj/src/proj.rs b/c/sedona-proj/src/proj.rs
index c597ec01..053260f3 100644
--- a/c/sedona-proj/src/proj.rs
+++ b/c/sedona-proj/src/proj.rs
@@ -371,6 +371,17 @@ impl Proj {
         Ok((xyzt_out.0, xyzt_out.1))
     }
 
+    /// Transform XYZ coordinates
+    pub(crate) fn transform_xyz(
+        &mut self,
+        point: (f64, f64, f64),
+    ) -> Result<(f64, f64, f64), SedonaProjError> {
+        // Filling extra dimensions with zeroes is what PostGIS does
+        let xyzt = (point.0, point.1, point.2, 0.0);
+        let xyzt_out = self.transform(xyzt)?;
+        Ok((xyzt_out.0, xyzt_out.1, xyzt_out.2))
+    }
+
     /// Transform XYZT coordinates
     pub(crate) fn transform(
         &mut self,
diff --git a/c/sedona-proj/src/transform.rs b/c/sedona-proj/src/transform.rs
index 3ed71cbc..1801b653 100644
--- a/c/sedona-proj/src/transform.rs
+++ b/c/sedona-proj/src/transform.rs
@@ -228,6 +228,18 @@ impl CrsTransform for ProjTransform {
         coord.1 = res.1;
         Ok(())
     }
+
+    fn transform_coord_3d(&self, coord: &mut (f64, f64, f64)) -> Result<(), 
SedonaGeometryError> {
+        let res = self.proj.borrow_mut().transform_xyz(*coord).map_err(|e| {
+            SedonaGeometryError::Invalid(format!(
+                "PROJ coordinate transformation failed with error: {e}"
+            ))
+        })?;
+        coord.0 = res.0;
+        coord.1 = res.1;
+        coord.2 = res.2;
+        Ok(())
+    }
 }
 
 #[cfg(test)]
diff --git a/python/sedonadb/tests/functions/test_transforms.py 
b/python/sedonadb/tests/functions/test_transforms.py
index 4f82c5dd..22bd0fd9 100644
--- a/python/sedonadb/tests/functions/test_transforms.py
+++ b/python/sedonadb/tests/functions/test_transforms.py
@@ -31,6 +31,16 @@ def test_st_transform(eng):
     )
 
 
[email protected]("eng", [SedonaDB, PostGIS])
+def test_st_transform_3d(eng):
+    eng = eng.create_or_skip()
+    eng.assert_query_result(
+        "SELECT ST_Transform(ST_GeomFromText('POINT Z (1 1 1)'), 'EPSG:4979', 
'EPSG:4978')",
+        "POINT Z (6376201.805927448 111297.016517882 110568.792276973)",
+        wkt_precision=9,
+    )
+
+
 @pytest.mark.parametrize("eng", [SedonaDB, PostGIS])
 @pytest.mark.parametrize(
     ("geom", "srid", "expected_srid"),

Reply via email to