aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2018-11-29 16:04:49 +0100
committerEven Rouault <even.rouault@spatialys.com>2018-11-29 16:04:49 +0100
commit53b83f447b82b59d944d63b336839676d8265b88 (patch)
tree5056ad69eae2a7a5474344d445104fde915b4207
parent7b3ab527074e301bc81cedee7b8111c633ecf306 (diff)
downloadPROJ-53b83f447b82b59d944d63b336839676d8265b88.tar.gz
PROJ-53b83f447b82b59d944d63b336839676d8265b88.zip
importFromWKT v1: properly handle latitude_of_origin=0 for Mercator_1SP
-rw-r--r--src/io.cpp19
-rw-r--r--test/unit/test_io.cpp27
2 files changed, 38 insertions, 8 deletions
diff --git a/src/io.cpp b/src/io.cpp
index 90732a32..3a980993 100644
--- a/src/io.cpp
+++ b/src/io.cpp
@@ -1199,8 +1199,8 @@ struct WKTParser::Private {
static bool hasWebMercPROJ4String(const WKTNodeNNPtr &projCRSNode,
const WKTNodeNNPtr &projectionNode);
- static bool projectionHasParameter(const WKTNodeNNPtr &projCRSNode,
- const char *paramName);
+ static std::string projectionGetParameter(const WKTNodeNNPtr &projCRSNode,
+ const char *paramName);
ConversionNNPtr buildProjection(const WKTNodeNNPtr &projCRSNode,
const WKTNodeNNPtr &projectionNode,
@@ -3044,19 +3044,20 @@ WKTParser::Private::buildProjection(const WKTNodeNNPtr &projCRSNode,
// ---------------------------------------------------------------------------
-bool WKTParser::Private::projectionHasParameter(const WKTNodeNNPtr &projCRSNode,
- const char *paramName) {
+std::string
+WKTParser::Private::projectionGetParameter(const WKTNodeNNPtr &projCRSNode,
+ const char *paramName) {
for (const auto &childNode : projCRSNode->GP()->children()) {
if (ci_equal(childNode->GP()->value(), WKTConstants::PARAMETER)) {
const auto &childNodeChildren = childNode->GP()->children();
if (childNodeChildren.size() == 2 &&
metadata::Identifier::isEquivalentName(
stripQuotes(childNodeChildren[0]).c_str(), paramName)) {
- return true;
+ return childNodeChildren[1]->GP()->value();
}
}
}
- return false;
+ return std::string();
}
// ---------------------------------------------------------------------------
@@ -3078,10 +3079,12 @@ ConversionNNPtr WKTParser::Private::buildProjectionStandard(
bool gdal_3026_hack = false;
if (metadata::Identifier::isEquivalentName(wkt1ProjectionName.c_str(),
"Mercator_1SP") &&
- !projectionHasParameter(projCRSNode, "center_latitude")) {
+ projectionGetParameter(projCRSNode, "center_latitude").empty()) {
// Hack for https://trac.osgeo.org/gdal/ticket/3026
- if (projectionHasParameter(projCRSNode, "latitude_of_origin")) {
+ std::string lat0(
+ projectionGetParameter(projCRSNode, "latitude_of_origin"));
+ if (!lat0.empty() && lat0 != "0" && lat0 != "0.0") {
wkt1ProjectionName = "Mercator_2SP";
gdal_3026_hack = true;
} else {
diff --git a/test/unit/test_io.cpp b/test/unit/test_io.cpp
index 7fdb1358..0cf36766 100644
--- a/test/unit/test_io.cpp
+++ b/test/unit/test_io.cpp
@@ -991,6 +991,33 @@ TEST(wkt_parse, wkt1_projected_with_PROJ4_extension) {
// ---------------------------------------------------------------------------
+TEST(wkt_parse, wkt1_Mercator_1SP_with_latitude_origin_0) {
+ auto wkt = "PROJCS[\"unnamed\",\n"
+ " GEOGCS[\"WGS 84\",\n"
+ " DATUM[\"unknown\",\n"
+ " SPHEROID[\"WGS84\",6378137,298.257223563]],\n"
+ " PRIMEM[\"Greenwich\",0],\n"
+ " UNIT[\"degree\",0.0174532925199433]],\n"
+ " PROJECTION[\"Mercator_1SP\"],\n"
+ " PARAMETER[\"latitude_of_origin\",0],\n"
+ " PARAMETER[\"central_meridian\",0],\n"
+ " PARAMETER[\"scale_factor\",1],\n"
+ " PARAMETER[\"false_easting\",0],\n"
+ " PARAMETER[\"false_northing\",0],\n"
+ " UNIT[\"Meter\",1],\n"
+ " AXIS[\"Easting\",EAST],\n"
+ " AXIS[\"Northing\",NORTH]]";
+ auto obj = WKTParser().createFromWKT(wkt);
+
+ auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+ auto got_wkt = crs->exportToWKT(
+ WKTFormatter::create(WKTFormatter::Convention::WKT1_GDAL).get());
+ EXPECT_TRUE(got_wkt.find("Mercator_1SP") != std::string::npos) << got_wkt;
+}
+
+// ---------------------------------------------------------------------------
+
TEST(wkt_parse, wkt1_krovak_south_west) {
auto wkt =
"PROJCS[\"S-JTSK / Krovak\","