From e82e808a9b6d1ab3cdb60d195a30f9763972e6e5 Mon Sep 17 00:00:00 2001 From: bartels Date: Mon, 27 Apr 2026 13:42:51 +0200 Subject: [PATCH 1/6] 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/6] 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/6] 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 6826aca34e47b20821258e85fed1f218248e96d8 Mon Sep 17 00:00:00 2001 From: "Andreas W. Bartels" Date: Wed, 29 Apr 2026 18:57:02 +0200 Subject: [PATCH 4/6] GRS80 should be recognized as a WGS84 transformation type (#127) (#2) * Fix for transform type WGS84 derection Signed-off-by: bartels --- .../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 cd15601..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 From abb00e21b007635bbc322bce0227bc50caac0c87 Mon Sep 17 00:00:00 2001 From: bartels Date: Mon, 27 Apr 2026 17:09:38 +0200 Subject: [PATCH 5/6] Revert "Fix for transform type WGS84 derection" This reverts commit e82e808a9b6d1ab3cdb60d195a30f9763972e6e5. --- .../org/locationtech/proj4j/datum/Datum.java | 6 ++++-- .../proj4j/datum/TransformerTypeTest.java | 21 ------------------- 2 files changed, 4 insertions(+), 23 deletions(-) delete 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 ecefbd7..dff2487 100755 --- a/core/src/main/java/org/locationtech/proj4j/datum/Datum.java +++ b/core/src/main/java/org/locationtech/proj4j/datum/Datum.java @@ -23,6 +23,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import org.locationtech.proj4j.ProjCoordinate; @@ -149,8 +150,9 @@ public double[] getTransformToWGS84() { public int getTransformType() { if (grids != null && grids.size() > 0) return TYPE_GRIDSHIFT; - if (Ellipsoid.WGS84.isEqual(ellipsoid) || Ellipsoid.GRS80.isEqual(ellipsoid)) { + if (Ellipsoid.WGS84.equals(ellipsoid) || Ellipsoid.GRS80.equals(ellipsoid)) { if (transform == null) return TYPE_WGS84; + if (isIdentity(transform)) return TYPE_WGS84; } @@ -267,4 +269,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 deleted file mode 100644 index 25fad7b..0000000 --- a/core/src/test/java/org/locationtech/proj4j/datum/TransformerTypeTest.java +++ /dev/null @@ -1,21 +0,0 @@ -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 e942c194376a0ef19c621c4dd165427e1976635d Mon Sep 17 00:00:00 2001 From: bartels Date: Wed, 29 Apr 2026 19:06:17 +0200 Subject: [PATCH 6/6] Removed not needed imports --- .../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