Skip to content

Commit

Permalink
ESRI WKT: add support for import/export of (non interrupted) Goode Ho…
Browse files Browse the repository at this point in the history
…molosine

Issue found during OSGeo/gdal#4355 when it was found
that a WKT with Goode_Homolosine projection parsed as ESRI WKT was mapped
wrongly to Interrupted Goode Homolosine
  • Loading branch information
rouault committed Aug 27, 2021
1 parent cd1d1fb commit 3f9c0a0
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 3 deletions.
7 changes: 7 additions & 0 deletions scripts/build_esri_projection_mapping.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
17 changes: 14 additions & 3 deletions src/iso19111/operation/esriparammappings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down
37 changes: 37 additions & 0 deletions test/unit/test_io.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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},
Expand Down Expand Up @@ -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<ProjectedCRS>(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\", "
Expand Down

0 comments on commit 3f9c0a0

Please sign in to comment.