From e82e808a9b6d1ab3cdb60d195a30f9763972e6e5 Mon Sep 17 00:00:00 2001 From: bartels Date: Mon, 27 Apr 2026 13:42:51 +0200 Subject: [PATCH 1/5] Fix for transform type WGS84 derection Signed-off-by: bartels --- .../org/locationtech/proj4j/datum/Datum.java | 6 ++---- .../proj4j/datum/TransformerTypeTest.java | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 core/src/test/java/org/locationtech/proj4j/datum/TransformerTypeTest.java diff --git a/core/src/main/java/org/locationtech/proj4j/datum/Datum.java b/core/src/main/java/org/locationtech/proj4j/datum/Datum.java index dff2487..ecefbd7 100755 --- a/core/src/main/java/org/locationtech/proj4j/datum/Datum.java +++ b/core/src/main/java/org/locationtech/proj4j/datum/Datum.java @@ -23,7 +23,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import org.locationtech.proj4j.ProjCoordinate; @@ -150,9 +149,8 @@ public double[] getTransformToWGS84() { public int getTransformType() { if (grids != null && grids.size() > 0) return TYPE_GRIDSHIFT; - if (Ellipsoid.WGS84.equals(ellipsoid) || Ellipsoid.GRS80.equals(ellipsoid)) { + if (Ellipsoid.WGS84.isEqual(ellipsoid) || Ellipsoid.GRS80.isEqual(ellipsoid)) { if (transform == null) return TYPE_WGS84; - if (isIdentity(transform)) return TYPE_WGS84; } @@ -269,4 +267,4 @@ public void inverseShift(ProjCoordinate xy) { public void setGrids(List grids) { this.grids = grids; } -} +} \ No newline at end of file diff --git a/core/src/test/java/org/locationtech/proj4j/datum/TransformerTypeTest.java b/core/src/test/java/org/locationtech/proj4j/datum/TransformerTypeTest.java new file mode 100644 index 0000000..25fad7b --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/datum/TransformerTypeTest.java @@ -0,0 +1,21 @@ +package org.locationtech.proj4j.datum; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; + +import static org.junit.Assert.assertTrue; + +public class TransformerTypeTest { + + private final CRSFactory crsFactory = new CRSFactory(); + + @Test + public void isTransformerTypeWgs84() { + + String utm32znParameters = "+proj=tmerc +lat_0=0.0 +lon_0=9.0 +k_0=0.9996 +x_0=3.25E7 +y_0=0.0 +a=6378137.0 +f=298.257222101 +pm=Greenwich +units=m +no_defs"; + CoordinateReferenceSystem utm32znCrs = crsFactory.createFromParameters("Anon", utm32znParameters); + + assertTrue(utm32znCrs.getDatum().getTransformType() == Datum.TYPE_WGS84); + } +} From 630b3f827e0695f90e6e018db0ebe21fa36d26df Mon Sep 17 00:00:00 2001 From: bartels Date: Mon, 27 Apr 2026 13:45:31 +0200 Subject: [PATCH 2/5] Fix for datumshift skip Signed-off-by: bartels --- .../proj4j/BasicCoordinateTransform.java | 31 ++++++-- .../proj4j/datum/DatumShiftTest.java | 73 +++++++++++++++++++ 2 files changed, 99 insertions(+), 5 deletions(-) create mode 100644 core/src/test/java/org/locationtech/proj4j/datum/DatumShiftTest.java diff --git a/core/src/main/java/org/locationtech/proj4j/BasicCoordinateTransform.java b/core/src/main/java/org/locationtech/proj4j/BasicCoordinateTransform.java index 6f2c567..ad20219 100755 --- a/core/src/main/java/org/locationtech/proj4j/BasicCoordinateTransform.java +++ b/core/src/main/java/org/locationtech/proj4j/BasicCoordinateTransform.java @@ -15,7 +15,11 @@ */ package org.locationtech.proj4j; +import java.util.Objects; +import java.util.stream.DoubleStream; + import org.locationtech.proj4j.datum.*; +import org.locationtech.proj4j.util.ProjectionMath; /** * Represents the operation of transforming @@ -185,16 +189,33 @@ private void datumTransform(ProjCoordinate pt) { /* -------------------------------------------------------------------- */ /* Short cut if the datums are identical. */ /* -------------------------------------------------------------------- */ - if (srcCRS.getDatum().isEqual(tgtCRS.getDatum()) - || srcCRS.getDatum().getTransformType() == Datum.TYPE_UNKNOWN - || tgtCRS.getDatum().getTransformType() == Datum.TYPE_UNKNOWN) + int srcCrsDatumTransformType = srcCRS.getDatum().getTransformType(); + int tgtCrsDatumTransformType = tgtCRS.getDatum().getTransformType(); + if (srcCRS.getDatum().isEqual(tgtCRS.getDatum())) { + return; + } + + if (srcCRS.getDatum().getEllipsoid().isEqual(tgtCRS.getDatum().getEllipsoid())) { + if (srcCrsDatumTransformType == Datum.TYPE_UNKNOWN) { + return; + } + if (tgtCrsDatumTransformType == Datum.TYPE_UNKNOWN) { return; + } + } + + if (srcCrsDatumTransformType == Datum.TYPE_WGS84 && tgtCrsDatumTransformType == Datum.TYPE_UNKNOWN) { + return; + } + if (srcCrsDatumTransformType == Datum.TYPE_UNKNOWN && tgtCrsDatumTransformType == Datum.TYPE_WGS84) { + return; + } /* -------------------------------------------------------------------- */ /* If this datum requires grid shifts, then apply it to geodetic */ /* coordinates. */ /* -------------------------------------------------------------------- */ - if (srcCRS.getDatum().getTransformType() == Datum.TYPE_GRIDSHIFT) { + if (srcCrsDatumTransformType == Datum.TYPE_GRIDSHIFT) { srcCRS.getDatum().shift(pt); } @@ -227,7 +248,7 @@ private void datumTransform(ProjCoordinate pt) { /* -------------------------------------------------------------------- */ /* Apply grid shift to destination if required. */ /* -------------------------------------------------------------------- */ - if (tgtCRS.getDatum().getTransformType() == Datum.TYPE_GRIDSHIFT) { + if (tgtCrsDatumTransformType == Datum.TYPE_GRIDSHIFT) { tgtCRS.getDatum().inverseShift(pt); } } diff --git a/core/src/test/java/org/locationtech/proj4j/datum/DatumShiftTest.java b/core/src/test/java/org/locationtech/proj4j/datum/DatumShiftTest.java new file mode 100644 index 0000000..e73cabd --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/datum/DatumShiftTest.java @@ -0,0 +1,73 @@ +package org.locationtech.proj4j.datum; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.ProjCoordinate; + +import static org.junit.Assert.assertTrue; + +public class DatumShiftTest { + + private final CRSFactory crsFactory = new CRSFactory(); + private static final CoordinateTransformFactory transformerFactory = new CoordinateTransformFactory(); + + @Test + public void gk3ToUtm32Zn() { + + String epsg31467Parameters = "+proj=tmerc +lat_0=0.0 +lon_0=9.0 +k_0=1.0 +x_0=3500000.0 +y_0=0.0 +datum=potsdam +a=6377397.155 +f=299.1528128 +towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7 +pm=greenwich +units=m +no_defs"; + String utm32znParameters = "+proj=tmerc +lat_0=0.0 +lon_0=9.0 +k_0=0.9996 +x_0=3.25E7 +y_0=0.0 +a=6378137.0 +f=298.257222 +pm=Greenwich +units=m +no_defs"; + + CoordinateReferenceSystem etrsCrs = crsFactory.createFromName("EPSG:4258"); + CoordinateReferenceSystem wgs84Crs = crsFactory.createFromName("EPSG:4326"); + CoordinateReferenceSystem dhdnCrs = crsFactory.createFromName("EPSG:4314"); + CoordinateReferenceSystem gk3Crs = crsFactory.createFromParameters("Anon", epsg31467Parameters); + CoordinateReferenceSystem utm32znCrs = crsFactory.createFromParameters("Anon", utm32znParameters); + + ProjCoordinate coordinate = new ProjCoordinate(9.0, 50.0); + + ProjCoordinate dhdnToGk3Coordinate = transform(dhdnCrs, gk3Crs, coordinate); + ProjCoordinate gk3ToUtm32znCoordinate = transform(gk3Crs, utm32znCrs, dhdnToGk3Coordinate); + + ProjCoordinate gk3ToDhdnCoordinate = transform(gk3Crs, dhdnCrs, dhdnToGk3Coordinate); + ProjCoordinate dhdnToWgs84Coordinate = transform(dhdnCrs, wgs84Crs, gk3ToDhdnCoordinate); + ProjCoordinate wgs84ToEtrsCoordinate = transform(wgs84Crs, etrsCrs, dhdnToWgs84Coordinate); + ProjCoordinate etrsToUtm32znCoordinate = transform(etrsCrs, utm32znCrs, wgs84ToEtrsCoordinate); + + double dx = Math.abs(gk3ToUtm32znCoordinate.x - etrsToUtm32znCoordinate.x); + double dy = Math.abs(gk3ToUtm32znCoordinate.y - etrsToUtm32znCoordinate.y); + double delta = Math.max(dx, dy); + + assertTrue(delta < 0.001); + } + + @Test + public void debug() { + + String epsg31467Parameters = "+proj=tmerc +lat_0=0.0 +lon_0=9.0 +k_0=1.0 +x_0=3500000.0 +y_0=0.0 +datum=potsdam +a=6377397.155 +f=299.1528128 +towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7 +pm=greenwich +units=m +no_defs"; + String utm32znParameters = "+proj=tmerc +lat_0=0.0 +lon_0=9.0 +k_0=0.9996 +x_0=3.25E7 +y_0=0.0 +a=6378137.0 +f=298.257222101 +pm=Greenwich +units=m +no_defs"; + + CoordinateReferenceSystem dhdnCrs = crsFactory.createFromName("EPSG:4314"); + CoordinateReferenceSystem gk3Crs = crsFactory.createFromParameters("Anon", epsg31467Parameters); + CoordinateReferenceSystem utm32znCrs = crsFactory.createFromParameters("Anon", utm32znParameters); + + ProjCoordinate coordinate = new ProjCoordinate(9.0, 50.0); + + ProjCoordinate dhdnToGk3Coordinate = transform(dhdnCrs, gk3Crs, coordinate); + ProjCoordinate gk3ToUtm32znCoordinate = transform(gk3Crs, utm32znCrs, dhdnToGk3Coordinate); + + + assertTrue(true); + } + + private ProjCoordinate transform( + CoordinateReferenceSystem sourceCrs, + CoordinateReferenceSystem targetCrs, + ProjCoordinate coordinate) { + ProjCoordinate result = new ProjCoordinate(); + transformerFactory.createTransform(sourceCrs, targetCrs).transform(coordinate, result); + return result; + } + +} From 1dffad705ad4e8d2fdef39344455f3c8655f24f4 Mon Sep 17 00:00:00 2001 From: bartels Date: Mon, 27 Apr 2026 13:57:17 +0200 Subject: [PATCH 3/5] Removed not needed imports Signed-off-by: bartels --- .../org/locationtech/proj4j/BasicCoordinateTransform.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/core/src/main/java/org/locationtech/proj4j/BasicCoordinateTransform.java b/core/src/main/java/org/locationtech/proj4j/BasicCoordinateTransform.java index ad20219..cd15601 100755 --- a/core/src/main/java/org/locationtech/proj4j/BasicCoordinateTransform.java +++ b/core/src/main/java/org/locationtech/proj4j/BasicCoordinateTransform.java @@ -15,11 +15,7 @@ */ package org.locationtech.proj4j; -import java.util.Objects; -import java.util.stream.DoubleStream; - import org.locationtech.proj4j.datum.*; -import org.locationtech.proj4j.util.ProjectionMath; /** * Represents the operation of transforming From 641adfdb842f892769f00761105b1da078ab8a28 Mon Sep 17 00:00:00 2001 From: bartels Date: Mon, 27 Apr 2026 16:55:07 +0200 Subject: [PATCH 4/5] Revert "Fix for datumshift skip" This reverts commit 630b3f827e0695f90e6e018db0ebe21fa36d26df. --- .../proj4j/BasicCoordinateTransform.java | 27 ++----- .../proj4j/datum/DatumShiftTest.java | 73 ------------------- 2 files changed, 5 insertions(+), 95 deletions(-) delete mode 100644 core/src/test/java/org/locationtech/proj4j/datum/DatumShiftTest.java diff --git a/core/src/main/java/org/locationtech/proj4j/BasicCoordinateTransform.java b/core/src/main/java/org/locationtech/proj4j/BasicCoordinateTransform.java index cd15601..6f2c567 100755 --- a/core/src/main/java/org/locationtech/proj4j/BasicCoordinateTransform.java +++ b/core/src/main/java/org/locationtech/proj4j/BasicCoordinateTransform.java @@ -185,33 +185,16 @@ private void datumTransform(ProjCoordinate pt) { /* -------------------------------------------------------------------- */ /* Short cut if the datums are identical. */ /* -------------------------------------------------------------------- */ - int srcCrsDatumTransformType = srcCRS.getDatum().getTransformType(); - int tgtCrsDatumTransformType = tgtCRS.getDatum().getTransformType(); - if (srcCRS.getDatum().isEqual(tgtCRS.getDatum())) { - return; - } - - if (srcCRS.getDatum().getEllipsoid().isEqual(tgtCRS.getDatum().getEllipsoid())) { - if (srcCrsDatumTransformType == Datum.TYPE_UNKNOWN) { + if (srcCRS.getDatum().isEqual(tgtCRS.getDatum()) + || srcCRS.getDatum().getTransformType() == Datum.TYPE_UNKNOWN + || tgtCRS.getDatum().getTransformType() == Datum.TYPE_UNKNOWN) return; - } - if (tgtCrsDatumTransformType == Datum.TYPE_UNKNOWN) { - return; - } - } - - if (srcCrsDatumTransformType == Datum.TYPE_WGS84 && tgtCrsDatumTransformType == Datum.TYPE_UNKNOWN) { - return; - } - if (srcCrsDatumTransformType == Datum.TYPE_UNKNOWN && tgtCrsDatumTransformType == Datum.TYPE_WGS84) { - return; - } /* -------------------------------------------------------------------- */ /* If this datum requires grid shifts, then apply it to geodetic */ /* coordinates. */ /* -------------------------------------------------------------------- */ - if (srcCrsDatumTransformType == Datum.TYPE_GRIDSHIFT) { + if (srcCRS.getDatum().getTransformType() == Datum.TYPE_GRIDSHIFT) { srcCRS.getDatum().shift(pt); } @@ -244,7 +227,7 @@ private void datumTransform(ProjCoordinate pt) { /* -------------------------------------------------------------------- */ /* Apply grid shift to destination if required. */ /* -------------------------------------------------------------------- */ - if (tgtCrsDatumTransformType == Datum.TYPE_GRIDSHIFT) { + if (tgtCRS.getDatum().getTransformType() == Datum.TYPE_GRIDSHIFT) { tgtCRS.getDatum().inverseShift(pt); } } diff --git a/core/src/test/java/org/locationtech/proj4j/datum/DatumShiftTest.java b/core/src/test/java/org/locationtech/proj4j/datum/DatumShiftTest.java deleted file mode 100644 index e73cabd..0000000 --- a/core/src/test/java/org/locationtech/proj4j/datum/DatumShiftTest.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.locationtech.proj4j.datum; - -import org.junit.Test; -import org.locationtech.proj4j.CRSFactory; -import org.locationtech.proj4j.CoordinateReferenceSystem; -import org.locationtech.proj4j.CoordinateTransformFactory; -import org.locationtech.proj4j.ProjCoordinate; - -import static org.junit.Assert.assertTrue; - -public class DatumShiftTest { - - private final CRSFactory crsFactory = new CRSFactory(); - private static final CoordinateTransformFactory transformerFactory = new CoordinateTransformFactory(); - - @Test - public void gk3ToUtm32Zn() { - - String epsg31467Parameters = "+proj=tmerc +lat_0=0.0 +lon_0=9.0 +k_0=1.0 +x_0=3500000.0 +y_0=0.0 +datum=potsdam +a=6377397.155 +f=299.1528128 +towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7 +pm=greenwich +units=m +no_defs"; - String utm32znParameters = "+proj=tmerc +lat_0=0.0 +lon_0=9.0 +k_0=0.9996 +x_0=3.25E7 +y_0=0.0 +a=6378137.0 +f=298.257222 +pm=Greenwich +units=m +no_defs"; - - CoordinateReferenceSystem etrsCrs = crsFactory.createFromName("EPSG:4258"); - CoordinateReferenceSystem wgs84Crs = crsFactory.createFromName("EPSG:4326"); - CoordinateReferenceSystem dhdnCrs = crsFactory.createFromName("EPSG:4314"); - CoordinateReferenceSystem gk3Crs = crsFactory.createFromParameters("Anon", epsg31467Parameters); - CoordinateReferenceSystem utm32znCrs = crsFactory.createFromParameters("Anon", utm32znParameters); - - ProjCoordinate coordinate = new ProjCoordinate(9.0, 50.0); - - ProjCoordinate dhdnToGk3Coordinate = transform(dhdnCrs, gk3Crs, coordinate); - ProjCoordinate gk3ToUtm32znCoordinate = transform(gk3Crs, utm32znCrs, dhdnToGk3Coordinate); - - ProjCoordinate gk3ToDhdnCoordinate = transform(gk3Crs, dhdnCrs, dhdnToGk3Coordinate); - ProjCoordinate dhdnToWgs84Coordinate = transform(dhdnCrs, wgs84Crs, gk3ToDhdnCoordinate); - ProjCoordinate wgs84ToEtrsCoordinate = transform(wgs84Crs, etrsCrs, dhdnToWgs84Coordinate); - ProjCoordinate etrsToUtm32znCoordinate = transform(etrsCrs, utm32znCrs, wgs84ToEtrsCoordinate); - - double dx = Math.abs(gk3ToUtm32znCoordinate.x - etrsToUtm32znCoordinate.x); - double dy = Math.abs(gk3ToUtm32znCoordinate.y - etrsToUtm32znCoordinate.y); - double delta = Math.max(dx, dy); - - assertTrue(delta < 0.001); - } - - @Test - public void debug() { - - String epsg31467Parameters = "+proj=tmerc +lat_0=0.0 +lon_0=9.0 +k_0=1.0 +x_0=3500000.0 +y_0=0.0 +datum=potsdam +a=6377397.155 +f=299.1528128 +towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7 +pm=greenwich +units=m +no_defs"; - String utm32znParameters = "+proj=tmerc +lat_0=0.0 +lon_0=9.0 +k_0=0.9996 +x_0=3.25E7 +y_0=0.0 +a=6378137.0 +f=298.257222101 +pm=Greenwich +units=m +no_defs"; - - CoordinateReferenceSystem dhdnCrs = crsFactory.createFromName("EPSG:4314"); - CoordinateReferenceSystem gk3Crs = crsFactory.createFromParameters("Anon", epsg31467Parameters); - CoordinateReferenceSystem utm32znCrs = crsFactory.createFromParameters("Anon", utm32znParameters); - - ProjCoordinate coordinate = new ProjCoordinate(9.0, 50.0); - - ProjCoordinate dhdnToGk3Coordinate = transform(dhdnCrs, gk3Crs, coordinate); - ProjCoordinate gk3ToUtm32znCoordinate = transform(gk3Crs, utm32znCrs, dhdnToGk3Coordinate); - - - assertTrue(true); - } - - private ProjCoordinate transform( - CoordinateReferenceSystem sourceCrs, - CoordinateReferenceSystem targetCrs, - ProjCoordinate coordinate) { - ProjCoordinate result = new ProjCoordinate(); - transformerFactory.createTransform(sourceCrs, targetCrs).transform(coordinate, result); - return result; - } - -} From 6cecbac4d280bd55710e52e1c8609a042b59c382 Mon Sep 17 00:00:00 2001 From: bartels Date: Mon, 27 Apr 2026 16:55:16 +0200 Subject: [PATCH 5/5] Revert "Removed not needed imports" This reverts commit 1dffad705ad4e8d2fdef39344455f3c8655f24f4. --- .../org/locationtech/proj4j/BasicCoordinateTransform.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/src/main/java/org/locationtech/proj4j/BasicCoordinateTransform.java b/core/src/main/java/org/locationtech/proj4j/BasicCoordinateTransform.java index 6f2c567..1360953 100755 --- a/core/src/main/java/org/locationtech/proj4j/BasicCoordinateTransform.java +++ b/core/src/main/java/org/locationtech/proj4j/BasicCoordinateTransform.java @@ -15,7 +15,11 @@ */ package org.locationtech.proj4j; +import java.util.Objects; +import java.util.stream.DoubleStream; + import org.locationtech.proj4j.datum.*; +import org.locationtech.proj4j.util.ProjectionMath; /** * Represents the operation of transforming