diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2021-04-10 17:15:51 +0200 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2021-04-10 19:17:39 +0200 |
| commit | 76d8cb9dafd274df537b87be068db282af8d17d7 (patch) | |
| tree | e3c8b70e5de90542696f9f42a880d7065e8f657b | |
| parent | 35a9ffc2d147c04c3a58c48f16d7c748271e5003 (diff) | |
| download | PROJ-76d8cb9dafd274df537b87be068db282af8d17d7.tar.gz PROJ-76d8cb9dafd274df537b87be068db282af8d17d7.zip | |
createFromUserInput(): add support for (legacy) urn:opengis:crs:EPSG:0:XXXX syntax
| -rw-r--r-- | src/iso19111/io.cpp | 18 | ||||
| -rw-r--r-- | test/unit/test_io.cpp | 16 |
2 files changed, 33 insertions, 1 deletions
diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp index 2d31fd59..ffd78653 100644 --- a/src/iso19111/io.cpp +++ b/src/iso19111/io.cpp @@ -6485,7 +6485,7 @@ static BaseObjectNNPtr createFromUserInput(const std::string &text, } // urn:ogc:def:crs:EPSG::4326 - if (tokens.size() == 7) { + if (tokens.size() == 7 && tokens[0] == "urn") { if (!dbContext) { throw ParsingException("no database context specified"); } @@ -6514,6 +6514,22 @@ static BaseObjectNNPtr createFromUserInput(const std::string &text, throw ParsingException(concat("unhandled object type: ", type)); } + // Legacy urn:opengis:crs:EPSG:0:4326 (note the missing def: compared to + // above) + if (tokens.size() == 6 && tokens[0] == "urn") { + if (!dbContext) { + throw ParsingException("no database context specified"); + } + const auto &type = tokens[2]; + auto factory = + AuthorityFactory::create(NN_NO_CHECK(dbContext), tokens[3]); + const auto &code = tokens[5]; + if (type == "crs") { + return factory->createCoordinateReferenceSystem(code); + } + throw ParsingException(concat("unhandled object type: ", type)); + } + if (dbContext) { auto factory = AuthorityFactory::create(NN_NO_CHECK(dbContext), std::string()); diff --git a/test/unit/test_io.cpp b/test/unit/test_io.cpp index 708b3874..7e81ae95 100644 --- a/test/unit/test_io.cpp +++ b/test/unit/test_io.cpp @@ -10349,6 +10349,8 @@ TEST(io, createFromUserInput) { EXPECT_NO_THROW(createFromUserInput("epsg:4326", dbContext)); EXPECT_NO_THROW( createFromUserInput("urn:ogc:def:crs:EPSG::4326", dbContext)); + EXPECT_THROW(createFromUserInput("urn:ogc:def:crs:EPSG::4326", nullptr), + ParsingException); EXPECT_NO_THROW(createFromUserInput( "urn:ogc:def:coordinateOperation:EPSG::1671", dbContext)); EXPECT_NO_THROW( @@ -10357,6 +10359,20 @@ TEST(io, createFromUserInput) { createFromUserInput("urn:ogc:def:meridian:EPSG::8901", dbContext)); EXPECT_NO_THROW( createFromUserInput("urn:ogc:def:ellipsoid:EPSG::7030", dbContext)); + + // Legacy formulations + EXPECT_NO_THROW( + createFromUserInput("urn:x-ogc:def:crs:EPSG::4326", dbContext)); + EXPECT_NO_THROW( + createFromUserInput("urn:opengis:def:crs:EPSG::4326", dbContext)); + EXPECT_NO_THROW( + createFromUserInput("urn:opengis:crs:EPSG::4326", dbContext)); + EXPECT_THROW(createFromUserInput("urn:opengis:crs:EPSG::4326", nullptr), + ParsingException); + EXPECT_THROW( + createFromUserInput("urn:opengis:unhandled:EPSG::4326", dbContext), + ParsingException); + { auto obj = createFromUserInput("EPSG:2393+5717", dbContext); auto crs = nn_dynamic_pointer_cast<CompoundCRS>(obj); |
