From 698e51f476772ebfdd8ba7b93c5a5beafcb90f64 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Thu, 22 Oct 2020 19:34:23 +0200 Subject: WKT parser: accept implicit compoundCRS from ESRI WKT, like "PROJCS[...],VERTCS[...]" --- test/unit/test_io.cpp | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'test') diff --git a/test/unit/test_io.cpp b/test/unit/test_io.cpp index 055b1e1d..cc9465ea 100644 --- a/test/unit/test_io.cpp +++ b/test/unit/test_io.cpp @@ -2692,6 +2692,38 @@ TEST(wkt_parse, // --------------------------------------------------------------------------- +TEST(wkt_parse, implicit_compound_CRS_ESRI) { + // See https://lists.osgeo.org/pipermail/gdal-dev/2020-October/052843.html + // and https://pro.arcgis.com/en/pro-app/arcpy/classes/spatialreference.htm + const char *wkt = + "PROJCS[\"NAD_1983_2011_StatePlane_Colorado_Central_FIPS_0502_Ft_US\"," + "GEOGCS[\"GCS_NAD_1983_2011\",DATUM[\"D_NAD_1983_2011\"," + "SPHEROID[\"GRS_1980\",6378137.0,298.257222101]]," + "PRIMEM[\"Greenwich\",0.0]," + "UNIT[\"Degree\",0.0174532925199433]]," + "PROJECTION[\"Lambert_Conformal_Conic\"]," + "PARAMETER[\"False_Easting\",3000000.00031608]," + "PARAMETER[\"False_Northing\",999999.999996]," + "PARAMETER[\"Central_Meridian\",-105.5]," + "PARAMETER[\"Standard_Parallel_1\",38.45]," + "PARAMETER[\"Standard_Parallel_2\",39.75]," + "PARAMETER[\"Latitude_Of_Origin\",37.8333333333333]," + "UNIT[\"US survey foot\",0.304800609601219]]," + "VERTCS[\"CGVD2013_height\"," + "VDATUM[\"Canadian_Geodetic_Vertical_Datum_of_2013\"]," + "PARAMETER[\"Vertical_Shift\",0.0]," + "PARAMETER[\"Direction\",1.0]," + "UNIT[\"Meter\",1.0]]"; + auto dbContext = DatabaseContext::create(); + auto obj = WKTParser().attachDatabaseContext(dbContext).createFromWKT(wkt); + auto crs = nn_dynamic_pointer_cast(obj); + ASSERT_TRUE(crs != nullptr); + EXPECT_EQ(crs->nameStr(), "NAD83(2011) / Colorado Central (ftUS) + " + "CGVD2013(CGG2013) height"); +} + +// --------------------------------------------------------------------------- + TEST(wkt_parse, COORDINATEOPERATION) { std::string src_wkt; -- cgit v1.2.3 From f2cd2b3b99746dd9d08b6d388fa91055643f0747 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Thu, 22 Oct 2020 21:13:03 +0200 Subject: WKT parser: accept ESRI VERTCS[...,DATUM[...,SPHEROID[]] syntax to express ellipsoidal heights --- test/unit/test_io.cpp | 76 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 61 insertions(+), 15 deletions(-) (limited to 'test') diff --git a/test/unit/test_io.cpp b/test/unit/test_io.cpp index cc9465ea..59bd5bab 100644 --- a/test/unit/test_io.cpp +++ b/test/unit/test_io.cpp @@ -2597,11 +2597,12 @@ TEST(wkt_parse, EXPECT_EQ(baseCRS->nameStr(), "NAD83"); EXPECT_EQ(baseCRS->coordinateSystem()->axisList().size(), 3U); - EXPECT_EQ( - crs->exportToWKT( - WKTFormatter::create(WKTFormatter::Convention::WKT1_GDAL, dbContext) - .get()), - wkt); + EXPECT_EQ(replaceAll(crs->exportToWKT( + WKTFormatter::create( + WKTFormatter::Convention::WKT1_GDAL, dbContext) + .get()), + "ellipsoidal height", "Up"), + wkt); } // --------------------------------------------------------------------------- @@ -2645,11 +2646,12 @@ TEST(wkt_parse, EXPECT_EQ(crs->nameStr(), "WGS 84 / UTM zone 31N"); EXPECT_EQ(crs->coordinateSystem()->axisList().size(), 3U); - EXPECT_EQ( - crs->exportToWKT( - WKTFormatter::create(WKTFormatter::Convention::WKT1_GDAL, dbContext) - .get()), - wkt); + EXPECT_EQ(replaceAll(crs->exportToWKT( + WKTFormatter::create( + WKTFormatter::Convention::WKT1_GDAL, dbContext) + .get()), + "ellipsoidal height", "Up"), + wkt); } // --------------------------------------------------------------------------- @@ -2683,11 +2685,12 @@ TEST(wkt_parse, EXPECT_NEAR(crs->coordinateSystem()->axisList()[2]->unit().conversionToSI(), 0.304800609601219, 1e-15); - EXPECT_EQ( - crs->exportToWKT( - WKTFormatter::create(WKTFormatter::Convention::WKT1_GDAL, dbContext) - .get()), - wkt); + EXPECT_EQ(replaceAll(crs->exportToWKT( + WKTFormatter::create( + WKTFormatter::Convention::WKT1_GDAL, dbContext) + .get()), + "ellipsoidal height", "Up"), + wkt); } // --------------------------------------------------------------------------- @@ -2724,6 +2727,49 @@ TEST(wkt_parse, implicit_compound_CRS_ESRI) { // --------------------------------------------------------------------------- +TEST(wkt_parse, VERTCS_with_ellipsoidal_height_ESRI) { + const char *wkt = "VERTCS[\"WGS_1984\",DATUM[\"D_WGS_1984\"," + "SPHEROID[\"WGS_1984\",6378137.0,298.257223563]]," + "PARAMETER[\"Vertical_Shift\",0.0]," + "PARAMETER[\"Direction\",1.0],UNIT[\"Meter\",1.0]]"; + auto dbContext = DatabaseContext::create(); + auto obj = WKTParser().attachDatabaseContext(dbContext).createFromWKT(wkt); + auto crs = nn_dynamic_pointer_cast(obj); + ASSERT_TRUE(crs != nullptr); + + const char *expected_wkt1 = + "VERT_CS[\"WGS_1984\",\n" + " VERT_DATUM[\"World Geodetic System 1984\",2002],\n" + " UNIT[\"metre\",1,\n" + " AUTHORITY[\"EPSG\",\"9001\"]],\n" + " AXIS[\"ellipsoidal height\",UP]]"; + EXPECT_EQ( + crs->exportToWKT( + WKTFormatter::create(WKTFormatter::Convention::WKT1_GDAL, dbContext) + .get()), + expected_wkt1); +} + +// --------------------------------------------------------------------------- + +TEST(wkt_parse, implicit_compound_CRS_with_ellipsoidal_height_ESRI) { + const char *wkt = + "GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\"," + "SPHEROID[\"WGS_1984\",6378137.0,298.257223563]]," + "PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]]," + "VERTCS[\"WGS_1984\",DATUM[\"D_WGS_1984\"," + "SPHEROID[\"WGS_1984\",6378137.0,298.257223563]]," + "PARAMETER[\"Vertical_Shift\",0.0]," + "PARAMETER[\"Direction\",1.0],UNIT[\"Meter\",1.0]]"; + auto dbContext = DatabaseContext::create(); + auto obj = WKTParser().attachDatabaseContext(dbContext).createFromWKT(wkt); + auto crs = nn_dynamic_pointer_cast(obj); + ASSERT_TRUE(crs != nullptr); + EXPECT_EQ(crs->coordinateSystem()->axisList().size(), 3U); +} + +// --------------------------------------------------------------------------- + TEST(wkt_parse, COORDINATEOPERATION) { std::string src_wkt; -- cgit v1.2.3 From 82cd218a7ab44eafef92445f2caaec0fb6ec799a Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Thu, 22 Oct 2020 21:22:43 +0200 Subject: WKT1_ESRI export: export CompoundCRS as PROJCS[...],VERTCS[...] or GEOGCS[...],VERTCS[...] --- test/unit/test_io.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'test') diff --git a/test/unit/test_io.cpp b/test/unit/test_io.cpp index 59bd5bab..5cef886f 100644 --- a/test/unit/test_io.cpp +++ b/test/unit/test_io.cpp @@ -2723,6 +2723,12 @@ TEST(wkt_parse, implicit_compound_CRS_ESRI) { ASSERT_TRUE(crs != nullptr); EXPECT_EQ(crs->nameStr(), "NAD83(2011) / Colorado Central (ftUS) + " "CGVD2013(CGG2013) height"); + + EXPECT_EQ( + crs->exportToWKT( + WKTFormatter::create(WKTFormatter::Convention::WKT1_ESRI, dbContext) + .get()), + wkt); } // --------------------------------------------------------------------------- -- cgit v1.2.3 From 9a112931555aa324ed9caa3c261a4fd11551d615 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Thu, 22 Oct 2020 23:16:58 +0200 Subject: WKT1_ESRI export: generate VERTCS[...,DATUM[...,SPHEROID[]] syntax when ellipsoidal height is found --- test/unit/test_io.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'test') diff --git a/test/unit/test_io.cpp b/test/unit/test_io.cpp index 5cef886f..93b79b67 100644 --- a/test/unit/test_io.cpp +++ b/test/unit/test_io.cpp @@ -2743,6 +2743,12 @@ TEST(wkt_parse, VERTCS_with_ellipsoidal_height_ESRI) { auto crs = nn_dynamic_pointer_cast(obj); ASSERT_TRUE(crs != nullptr); + EXPECT_EQ( + crs->exportToWKT( + WKTFormatter::create(WKTFormatter::Convention::WKT1_ESRI, dbContext) + .get()), + wkt); + const char *expected_wkt1 = "VERT_CS[\"WGS_1984\",\n" " VERT_DATUM[\"World Geodetic System 1984\",2002],\n" -- cgit v1.2.3 From 4969076c15f73371401ee65f2e4617439239cd8b Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Thu, 22 Oct 2020 23:20:25 +0200 Subject: Database: import ESRI VERTCS that uses a (geodetic) datum to express ellipsoidal height --- test/cli/testprojinfo | 8 ++++++++ test/cli/testprojinfo_out.dist | 14 ++++++++++++++ 2 files changed, 22 insertions(+) (limited to 'test') diff --git a/test/cli/testprojinfo b/test/cli/testprojinfo index 19d96735..043e5724 100755 --- a/test/cli/testprojinfo +++ b/test/cli/testprojinfo @@ -175,6 +175,14 @@ echo 'Testing -k operation EPSG:8457 -o PROJ -q' >> ${OUT} $EXE -k operation EPSG:8457 -o PROJ -q >>${OUT} 2>&1 echo "" >>${OUT} +echo 'Testing D_WGS_1984' >> ${OUT} +$EXE D_WGS_1984 >>${OUT} 2>&1 +echo "" >>${OUT} + +echo 'Testing -k datum D_WGS_1984' >> ${OUT} +$EXE -k datum D_WGS_1984 >>${OUT} 2>&1 +echo "" >>${OUT} + # Testing --searchpaths if ! $EXE --searchpaths > testprojinfo_out_searchpaths.txt; then echo "--searchpaths failed" diff --git a/test/cli/testprojinfo_out.dist b/test/cli/testprojinfo_out.dist index b4d19002..3025295b 100644 --- a/test/cli/testprojinfo_out.dist +++ b/test/cli/testprojinfo_out.dist @@ -1191,6 +1191,20 @@ Testing -k operation EPSG:8457 -o PROJ -q +step +proj=unitconvert +xy_in=rad +xy_out=deg +step +proj=axisswap +order=2,1 +Testing D_WGS_1984 +WKT2:2019 string: +DATUM["World Geodetic System 1984", + ELLIPSOID["WGS 84",6378137,298.257223563, + LENGTHUNIT["metre",1]], + ID["EPSG",6326]] + +Testing -k datum D_WGS_1984 +WKT2:2019 string: +DATUM["World Geodetic System 1984", + ELLIPSOID["WGS 84",6378137,298.257223563, + LENGTHUNIT["metre",1]], + ID["EPSG",6326]] + Testing -s NZGD2000 -t ITRF96 -o PROJ -q +proj=pipeline +step +proj=unitconvert +xy_in=deg +xy_out=rad -- cgit v1.2.3 From 6351422cc2108072162f7b8cdff12916723ccc20 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Fri, 23 Oct 2020 00:03:04 +0200 Subject: WKT1_ESRI export: try to export Geographic3D and Projected3D CRS when we can find a corresponding ellipsoidal vertical datum --- test/unit/test_io.cpp | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) (limited to 'test') diff --git a/test/unit/test_io.cpp b/test/unit/test_io.cpp index 93b79b67..555d1159 100644 --- a/test/unit/test_io.cpp +++ b/test/unit/test_io.cpp @@ -2764,7 +2764,7 @@ TEST(wkt_parse, VERTCS_with_ellipsoidal_height_ESRI) { // --------------------------------------------------------------------------- -TEST(wkt_parse, implicit_compound_CRS_with_ellipsoidal_height_ESRI) { +TEST(wkt_parse, implicit_compound_CRS_geographic_with_ellipsoidal_height_ESRI) { const char *wkt = "GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\"," "SPHEROID[\"WGS_1984\",6378137.0,298.257223563]]," @@ -2778,6 +2778,45 @@ TEST(wkt_parse, implicit_compound_CRS_with_ellipsoidal_height_ESRI) { auto crs = nn_dynamic_pointer_cast(obj); ASSERT_TRUE(crs != nullptr); EXPECT_EQ(crs->coordinateSystem()->axisList().size(), 3U); + + EXPECT_EQ( + crs->exportToWKT( + WKTFormatter::create(WKTFormatter::Convention::WKT1_ESRI, dbContext) + .get()), + wkt); +} + +// --------------------------------------------------------------------------- + +TEST(wkt_parse, implicit_compound_CRS_projected_with_ellipsoidal_height_ESRI) { + const char *wkt = + "PROJCS[\"WGS_1984_UTM_Zone_31N\",GEOGCS[\"GCS_WGS_1984\"," + "DATUM[\"D_WGS_1984\"," + "SPHEROID[\"WGS_1984\",6378137.0,298.257223563]]," + "PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]]," + "PROJECTION[\"Transverse_Mercator\"]," + "PARAMETER[\"False_Easting\",500000.0]," + "PARAMETER[\"False_Northing\",0.0]," + "PARAMETER[\"Central_Meridian\",3.0]," + "PARAMETER[\"Scale_Factor\",0.9996]," + "PARAMETER[\"Latitude_Of_Origin\",0.0]," + "UNIT[\"Meter\",1.0]]," + "VERTCS[\"WGS_1984\"," + "DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]]," + "PARAMETER[\"Vertical_Shift\",0.0]," + "PARAMETER[\"Direction\",1.0]," + "UNIT[\"Meter\",1.0]]"; + auto dbContext = DatabaseContext::create(); + auto obj = WKTParser().attachDatabaseContext(dbContext).createFromWKT(wkt); + auto crs = nn_dynamic_pointer_cast(obj); + ASSERT_TRUE(crs != nullptr); + EXPECT_EQ(crs->coordinateSystem()->axisList().size(), 3U); + + EXPECT_EQ( + crs->exportToWKT( + WKTFormatter::create(WKTFormatter::Convention::WKT1_ESRI, dbContext) + .get()), + wkt); } // --------------------------------------------------------------------------- -- cgit v1.2.3