aboutsummaryrefslogtreecommitdiff
path: root/test/unit/test_crs.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2020-01-22 14:09:35 +0100
committerGitHub <noreply@github.com>2020-01-22 14:09:35 +0100
commita95431d8666db9953115a3a824db396f8aa82b52 (patch)
tree21117e52f95b8f36880efef8cd71c1fcec21242c /test/unit/test_crs.cpp
parentc5fb54168665d41503ef3a08f0534da58949b632 (diff)
parent4724025e6c817761052fc0dc8810fd489a9e0104 (diff)
downloadPROJ-a95431d8666db9953115a3a824db396f8aa82b52.tar.gz
PROJ-a95431d8666db9953115a3a824db396f8aa82b52.zip
Merge pull request #1855 from rouault/rfc4_merge_back_master
[RFC4_dev] Merge master back to rfc4 latest branch
Diffstat (limited to 'test/unit/test_crs.cpp')
-rw-r--r--test/unit/test_crs.cpp184
1 files changed, 179 insertions, 5 deletions
diff --git a/test/unit/test_crs.cpp b/test/unit/test_crs.cpp
index 427fd741..e6189a97 100644
--- a/test/unit/test_crs.cpp
+++ b/test/unit/test_crs.cpp
@@ -57,7 +57,8 @@ namespace {
struct UnrelatedObject : public IComparable {
UnrelatedObject() = default;
- bool _isEquivalentTo(const IComparable *, Criterion) const override {
+ bool _isEquivalentTo(const IComparable *, Criterion,
+ const DatabaseContextPtr &) const override {
assert(false);
return false;
}
@@ -755,7 +756,9 @@ TEST(crs, EPSG_27561_projected_with_geodetic_in_grad_as_PROJ_string_and_WKT1) {
nn_crs->DerivedCRS::isEquivalentTo(createUnrelatedObject().get()));
auto wkt1 = crs->exportToWKT(
- WKTFormatter::create(WKTFormatter::Convention::WKT1_GDAL).get());
+ WKTFormatter::create(WKTFormatter::Convention::WKT1_GDAL,
+ DatabaseContext::create())
+ .get());
EXPECT_EQ(
wkt1,
"PROJCS[\"NTF (Paris) / Lambert Nord France\",\n"
@@ -856,7 +859,9 @@ TEST(crs, EPSG_2222_projected_unit_foot_as_PROJ_string_and_WKT1) {
"+x_0=213360 +y_0=0 +datum=NAD83 +units=ft +no_defs +type=crs");
auto wkt1 = crs->exportToWKT(
- WKTFormatter::create(WKTFormatter::Convention::WKT1_GDAL).get());
+ WKTFormatter::create(WKTFormatter::Convention::WKT1_GDAL,
+ DatabaseContext::create())
+ .get());
EXPECT_EQ(wkt1,
"PROJCS[\"NAD83 / Arizona East (ft)\",\n"
" GEOGCS[\"NAD83\",\n"
@@ -903,11 +908,13 @@ TEST(crs, projected_with_parameter_unit_different_than_cs_unit_as_WKT1) {
ASSERT_TRUE(crs != nullptr);
auto wkt1 = crs->exportToWKT(
- WKTFormatter::create(WKTFormatter::Convention::WKT1_GDAL).get());
+ WKTFormatter::create(WKTFormatter::Convention::WKT1_GDAL,
+ DatabaseContext::create())
+ .get());
EXPECT_EQ(wkt1,
"PROJCS[\"unknown\",\n"
" GEOGCS[\"unknown\",\n"
- " DATUM[\"Unknown_based_on_GRS80_ellipsoid\",\n"
+ " DATUM[\"Unknown based on GRS80 ellipsoid\",\n"
" SPHEROID[\"GRS 1980\",6378137,298.257222101]],\n"
" PRIMEM[\"Greenwich\",0],\n"
" UNIT[\"degree\",0.0174532925199433,\n"
@@ -943,6 +950,16 @@ TEST(crs, EPSG_32661_projected_north_pole_north_east) {
ASSERT_TRUE(op != nullptr);
EXPECT_EQ(op->exportToPROJString(PROJStringFormatter::create().get()),
proj_string);
+
+ auto opNormalized = op->normalizeForVisualization();
+ auto proj_string_normalized =
+ "+proj=pipeline +step +proj=unitconvert +xy_in=deg +xy_out=rad "
+ "+step "
+ "+proj=stere +lat_0=90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 "
+ "+ellps=WGS84";
+ EXPECT_EQ(
+ opNormalized->exportToPROJString(PROJStringFormatter::create().get()),
+ proj_string_normalized);
}
// ---------------------------------------------------------------------------
@@ -964,6 +981,16 @@ TEST(crs, EPSG_5041_projected_north_pole_east_north) {
ASSERT_TRUE(op != nullptr);
EXPECT_EQ(op->exportToPROJString(PROJStringFormatter::create().get()),
proj_string);
+
+ auto opNormalized = op->normalizeForVisualization();
+ auto proj_string_normalized =
+ "+proj=pipeline +step +proj=unitconvert +xy_in=deg +xy_out=rad "
+ "+step "
+ "+proj=stere +lat_0=90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 "
+ "+ellps=WGS84";
+ EXPECT_EQ(
+ opNormalized->exportToPROJString(PROJStringFormatter::create().get()),
+ proj_string_normalized);
}
// ---------------------------------------------------------------------------
@@ -985,6 +1012,16 @@ TEST(crs, EPSG_32761_projected_south_pole_north_east) {
ASSERT_TRUE(op != nullptr);
EXPECT_EQ(op->exportToPROJString(PROJStringFormatter::create().get()),
proj_string);
+
+ auto opNormalized = op->normalizeForVisualization();
+ auto proj_string_normalized =
+ "+proj=pipeline +step +proj=unitconvert +xy_in=deg +xy_out=rad "
+ "+step "
+ "+proj=stere +lat_0=-90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 "
+ "+ellps=WGS84";
+ EXPECT_EQ(
+ opNormalized->exportToPROJString(PROJStringFormatter::create().get()),
+ proj_string_normalized);
}
// ---------------------------------------------------------------------------
@@ -1006,6 +1043,16 @@ TEST(crs, EPSG_5042_projected_south_pole_east_north) {
ASSERT_TRUE(op != nullptr);
EXPECT_EQ(op->exportToPROJString(PROJStringFormatter::create().get()),
proj_string);
+
+ auto opNormalized = op->normalizeForVisualization();
+ auto proj_string_normalized =
+ "+proj=pipeline +step +proj=unitconvert +xy_in=deg +xy_out=rad "
+ "+step "
+ "+proj=stere +lat_0=-90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 "
+ "+ellps=WGS84";
+ EXPECT_EQ(
+ opNormalized->exportToPROJString(PROJStringFormatter::create().get()),
+ proj_string_normalized);
}
// ---------------------------------------------------------------------------
@@ -1511,6 +1558,75 @@ TEST(crs, geodeticcrs_identify_db) {
EXPECT_EQ(res.front().first->identifiers()[0]->code(), "4326");
EXPECT_EQ(res.front().second, 70);
}
+
+ {
+ // Identify by code, but datum name is an alias of the official one
+ auto wkt = "GEOGCRS[\"GDA2020\",\n"
+ " DATUM[\"GDA2020\",\n"
+ " ELLIPSOID[\"GRS_1980\",6378137,298.257222101,\n"
+ " LENGTHUNIT[\"metre\",1]]],\n"
+ " PRIMEM[\"Greenwich\",0,\n"
+ " ANGLEUNIT[\"Degree\",0.0174532925199433]],\n"
+ " CS[ellipsoidal,2],\n"
+ " AXIS[\"geodetic latitude (Lat)\",north,\n"
+ " ORDER[1],\n"
+ " ANGLEUNIT[\"degree\",0.0174532925199433]],\n"
+ " AXIS[\"geodetic longitude (Lon)\",east,\n"
+ " ORDER[2],\n"
+ " ANGLEUNIT[\"degree\",0.0174532925199433]],\n"
+ " ID[\"EPSG\",7844]]";
+ auto obj = WKTParser().createFromWKT(wkt);
+ auto crs = nn_dynamic_pointer_cast<GeodeticCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+
+ auto allFactory = AuthorityFactory::create(dbContext, std::string());
+ auto res = crs->identify(allFactory);
+ ASSERT_EQ(res.size(), 1U);
+ ASSERT_TRUE(!res.front().first->identifiers().empty());
+ EXPECT_EQ(*res.front().first->identifiers()[0]->codeSpace(), "EPSG");
+ EXPECT_EQ(res.front().first->identifiers()[0]->code(), "7844");
+ EXPECT_EQ(res.front().second, 100);
+
+ EXPECT_TRUE(crs->_isEquivalentTo(res.front().first.get(),
+ IComparable::Criterion::EQUIVALENT,
+ dbContext));
+ EXPECT_TRUE(res.front().first->_isEquivalentTo(
+ crs.get(), IComparable::Criterion::EQUIVALENT, dbContext));
+ }
+
+ {
+ // Identify by name, but datum name is an alias of the official one
+ auto wkt = "GEOGCRS[\"GDA2020\",\n"
+ " DATUM[\"GDA2020\",\n"
+ " ELLIPSOID[\"GRS_1980\",6378137,298.257222101,\n"
+ " LENGTHUNIT[\"metre\",1]]],\n"
+ " PRIMEM[\"Greenwich\",0,\n"
+ " ANGLEUNIT[\"Degree\",0.0174532925199433]],\n"
+ " CS[ellipsoidal,2],\n"
+ " AXIS[\"geodetic latitude (Lat)\",north,\n"
+ " ORDER[1],\n"
+ " ANGLEUNIT[\"degree\",0.0174532925199433]],\n"
+ " AXIS[\"geodetic longitude (Lon)\",east,\n"
+ " ORDER[2],\n"
+ " ANGLEUNIT[\"degree\",0.0174532925199433]]]";
+ auto obj = WKTParser().createFromWKT(wkt);
+ auto crs = nn_dynamic_pointer_cast<GeodeticCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+
+ auto allFactory = AuthorityFactory::create(dbContext, std::string());
+ auto res = crs->identify(allFactory);
+ ASSERT_EQ(res.size(), 1U);
+ ASSERT_TRUE(!res.front().first->identifiers().empty());
+ EXPECT_EQ(*res.front().first->identifiers()[0]->codeSpace(), "EPSG");
+ EXPECT_EQ(res.front().first->identifiers()[0]->code(), "7844");
+ EXPECT_EQ(res.front().second, 100);
+
+ EXPECT_TRUE(crs->_isEquivalentTo(res.front().first.get(),
+ IComparable::Criterion::EQUIVALENT,
+ dbContext));
+ EXPECT_TRUE(res.front().first->_isEquivalentTo(
+ crs.get(), IComparable::Criterion::EQUIVALENT, dbContext));
+ }
}
// ---------------------------------------------------------------------------
@@ -2281,6 +2397,38 @@ TEST(crs, projectedCRS_identify_db) {
// ---------------------------------------------------------------------------
+TEST(crs, projectedCRS_identify_wrong_auth_name_case) {
+ auto dbContext = DatabaseContext::create();
+ auto factoryAnonymous = AuthorityFactory::create(dbContext, std::string());
+ auto obj =
+ WKTParser()
+ .attachDatabaseContext(dbContext)
+ .setStrict(false)
+ .createFromWKT(
+ "PROJCS[\"World_Cylindrical_Equal_Area\","
+ "GEOGCS[\"GCS_WGS_1984\","
+ "DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\","
+ "6378137.0,298.257223563]],"
+ "PRIMEM[\"Greenwich\",0.0],"
+ "UNIT[\"Degree\",0.0174532925199433]],"
+ "PROJECTION[\"Cylindrical_Equal_Area\"],"
+ "PARAMETER[\"False_Easting\",0.0],"
+ "PARAMETER[\"False_Northing\",0.0],"
+ "PARAMETER[\"Central_Meridian\",0.0],"
+ "PARAMETER[\"Standard_Parallel_1\",0.0],UNIT[\"Meter\",1.0],"
+ "AUTHORITY[\"Esri\",54034]]"); // should be ESRI all caps
+ auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+ auto res = crs->identify(factoryAnonymous);
+ ASSERT_EQ(res.size(), 1U);
+ const auto &ids = res.front().first->identifiers();
+ ASSERT_EQ(ids.size(), 1U);
+ EXPECT_EQ(*(ids.front()->codeSpace()), "ESRI");
+ EXPECT_EQ(ids.front()->code(), "54034");
+}
+
+// ---------------------------------------------------------------------------
+
TEST(crs, mercator_1SP_as_WKT1_ESRI) {
auto obj = PROJStringParser().createFromPROJString(
@@ -3351,6 +3499,17 @@ TEST(crs, compoundCRS_identify_db) {
EXPECT_EQ(res.front().first->getEPSGCode(), 8769);
EXPECT_EQ(res.front().second, 70);
}
+ {
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=tmerc +lat_0=0 +lon_0=72.05 +k=1 +x_0=3500000 "
+ "+y_0=-5811057.63 +ellps=krass "
+ "+towgs84=23.57,-140.95,-79.8,0,-0.35,-0.79,-0.22 "
+ "+geoidgrids=egm08_25.gtx +units=m +no_defs +type=crs");
+ auto crs = nn_dynamic_pointer_cast<CompoundCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+ // Just check we don't get an exception
+ crs->identify(factory);
+ }
}
// ---------------------------------------------------------------------------
@@ -3753,6 +3912,21 @@ TEST(crs, boundCRS_identify_db) {
WKTFormatter::create(WKTFormatter::Convention::WKT1_GDAL).get());
EXPECT_TRUE(wkt.find("32122") != std::string::npos) << wkt;
}
+
+ {
+ // Identify from a PROJ string with +towgs84
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=utm +zone=48 +a=6377276.345 +b=6356075.41314024 "
+ "+towgs84=198,881,317,0,0,0,0 +units=m +no_defs +type=crs");
+ auto crs = nn_dynamic_pointer_cast<BoundCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+ auto res = crs->identify(factoryEPSG);
+ ASSERT_EQ(res.size(), 1U);
+ auto boundCRS = dynamic_cast<const BoundCRS *>(res.front().first.get());
+ ASSERT_TRUE(boundCRS != nullptr);
+ EXPECT_EQ(boundCRS->baseCRS()->getEPSGCode(), 3148);
+ EXPECT_EQ(res.front().second, 70);
+ }
}
// ---------------------------------------------------------------------------