diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2019-12-05 13:32:16 +0100 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2019-12-05 13:32:16 +0100 |
| commit | 97bbfe32aacc361a5c34bcb2c5045c977d21de4b (patch) | |
| tree | f3975439b9f8ca57d477fb4393b7460feabcaeff | |
| parent | f3a9e54c09829cec51062ebb754545c79370ddfe (diff) | |
| download | PROJ-97bbfe32aacc361a5c34bcb2c5045c977d21de4b.tar.gz PROJ-97bbfe32aacc361a5c34bcb2c5045c977d21de4b.zip | |
import from PROJ string CRS: better deal with strings that look like Google Mercator projection, but with subtlely different parameters (fixes https://github.com/OSGeo/gdal/issues/2087)
| -rw-r--r-- | src/iso19111/io.cpp | 6 | ||||
| -rw-r--r-- | test/unit/test_io.cpp | 35 |
2 files changed, 38 insertions, 3 deletions
diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp index 0d98e2de..2aec5fac 100644 --- a/src/iso19111/io.cpp +++ b/src/iso19111/io.cpp @@ -8582,7 +8582,11 @@ CRSNNPtr PROJStringParser::Private::buildProjectedCRS( break; } } - if (getNumericValue(getParamValue(step, "a")) == 6378137) { + if (getNumericValue(getParamValue(step, "a")) == 6378137 && + getAngularValue(getParamValue(step, "lon_0")) == 0.0 && + getAngularValue(getParamValue(step, "lat_0")) == 0.0 && + getAngularValue(getParamValue(step, "x_0")) == 0.0 && + getAngularValue(getParamValue(step, "y_0")) == 0.0) { bWebMercator = true; } } else if (hasParamValue(step, "lat_ts")) { diff --git a/test/unit/test_io.cpp b/test/unit/test_io.cpp index 552eb5bf..38dfc2b4 100644 --- a/test/unit/test_io.cpp +++ b/test/unit/test_io.cpp @@ -8186,9 +8186,10 @@ TEST(io, projparse_merc_variant_B) { // --------------------------------------------------------------------------- TEST(io, projparse_merc_google_mercator) { - auto obj = PROJStringParser().createFromPROJString( + auto projString = "+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 " - "+k=1 +units=m +nadgrids=@null +type=crs"); + "+k=1 +units=m +nadgrids=@null +no_defs +type=crs"; + auto obj = PROJStringParser().createFromPROJString(projString); auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj); ASSERT_TRUE(crs != nullptr); WKTFormatterNNPtr f(WKTFormatter::create()); @@ -8202,6 +8203,36 @@ TEST(io, projparse_merc_google_mercator) { EXPECT_TRUE(wkt.find("DATUM[\"World Geodetic System 1984\"") != std::string::npos) << wkt; + + EXPECT_EQ( + replaceAll(crs->exportToPROJString(PROJStringFormatter::create().get()), + " +wktext", ""), + projString); +} + +// --------------------------------------------------------------------------- + +TEST(io, projparse_merc_not_quite_google_mercator) { + auto projString = + "+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=10 +x_0=0 +y_0=0 " + "+k=1 +units=m +nadgrids=@null +no_defs +type=crs"; + auto obj = PROJStringParser().createFromPROJString(projString); + auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj); + ASSERT_TRUE(crs != nullptr); + WKTFormatterNNPtr f(WKTFormatter::create()); + f->simulCurNodeHasId(); + f->setMultiLine(false); + crs->exportToWKT(f.get()); + auto wkt = f->toString(); + EXPECT_TRUE(wkt.find("METHOD[\"Popular Visualisation Pseudo " + "Mercator\",ID[\"EPSG\",1024]") != std::string::npos) + << wkt; + EXPECT_TRUE(wkt.find("DATUM[\"unknown\",") != std::string::npos) << wkt; + + EXPECT_EQ( + replaceAll(crs->exportToPROJString(PROJStringFormatter::create().get()), + " +wktext", ""), + projString); } // --------------------------------------------------------------------------- |
