Skip to content

Commit 075f830

Browse files
Transformation one projection to another in one step should not skip the datum shift (#128)
* Fix for transform type WGS84 derection Signed-off-by: bartels <andreas.bartels@disy.net> * Fix for datumshift skip Signed-off-by: bartels <andreas.bartels@disy.net> * Removed not needed imports Signed-off-by: bartels <andreas.bartels@disy.net> * GRS80 should be recognized as a WGS84 transformation type (#127) (#2) * Fix for transform type WGS84 derection Signed-off-by: bartels <andreas.bartels@disy.net> * Revert "Fix for transform type WGS84 derection" This reverts commit e82e808. * Removed not needed imports --------- Signed-off-by: bartels <andreas.bartels@disy.net>
1 parent 057bcde commit 075f830

2 files changed

Lines changed: 95 additions & 5 deletions

File tree

core/src/main/java/org/locationtech/proj4j/BasicCoordinateTransform.java

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -189,16 +189,33 @@ private void datumTransform(ProjCoordinate pt) {
189189
/* -------------------------------------------------------------------- */
190190
/* Short cut if the datums are identical. */
191191
/* -------------------------------------------------------------------- */
192-
if (srcCRS.getDatum().isEqual(tgtCRS.getDatum())
193-
|| srcCRS.getDatum().getTransformType() == Datum.TYPE_UNKNOWN
194-
|| tgtCRS.getDatum().getTransformType() == Datum.TYPE_UNKNOWN)
192+
int srcCrsDatumTransformType = srcCRS.getDatum().getTransformType();
193+
int tgtCrsDatumTransformType = tgtCRS.getDatum().getTransformType();
194+
if (srcCRS.getDatum().isEqual(tgtCRS.getDatum())) {
195+
return;
196+
}
197+
198+
if (srcCRS.getDatum().getEllipsoid().isEqual(tgtCRS.getDatum().getEllipsoid())) {
199+
if (srcCrsDatumTransformType == Datum.TYPE_UNKNOWN) {
195200
return;
201+
}
202+
if (tgtCrsDatumTransformType == Datum.TYPE_UNKNOWN) {
203+
return;
204+
}
205+
}
206+
207+
if (srcCrsDatumTransformType == Datum.TYPE_WGS84 && tgtCrsDatumTransformType == Datum.TYPE_UNKNOWN) {
208+
return;
209+
}
210+
if (srcCrsDatumTransformType == Datum.TYPE_UNKNOWN && tgtCrsDatumTransformType == Datum.TYPE_WGS84) {
211+
return;
212+
}
196213

197214
/* -------------------------------------------------------------------- */
198215
/* If this datum requires grid shifts, then apply it to geodetic */
199216
/* coordinates. */
200217
/* -------------------------------------------------------------------- */
201-
if (srcCRS.getDatum().getTransformType() == Datum.TYPE_GRIDSHIFT) {
218+
if (srcCrsDatumTransformType == Datum.TYPE_GRIDSHIFT) {
202219
srcCRS.getDatum().shift(pt);
203220
}
204221

@@ -231,7 +248,7 @@ private void datumTransform(ProjCoordinate pt) {
231248
/* -------------------------------------------------------------------- */
232249
/* Apply grid shift to destination if required. */
233250
/* -------------------------------------------------------------------- */
234-
if (tgtCRS.getDatum().getTransformType() == Datum.TYPE_GRIDSHIFT) {
251+
if (tgtCrsDatumTransformType == Datum.TYPE_GRIDSHIFT) {
235252
tgtCRS.getDatum().inverseShift(pt);
236253
}
237254
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package org.locationtech.proj4j.datum;
2+
3+
import org.junit.Test;
4+
import org.locationtech.proj4j.CRSFactory;
5+
import org.locationtech.proj4j.CoordinateReferenceSystem;
6+
import org.locationtech.proj4j.CoordinateTransformFactory;
7+
import org.locationtech.proj4j.ProjCoordinate;
8+
9+
import static org.junit.Assert.assertTrue;
10+
11+
public class DatumShiftTest {
12+
13+
private final CRSFactory crsFactory = new CRSFactory();
14+
private static final CoordinateTransformFactory transformerFactory = new CoordinateTransformFactory();
15+
16+
@Test
17+
public void gk3ToUtm32Zn() {
18+
19+
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";
20+
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";
21+
22+
CoordinateReferenceSystem etrsCrs = crsFactory.createFromName("EPSG:4258");
23+
CoordinateReferenceSystem wgs84Crs = crsFactory.createFromName("EPSG:4326");
24+
CoordinateReferenceSystem dhdnCrs = crsFactory.createFromName("EPSG:4314");
25+
CoordinateReferenceSystem gk3Crs = crsFactory.createFromParameters("Anon", epsg31467Parameters);
26+
CoordinateReferenceSystem utm32znCrs = crsFactory.createFromParameters("Anon", utm32znParameters);
27+
28+
ProjCoordinate coordinate = new ProjCoordinate(9.0, 50.0);
29+
30+
ProjCoordinate dhdnToGk3Coordinate = transform(dhdnCrs, gk3Crs, coordinate);
31+
ProjCoordinate gk3ToUtm32znCoordinate = transform(gk3Crs, utm32znCrs, dhdnToGk3Coordinate);
32+
33+
ProjCoordinate gk3ToDhdnCoordinate = transform(gk3Crs, dhdnCrs, dhdnToGk3Coordinate);
34+
ProjCoordinate dhdnToWgs84Coordinate = transform(dhdnCrs, wgs84Crs, gk3ToDhdnCoordinate);
35+
ProjCoordinate wgs84ToEtrsCoordinate = transform(wgs84Crs, etrsCrs, dhdnToWgs84Coordinate);
36+
ProjCoordinate etrsToUtm32znCoordinate = transform(etrsCrs, utm32znCrs, wgs84ToEtrsCoordinate);
37+
38+
double dx = Math.abs(gk3ToUtm32znCoordinate.x - etrsToUtm32znCoordinate.x);
39+
double dy = Math.abs(gk3ToUtm32znCoordinate.y - etrsToUtm32znCoordinate.y);
40+
double delta = Math.max(dx, dy);
41+
42+
assertTrue(delta < 0.001);
43+
}
44+
45+
@Test
46+
public void debug() {
47+
48+
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";
49+
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";
50+
51+
CoordinateReferenceSystem dhdnCrs = crsFactory.createFromName("EPSG:4314");
52+
CoordinateReferenceSystem gk3Crs = crsFactory.createFromParameters("Anon", epsg31467Parameters);
53+
CoordinateReferenceSystem utm32znCrs = crsFactory.createFromParameters("Anon", utm32znParameters);
54+
55+
ProjCoordinate coordinate = new ProjCoordinate(9.0, 50.0);
56+
57+
ProjCoordinate dhdnToGk3Coordinate = transform(dhdnCrs, gk3Crs, coordinate);
58+
ProjCoordinate gk3ToUtm32znCoordinate = transform(gk3Crs, utm32znCrs, dhdnToGk3Coordinate);
59+
60+
61+
assertTrue(true);
62+
}
63+
64+
private ProjCoordinate transform(
65+
CoordinateReferenceSystem sourceCrs,
66+
CoordinateReferenceSystem targetCrs,
67+
ProjCoordinate coordinate) {
68+
ProjCoordinate result = new ProjCoordinate();
69+
transformerFactory.createTransform(sourceCrs, targetCrs).transform(coordinate, result);
70+
return result;
71+
}
72+
73+
}

0 commit comments

Comments
 (0)