diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2020-04-15 23:49:54 +0200 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2020-04-16 12:09:54 +0200 |
| commit | a8fdadfa3f726d110bdb964b3952d8c50a8d2f28 (patch) | |
| tree | 0076d86fd05fca2b6d410a7e552ae554327e4157 | |
| parent | c91966953d9ad327cbb3b9d80842cc0d3957df42 (diff) | |
| download | PROJ-a8fdadfa3f726d110bdb964b3952d8c50a8d2f28.tar.gz PROJ-a8fdadfa3f726d110bdb964b3952d8c50a8d2f28.zip | |
Map ESRI WKT for Adams_Square_II to +proj=adams_ws2
| -rw-r--r-- | src/iso19111/coordinateoperation.cpp | 36 | ||||
| -rw-r--r-- | src/iso19111/io.cpp | 3 | ||||
| -rw-r--r-- | test/unit/test_operation.cpp | 23 |
3 files changed, 61 insertions, 1 deletions
diff --git a/src/iso19111/coordinateoperation.cpp b/src/iso19111/coordinateoperation.cpp index 822d09ac..d8b7f5e8 100644 --- a/src/iso19111/coordinateoperation.cpp +++ b/src/iso19111/coordinateoperation.cpp @@ -6183,6 +6183,42 @@ void Conversion::_exportToPROJString( formatter->addParam("o_lat_p", -southPoleLat); formatter->addParam("lon_0", southPoleLon); bConversionDone = true; + } else if (ci_equal(methodName, "Adams_Square_II")) { + // Look for ESRI method and parameter names (to be opposed + // to the OGC WKT2 names we use elsewhere, because there's no mapping + // of those parameters to OGC WKT2) + // We also reject non-default values for a number of parameters, + // because they are not implemented on PROJ side. The subset we + // support can handle ESRI:54098 WGS_1984_Adams_Square_II, but not + // ESRI:54099 WGS_1984_Spilhaus_Ocean_Map_in_Square + const double falseEasting = parameterValueNumeric( + "False_Easting", common::UnitOfMeasure::METRE); + const double falseNorthing = parameterValueNumeric( + "False_Northing", common::UnitOfMeasure::METRE); + const double scaleFactor = + parameterValue("Scale_Factor", 0) + ? parameterValueNumeric("Scale_Factor", + common::UnitOfMeasure::SCALE_UNITY) + : 1.0; + const double azimuth = + parameterValueNumeric("Azimuth", common::UnitOfMeasure::DEGREE); + const double longitudeOfCenter = parameterValueNumeric( + "Longitude_Of_Center", common::UnitOfMeasure::DEGREE); + const double latitudeOfCenter = parameterValueNumeric( + "Latitude_Of_Center", common::UnitOfMeasure::DEGREE); + const double XYPlaneRotation = parameterValueNumeric( + "XY_Plane_Rotation", common::UnitOfMeasure::DEGREE); + if (scaleFactor != 1.0 || azimuth != 0.0 || latitudeOfCenter != 0.0 || + XYPlaneRotation != 0.0) { + throw io::FormattingException("Unsupported value for one or " + "several parameters of " + "Adams_Square_II"); + } + formatter->addStep("adams_ws2"); + formatter->addParam("lon_0", longitudeOfCenter); + formatter->addParam("x_0", falseEasting); + formatter->addParam("y_0", falseNorthing); + bConversionDone = true; } else if (formatter->convention() == io::PROJStringFormatter::Convention::PROJ_5 && isZUnitConversion) { diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp index 07620864..8968b70e 100644 --- a/src/iso19111/io.cpp +++ b/src/iso19111/io.cpp @@ -2899,7 +2899,8 @@ UnitOfMeasure WKTParser::Private::guessUnitForParameter( ci_find(paramName, "parallel") != std::string::npos || ci_find(paramName, "azimuth") != std::string::npos || ci_find(paramName, "angle") != std::string::npos || - ci_find(paramName, "heading") != std::string::npos) { + ci_find(paramName, "heading") != std::string::npos || + ci_find(paramName, "rotation") != std::string::npos) { unit = defaultAngularUnit; } else if (ci_find(paramName, "easting") != std::string::npos || ci_find(paramName, "northing") != std::string::npos || diff --git a/test/unit/test_operation.cpp b/test/unit/test_operation.cpp index 99e05dd1..bddbad4a 100644 --- a/test/unit/test_operation.cpp +++ b/test/unit/test_operation.cpp @@ -4195,6 +4195,29 @@ TEST(operation, laborde_oblique_mercator) { // --------------------------------------------------------------------------- +TEST(operation, adams_ws2_export) { + auto dbContext = DatabaseContext::create(); + // ESRI:54098 WGS_1984_Adams_Square_II + auto crs = AuthorityFactory::create(dbContext, "ESRI") + ->createProjectedCRS("54098"); + EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=adams_ws2 +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m " + "+no_defs +type=crs"); +} + +// --------------------------------------------------------------------------- + +TEST(operation, adams_ws2_export_failure) { + auto dbContext = DatabaseContext::create(); + // ESRI:54099 WGS_1984_Spilhaus_Ocean_Map_in_Square + auto crs = AuthorityFactory::create(dbContext, "ESRI") + ->createProjectedCRS("54099"); + EXPECT_THROW(crs->exportToPROJString(PROJStringFormatter::create().get()), + FormattingException); +} + +// --------------------------------------------------------------------------- + TEST(operation, PROJ_based) { auto conv = SingleOperation::createPROJBased(PropertyMap(), "+proj=merc", nullptr, nullptr); |
