aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Evers <kristianevers@gmail.com>2019-12-16 16:23:20 +0100
committerGitHub <noreply@github.com>2019-12-16 16:23:20 +0100
commit533ca5d12bbb7a4b52fc5cdae439e655f6e54b9c (patch)
tree0669d9ef7dfd3b61a53b1972e6acc04dc81074de
parent59c1f1993b6b62b6320b5faafed0494d0b0ee31c (diff)
parent3a035e99f786b61837efcdf56a86748828e1f155 (diff)
downloadPROJ-533ca5d12bbb7a4b52fc5cdae439e655f6e54b9c.tar.gz
PROJ-533ca5d12bbb7a4b52fc5cdae439e655f6e54b9c.zip
Merge pull request #1786 from rouault/fake_EPSG_102100
Make EPSG:102100 resolve to ESRI:102100 (fixes #1730)
-rw-r--r--data/sql/commit.sql3
-rw-r--r--src/iso19111/io.cpp8
-rw-r--r--test/unit/test_io.cpp14
3 files changed, 25 insertions, 0 deletions
diff --git a/data/sql/commit.sql b/data/sql/commit.sql
index 0468032d..4b17ea2b 100644
--- a/data/sql/commit.sql
+++ b/data/sql/commit.sql
@@ -36,6 +36,9 @@ FOR EACH ROW BEGIN
lower(g1.grid_name) = lower(g2.grid_name) AND
g1.auth_name = 'PROJ' AND g2.auth_name = 'EPSG');
+ SELECT RAISE(ABORT, 'Arg! there is now a EPSG:102100 object. Hack in createFromUserInput() will no longer work')
+ WHERE EXISTS(SELECT 1 FROM crs_view WHERE auth_name == 'EPSG' AND code = '102100');
+
-- check geoid_model table
SELECT RAISE(ABORT, 'missing GEOID99 in geoid_model')
WHERE NOT EXISTS(SELECT 1 FROM geoid_model WHERE name = 'GEOID99');
diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp
index c704e1c1..a67238d9 100644
--- a/src/iso19111/io.cpp
+++ b/src/iso19111/io.cpp
@@ -5675,6 +5675,14 @@ static BaseObjectNNPtr createFromUserInput(const std::string &text,
try {
return factory->createCoordinateReferenceSystem(code);
} catch (...) {
+
+ // Convenience for well-known misused code
+ // See https://github.com/OSGeo/PROJ/issues/1730
+ if (ci_equal(authName, "EPSG") && code == "102100") {
+ factory = AuthorityFactory::create(dbContextNNPtr, "ESRI");
+ return factory->createCoordinateReferenceSystem(code);
+ }
+
const auto authorities = dbContextNNPtr->getAuthorities();
for (const auto &authCandidate : authorities) {
if (ci_equal(authCandidate, authName)) {
diff --git a/test/unit/test_io.cpp b/test/unit/test_io.cpp
index 15ab8706..4242a15c 100644
--- a/test/unit/test_io.cpp
+++ b/test/unit/test_io.cpp
@@ -9359,6 +9359,20 @@ TEST(io, createFromUserInput) {
// ---------------------------------------------------------------------------
+TEST(io, createFromUserInput_hack_EPSG_102100) {
+ auto dbContext = DatabaseContext::create();
+ auto obj = createFromUserInput("EPSG:102100", dbContext);
+ auto crs = nn_dynamic_pointer_cast<CRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+ const auto &ids = crs->identifiers();
+ ASSERT_EQ(ids.size(), 1U);
+ // we do not lie on the real authority
+ EXPECT_EQ(*ids[0]->codeSpace(), "ESRI");
+ EXPECT_EQ(ids[0]->code(), "102100");
+}
+
+// ---------------------------------------------------------------------------
+
TEST(io, guessDialect) {
EXPECT_EQ(WKTParser().guessDialect("LOCAL_CS[\"foo\"]"),
WKTParser::WKTGuessedDialect::WKT1_GDAL);