aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2021-04-10 20:15:34 +0200
committerGitHub <noreply@github.com>2021-04-10 20:15:34 +0200
commit34ea13913717b20982778d5e5f13b4a5ee8288ab (patch)
treec16c443866a0eec19c488e415fc75815a090327e /test
parent84a679954b1fa4c41c7bdbac87013be78b64bea4 (diff)
parenta77ce5cf343c00fc95b5f3d9b2c27e02b6205fd3 (diff)
downloadPROJ-34ea13913717b20982778d5e5f13b4a5ee8288ab.tar.gz
PROJ-34ea13913717b20982778d5e5f13b4a5ee8288ab.zip
Merge pull request #2656 from rouault/createFromUserInput_improvements
createFromUserInput(): various enhancements
Diffstat (limited to 'test')
-rw-r--r--test/unit/test_factory.cpp23
-rw-r--r--test/unit/test_io.cpp248
2 files changed, 271 insertions, 0 deletions
diff --git a/test/unit/test_factory.cpp b/test/unit/test_factory.cpp
index c67f1490..edc8b190 100644
--- a/test/unit/test_factory.cpp
+++ b/test/unit/test_factory.cpp
@@ -4244,4 +4244,27 @@ TEST(factory, objectInsertion) {
}
}
+// ---------------------------------------------------------------------------
+
+TEST(factory, ogc_timecrs) {
+ auto ctxt = DatabaseContext::create();
+ auto factory = AuthorityFactory::create(ctxt, Identifier::OGC);
+ factory->createCoordinateReferenceSystem("AnsiDate");
+ factory->createCoordinateReferenceSystem("JulianDate");
+ factory->createCoordinateReferenceSystem("UnixTime");
+}
+
+// ---------------------------------------------------------------------------
+
+TEST(factory, ogc_crs) {
+ auto ctxt = DatabaseContext::create();
+ auto factory = AuthorityFactory::create(ctxt, Identifier::OGC);
+ factory->createCoordinateReferenceSystem("CRS84");
+ factory->createCoordinateReferenceSystem("84");
+ factory->createCoordinateReferenceSystem("CRS27");
+ factory->createCoordinateReferenceSystem("CRS83");
+}
+
+// ---------------------------------------------------------------------------
+
} // namespace
diff --git a/test/unit/test_io.cpp b/test/unit/test_io.cpp
index 9d627ce9..780db16d 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,22 @@ 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_NO_THROW(
+ createFromUserInput("urn:x-ogc:def: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);
@@ -10637,6 +10655,236 @@ TEST(io, createFromUserInput) {
// ---------------------------------------------------------------------------
+TEST(io, createFromUserInput_ogc_crs_url) {
+ auto dbContext = DatabaseContext::create();
+
+ {
+ auto obj = createFromUserInput(
+ "http://www.opengis.net/def/crs/EPSG/0/4326", dbContext);
+ auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+ }
+
+ EXPECT_THROW(
+ createFromUserInput("http://www.opengis.net/def/crs", dbContext),
+ ParsingException);
+
+ EXPECT_THROW(
+ createFromUserInput("http://www.opengis.net/def/crs/EPSG/0", dbContext),
+ ParsingException);
+
+ EXPECT_THROW(createFromUserInput(
+ "http://www.opengis.net/def/crs/EPSG/0/XXXX", dbContext),
+ NoSuchAuthorityCodeException);
+
+ {
+ auto obj = createFromUserInput(
+ "http://www.opengis.net/def/crs-compound?1=http://www.opengis.net/"
+ "def/crs/EPSG/0/4326&2=http://www.opengis.net/def/crs/EPSG/0/3855",
+ dbContext);
+ auto crs = nn_dynamic_pointer_cast<CompoundCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+ EXPECT_EQ(crs->nameStr(), "WGS 84 + EGM2008 height");
+ }
+
+ // No part
+ EXPECT_THROW(createFromUserInput("http://www.opengis.net/def/crs-compound?",
+ dbContext),
+ ParsingException);
+
+ // Just one part
+ EXPECT_THROW(
+ createFromUserInput("http://www.opengis.net/def/crs-compound?1=http://"
+ "www.opengis.net/def/crs/EPSG/0/4326",
+ dbContext),
+ InvalidCompoundCRSException);
+
+ // Invalid compound CRS
+ EXPECT_THROW(
+ createFromUserInput(
+ "http://www.opengis.net/def/crs-compound?1=http://www.opengis.net/"
+ "def/crs/EPSG/0/4326&2=http://www.opengis.net/def/crs/EPSG/0/4326",
+ dbContext),
+ InvalidCompoundCRSException);
+
+ // Missing 2=
+ EXPECT_THROW(
+ createFromUserInput(
+ "http://www.opengis.net/def/crs-compound?1=http://www.opengis.net/"
+ "def/crs/EPSG/0/4326&3=http://www.opengis.net/def/crs/EPSG/0/3855",
+ dbContext),
+ ParsingException);
+
+ // Invalid query parameter
+ EXPECT_THROW(
+ createFromUserInput("http://www.opengis.net/def/crs-compound?1=http://"
+ "www.opengis.net/def/crs/EPSG/0/4326&bla",
+ dbContext),
+ ParsingException);
+
+ // Invalid query parameter
+ EXPECT_THROW(
+ createFromUserInput("http://www.opengis.net/def/crs-compound?1=http://"
+ "www.opengis.net/def/crs/EPSG/0/4326&two=http://"
+ "www.opengis.net/def/crs/EPSG/0/3855",
+ dbContext),
+ ParsingException);
+}
+
+// ---------------------------------------------------------------------------
+
+TEST(io, createFromUserInput_OGC_AUTO) {
+
+ // UTM north
+ {
+ auto obj = createFromUserInput("AUTO:42001,-117,33", nullptr);
+ auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+ EXPECT_EQ(crs->derivingConversion()->nameStr(), "UTM zone 11N");
+ EXPECT_EQ(
+ crs->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=utm +zone=11 +datum=WGS84 +units=m +no_defs +type=crs");
+ }
+
+ // UTM south
+ {
+ auto obj = createFromUserInput("AUTO:42001,-117,-33", nullptr);
+ auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+ EXPECT_EQ(crs->derivingConversion()->nameStr(), "UTM zone 11S");
+ EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=utm +zone=11 +south +datum=WGS84 +units=m +no_defs "
+ "+type=crs");
+ }
+
+ // Explicit unit: metre
+ {
+ auto obj = createFromUserInput("AUTO:42001,9001,-117,33", nullptr);
+ auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+ EXPECT_EQ(crs->derivingConversion()->nameStr(), "UTM zone 11N");
+ EXPECT_EQ(
+ crs->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=utm +zone=11 +datum=WGS84 +units=m +no_defs +type=crs");
+ }
+
+ // Explicit unit: foot
+ {
+ auto obj = createFromUserInput("AUTO:42001,9002,-117,33", nullptr);
+ auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+ EXPECT_EQ(crs->derivingConversion()->nameStr(), "UTM zone 11N");
+ EXPECT_EQ(
+ crs->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=utm +zone=11 +datum=WGS84 +units=ft +no_defs +type=crs");
+ }
+
+ // Explicit unit: US survery foot
+ {
+ auto obj = createFromUserInput("AUTO:42001,9003,-117,33", nullptr);
+ auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+ EXPECT_EQ(crs->derivingConversion()->nameStr(), "UTM zone 11N");
+ EXPECT_EQ(
+ crs->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=utm +zone=11 +datum=WGS84 +units=us-ft +no_defs +type=crs");
+ }
+
+ // Explicit unit: invalid
+ EXPECT_THROW(createFromUserInput("AUTO:42001,0,-117,33", nullptr),
+ ParsingException);
+
+ // Invalid longitude
+ EXPECT_THROW(createFromUserInput("AUTO:42001,-180.01,33", nullptr),
+ ParsingException);
+ EXPECT_NO_THROW(createFromUserInput("AUTO:42001,-180,33", nullptr));
+ EXPECT_THROW(createFromUserInput("AUTO:42001,180,33", nullptr),
+ ParsingException);
+ EXPECT_NO_THROW(createFromUserInput("AUTO:42001,179.999,33", nullptr));
+
+ // Too short
+ EXPECT_THROW(createFromUserInput("AUTO:42001", nullptr), ParsingException);
+
+ // TMerc / north
+ {
+ auto obj = createFromUserInput("AUTO:42002,1,2", nullptr);
+ auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+ EXPECT_EQ(crs->derivingConversion()->nameStr(), "Transverse Mercator");
+ EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=tmerc +lat_0=0 +lon_0=1 +k=0.9996 +x_0=500000 +y_0=0 "
+ "+datum=WGS84 +units=m +no_defs +type=crs");
+ }
+
+ // TMerc / south
+ {
+ auto obj = createFromUserInput("AUTO:42002,1,-2", nullptr);
+ auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+ EXPECT_EQ(crs->derivingConversion()->nameStr(), "Transverse Mercator");
+ EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=tmerc +lat_0=0 +lon_0=1 +k=0.9996 +x_0=500000 "
+ "+y_0=10000000 +datum=WGS84 +units=m +no_defs +type=crs");
+ }
+
+ // Orthographic
+ {
+ auto obj = createFromUserInput("AUTO:42003,1,2", nullptr);
+ auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+ EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=ortho +lat_0=2 +lon_0=1 +x_0=0 +y_0=0 +datum=WGS84 "
+ "+units=m +no_defs +type=crs");
+ }
+
+ // Equirectangular
+ {
+ auto obj = createFromUserInput("AUTO:42004,1,0", nullptr);
+ auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+ EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=eqc +lat_ts=0 +lat_0=0 +lon_0=1 +x_0=0 +y_0=0 "
+ "+datum=WGS84 +units=m +no_defs +type=crs");
+ }
+
+ // Mollweide
+ {
+ auto obj = createFromUserInput("AUTO:42005,1", nullptr);
+ auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+ EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=moll +lon_0=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m "
+ "+no_defs +type=crs");
+ }
+
+ // Mollweide with explicit unit
+ {
+ auto obj = createFromUserInput("AUTO:42005,9001,1", nullptr);
+ auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+ EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=moll +lon_0=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m "
+ "+no_defs +type=crs");
+ }
+
+ // Invalid method id
+ EXPECT_THROW(createFromUserInput("AUTO:42999,1,0", nullptr),
+ ParsingException);
+
+ // As urn:ogc:def:crs:OGC::AUTOxxxx:....
+ {
+ auto obj = createFromUserInput("urn:ogc:def:crs:OGC::AUTO42001:-117:33",
+ nullptr);
+ auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+ EXPECT_EQ(
+ crs->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=utm +zone=11 +datum=WGS84 +units=m +no_defs +type=crs");
+ }
+}
+
+// ---------------------------------------------------------------------------
+
TEST(io, createFromUserInput_hack_EPSG_102100) {
auto dbContext = DatabaseContext::create();
auto obj = createFromUserInput("EPSG:102100", dbContext);