aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2020-04-15 23:49:54 +0200
committerEven Rouault <even.rouault@spatialys.com>2020-04-16 12:09:54 +0200
commita8fdadfa3f726d110bdb964b3952d8c50a8d2f28 (patch)
tree0076d86fd05fca2b6d410a7e552ae554327e4157
parentc91966953d9ad327cbb3b9d80842cc0d3957df42 (diff)
downloadPROJ-a8fdadfa3f726d110bdb964b3952d8c50a8d2f28.tar.gz
PROJ-a8fdadfa3f726d110bdb964b3952d8c50a8d2f28.zip
Map ESRI WKT for Adams_Square_II to +proj=adams_ws2
-rw-r--r--src/iso19111/coordinateoperation.cpp36
-rw-r--r--src/iso19111/io.cpp3
-rw-r--r--test/unit/test_operation.cpp23
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);