From 3f9c0a0b73d6567b3f05a89e337e5ff9f9d5904a Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Fri, 27 Aug 2021 18:33:26 +0200 Subject: [PATCH] ESRI WKT: add support for import/export of (non interrupted) Goode Homolosine Issue found during https://github.com/OSGeo/gdal/pull/4355 when it was found that a WKT with Goode_Homolosine projection parsed as ESRI WKT was mapped wrongly to Interrupted Goode Homolosine --- scripts/build_esri_projection_mapping.py | 7 ++++ src/iso19111/operation/esriparammappings.cpp | 17 +++++++-- test/unit/test_io.cpp | 37 ++++++++++++++++++++ 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/scripts/build_esri_projection_mapping.py b/scripts/build_esri_projection_mapping.py index 3f3d4667e8..30f4ad6c66 100644 --- a/scripts/build_esri_projection_mapping.py +++ b/scripts/build_esri_projection_mapping.py @@ -553,6 +553,13 @@ - XY_Plane_Rotation: EPSG_NAME_PARAMETER_ANGLE_RECTIFIED_TO_SKEW_GRID - Goode_Homolosine: + - WKT2_name: PROJ_WKT2_NAME_METHOD_GOODE_HOMOLOSINE + Params: + - False_Easting: EPSG_NAME_PARAMETER_FALSE_EASTING + - False_Northing: EPSG_NAME_PARAMETER_FALSE_NORTHING + - Central_Meridian: EPSG_NAME_PARAMETER_LONGITUDE_OF_NATURAL_ORIGIN + - Option: 0.0 + - WKT2_name: PROJ_WKT2_NAME_METHOD_INTERRUPTED_GOODE_HOMOLOSINE Params: - False_Easting: EPSG_NAME_PARAMETER_FALSE_EASTING diff --git a/src/iso19111/operation/esriparammappings.cpp b/src/iso19111/operation/esriparammappings.cpp index aea4b3d344..8021b95fff 100644 --- a/src/iso19111/operation/esriparammappings.cpp +++ b/src/iso19111/operation/esriparammappings.cpp @@ -744,9 +744,18 @@ static const ESRIParamMapping paramsESRI_Goode_Homolosine_alt1[] = { EPSG_CODE_PARAMETER_FALSE_NORTHING, "0.0", false}, {"Central_Meridian", EPSG_NAME_PARAMETER_LONGITUDE_OF_NATURAL_ORIGIN, EPSG_CODE_PARAMETER_LONGITUDE_OF_NATURAL_ORIGIN, "0.0", false}, - {"Option", nullptr, 0, "1.0", false}, + {"Option", nullptr, 0, "0.0", false}, {nullptr, nullptr, 0, "0.0", false}}; static const ESRIParamMapping paramsESRI_Goode_Homolosine_alt2[] = { + {"False_Easting", EPSG_NAME_PARAMETER_FALSE_EASTING, + EPSG_CODE_PARAMETER_FALSE_EASTING, "0.0", false}, + {"False_Northing", EPSG_NAME_PARAMETER_FALSE_NORTHING, + EPSG_CODE_PARAMETER_FALSE_NORTHING, "0.0", false}, + {"Central_Meridian", EPSG_NAME_PARAMETER_LONGITUDE_OF_NATURAL_ORIGIN, + EPSG_CODE_PARAMETER_LONGITUDE_OF_NATURAL_ORIGIN, "0.0", false}, + {"Option", nullptr, 0, "1.0", false}, + {nullptr, nullptr, 0, "0.0", false}}; +static const ESRIParamMapping paramsESRI_Goode_Homolosine_alt3[] = { {"False_Easting", EPSG_NAME_PARAMETER_FALSE_EASTING, EPSG_CODE_PARAMETER_FALSE_EASTING, "0.0", false}, {"False_Northing", EPSG_NAME_PARAMETER_FALSE_NORTHING, @@ -1063,11 +1072,13 @@ static const ESRIMethodMapping esriMappings[] = { EPSG_NAME_METHOD_HOTINE_OBLIQUE_MERCATOR_VARIANT_B, EPSG_CODE_METHOD_HOTINE_OBLIQUE_MERCATOR_VARIANT_B, paramsESRI_Rectified_Skew_Orthomorphic_Center}, - {"Goode_Homolosine", PROJ_WKT2_NAME_METHOD_INTERRUPTED_GOODE_HOMOLOSINE, 0, + {"Goode_Homolosine", PROJ_WKT2_NAME_METHOD_GOODE_HOMOLOSINE, 0, paramsESRI_Goode_Homolosine_alt1}, + {"Goode_Homolosine", PROJ_WKT2_NAME_METHOD_INTERRUPTED_GOODE_HOMOLOSINE, 0, + paramsESRI_Goode_Homolosine_alt2}, {"Goode_Homolosine", PROJ_WKT2_NAME_METHOD_INTERRUPTED_GOODE_HOMOLOSINE_OCEAN, 0, - paramsESRI_Goode_Homolosine_alt2}, + paramsESRI_Goode_Homolosine_alt3}, {"Equidistant_Cylindrical_Ellipsoidal", EPSG_NAME_METHOD_EQUIDISTANT_CYLINDRICAL, EPSG_CODE_METHOD_EQUIDISTANT_CYLINDRICAL, diff --git a/test/unit/test_io.cpp b/test/unit/test_io.cpp index a899482e76..72ac18689f 100644 --- a/test/unit/test_io.cpp +++ b/test/unit/test_io.cpp @@ -5718,6 +5718,18 @@ static const struct { {"Northing at projection centre", 2}, }}, + {"Goode_Homolosine", + {{"False_Easting", 1}, + {"False_Northing", 2}, + {"Central_Meridian", 3}, + {"Option", 0.0}}, + "Goode Homolosine", + { + {"Longitude of natural origin", 3}, + {"False easting", 1}, + {"False northing", 2}, + }}, + {"Goode_Homolosine", {{"False_Easting", 1}, {"False_Northing", 2}, @@ -6290,6 +6302,31 @@ TEST(wkt_parse, wkt1_esri_gauss_kruger) { // --------------------------------------------------------------------------- +TEST(wkt_parse, wkt1_esri_goode_homolosine_without_option_0) { + // Not sure if it is really valid to not have PARAMETER["Option",0.0] + // but it seems reasonable to check that we understand that as + // Goode Homolosine and not Interrupted Goode Homolosine (option 1) + auto wkt = "PROJCS[\"unknown\",GEOGCS[\"GCS_unknown\",DATUM[\"D_WGS_1984\"," + "SPHEROID[\"WGS_1984\",6378137.0,298.257223563]]," + "PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]]," + "PROJECTION[\"Goode_Homolosine\"]," + "PARAMETER[\"False_Easting\",0.0]," + "PARAMETER[\"False_Northing\",0.0]," + "PARAMETER[\"Central_Meridian\",0.0]," + "UNIT[\"Meter\",1.0]]"; + + auto obj = WKTParser() + .attachDatabaseContext(DatabaseContext::create()) + .createFromWKT(wkt); + auto crs = nn_dynamic_pointer_cast(obj); + ASSERT_TRUE(crs != nullptr); + + EXPECT_EQ(crs->derivingConversion()->method()->nameStr(), + "Goode Homolosine"); +} + +// --------------------------------------------------------------------------- + TEST(wkt_parse, wkt1_oracle) { // WKT from mdsys.cs_srs Oracle table auto wkt = "PROJCS[\"RGF93 / Lambert-93\", GEOGCS [ \"RGF93\", "