aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2018-11-23 15:51:33 +0100
committerEven Rouault <even.rouault@spatialys.com>2018-11-29 00:35:25 +0100
commita66c12277666489cac74535bad8d2cf565ad542d (patch)
tree2833ee9e60a836bf16a600c7056e5c9c5d711bc4 /test
parentd48f97180dacceb6d03c79d69044e19ba0af3fbc (diff)
downloadPROJ-a66c12277666489cac74535bad8d2cf565ad542d.tar.gz
PROJ-a66c12277666489cac74535bad8d2cf565ad542d.zip
cs2cs: upgrade to use proj_create_crs_to_crs()
Diffstat (limited to 'test')
-rw-r--r--test/gie/more_builtins.gie10
-rw-r--r--test/old/proj_outIGNF.dist42
-rwxr-xr-xtest/old/testIGNF12
-rwxr-xr-xtest/old/testdatumfile4
-rwxr-xr-xtest/old/testvarious24
-rw-r--r--test/old/tv_out.dist12
-rw-r--r--test/unit/test_c_api.cpp81
-rw-r--r--test/unit/test_io.cpp103
-rw-r--r--test/unit/test_operation.cpp128
9 files changed, 333 insertions, 83 deletions
diff --git a/test/gie/more_builtins.gie b/test/gie/more_builtins.gie
index 272e503c..00c9d4a0 100644
--- a/test/gie/more_builtins.gie
+++ b/test/gie/more_builtins.gie
@@ -709,4 +709,14 @@ direction reverse
accept 0 0 0 0
expect failure
+-------------------------------------------------------------------------------
+# Test lon_wrap
+operation +proj=longlat +ellps=WGS84 +lon_wrap=180
+-------------------------------------------------------------------------------
+direction forward
+accept -1 10 0
+expect 359 10 0
+
+-------------------------------------------------------------------------------
+
</gie>
diff --git a/test/old/proj_outIGNF.dist b/test/old/proj_outIGNF.dist
index 45112f60..611144b8 100644
--- a/test/old/proj_outIGNF.dist
+++ b/test/old/proj_outIGNF.dist
@@ -1,24 +1,24 @@
-+init=./IGNF:NTFG +to +init=./IGNF:RGF93G
++init=IGNF:NTFG +to +init=IGNF:RGF93G
3.300866856 43.4477976569 0.0000 3d18'0.915"E 43d26'52.077"N 0.000
-+init=./IGNF:LAMBE +to +init=./IGNF:LAMB93
- 600000.0000 2600545.4523 0.0000 652760.737 7033791.243 0.000
- 135638.3592 2418760.4094 0.0000 187194.062 6855928.882 0.000
- 998137.3947 2413822.2844 0.0000 1049052.258 6843776.562 0.000
++init=IGNF:LAMBE +to +init=IGNF:LAMB93
+ 600000.0000 2600545.4523 0.0000 652759.036 7033588.609 0.000
+ 135638.3592 2418760.4094 0.0000 187444.148 6856142.911 0.000
+ 998137.3947 2413822.2844 0.0000 1048843.997 6843923.913 0.000
600000.0000 2200000.0000 0.0000 649398.872 6633524.191 0.000
- 311552.5340 1906457.4840 0.0000 358799.172 6342652.486 0.000
- 960488.4138 1910172.8812 0.0000 1007068.686 6340907.237 0.000
- 600000.0000 1699510.8340 0.0000 645204.279 6133556.746 0.000
-1203792.5981 626873.17210 0.0000 1238875.764 5057405.016 0.000
-+init=./IGNF:LAMBE +to +init=./IGNF:GEOPORTALFXX
- 600000.0000 2600545.4523 0.0000 179040.148 5610495.275 0.000
- 135638.3592 2418760.4094 0.0000 -303729.363 5410118.356 0.000
- 998137.3947 2413822.2844 0.0000 592842.792 5410120.554 0.000
+ 311552.5340 1906457.4840 0.0000 358593.374 6342647.465 0.000
+ 960488.4138 1910172.8812 0.0000 1007324.119 6340956.093 0.000
+ 600000.0000 1699510.8340 0.0000 645201.753 6133255.515 0.000
+1203792.5981 626873.17210 0.0000 * * inf
++init=IGNF:LAMBE +to +init=IGNF:GEOPORTALFXX
+ 600000.0000 2600545.4523 0.0000 179040.150 5610292.766 0.000
+ 135638.3592 2418760.4094 0.0000 -303490.059 5410353.890 0.000
+ 998137.3947 2413822.2844 0.0000 592635.926 5410280.335 0.000
600000.0000 2200000.0000 0.0000 179041.670 5209746.080 0.000
- 311552.5340 1906457.4840 0.0000 -96825.465 4909184.136 0.000
- 960488.4138 1910172.8812 0.0000 523880.019 4909191.141 0.000
- 600000.0000 1699510.8340 0.0000 179047.633 4708817.007 0.000
-1203792.5981 626873.17210 0.0000 658287.395 3623739.237 0.000
-+init=./IGNF:RGF93G +to +init=./IGNF:GEOPORTALFXX
+ 311552.5340 1906457.4840 0.0000 -97021.878 4909167.981 0.000
+ 960488.4138 1910172.8812 0.0000 524126.466 4909227.598 0.000
+ 600000.0000 1699510.8340 0.0000 179047.637 4708515.623 0.000
+1203792.5981 626873.17210 0.0000 * * inf
++init=IGNF:RGF93G +to +init=IGNF:GEOPORTALFXX
2d20'11.4239243" 50d23'59.7718445" 0.0 179040.151 5610495.281 0.000
-3d57'49.4051448" 48d35'59.7121716" 0.0 -303729.365 5410118.352 0.000
7d44'12.1439796" 48d35'59.7832558" 0.0 592842.794 5410120.550 0.000
@@ -27,7 +27,7 @@
6d50'12.2276489" 44d06'00.0517019" 0.0 523880.022 4909191.143 0.000
2d20'11.7754730" 42d18'00.0824436" 0.0 179047.634 4708817.010 0.000
9d32'12.6680218" 41d24'00.3542556" 0.0 730783.054 4608637.873 0.000
-+init=./IGNF:RGF93G +to +init=./IGNF:MILLER
++init=IGNF:RGF93G +to +init=IGNF:MILLER
2d20'11.4239243" 50d23'59.7718445" 0.0 260098.730 6140682.441 0.000
-3d57'49.4051448" 48d35'59.7121716" 0.0 -441239.699 5880610.004 0.000
7d44'12.1439796" 48d35'59.7832558" 0.0 861246.246 5880612.827 0.000
@@ -36,5 +36,5 @@
6d50'12.2276489" 44d06'00.0517019" 0.0 761061.291 5252498.745 0.000
2d20'11.7754730" 42d18'00.0824436" 0.0 260109.601 5009175.714 0.000
9d32'12.6680218" 41d24'00.3542556" 0.0 1061637.534 4889066.592 0.000
-+init=./IGNF:RGR92 +to +init=./IGNF:REUN47
-3356123.5400 1303218.3090 5247430.6050 3353421.833 1304074.314 5248935.607
++init=IGNF:RGR92 +to +init=IGNF:REUN47
+3356123.5400 1303218.3090 5247430.6050 3353420.949 1304075.021 5248935.144
diff --git a/test/old/testIGNF b/test/old/testIGNF
index f785641e..abbaed94 100755
--- a/test/old/testIGNF
+++ b/test/old/testIGNF
@@ -41,13 +41,7 @@ echo "============================================"
OUT=proj_outIGNF
-REMOVE_IGNF=NO
-if test ! -f IGNF; then
- cp ${PROJ_LIB}/IGNF .
- REMOVE_IGNF=YES
-fi
-
-INIT_FILE=./IGNF
+INIT_FILE=IGNF
RES="-f %.3f"
#
echo "doing tests into file ${OUT}, please wait"
@@ -162,10 +156,6 @@ $EXE +init=${INIT_FILE}:RGR92 +to +init=${INIT_FILE}:REUN47 -E $RES >>${OUT} <<E
3356123.5400 1303218.3090 5247430.6050
EOF
-if test "${REMOVE_IGNF}" = "YES"; then
- rm ./IGNF
-fi
-
#
# do 'diff' with distribution results
echo "diff ${OUT} with ${OUT}.dist"
diff --git a/test/old/testdatumfile b/test/old/testdatumfile
index 6cd25b76..6520453d 100755
--- a/test/old/testdatumfile
+++ b/test/old/testdatumfile
@@ -77,7 +77,7 @@ echo "edge or even a wee bit outside (#141)." >> ${OUT}
# Our test points are (1) right on mesh corner, (2) outside but within
# epsilon (3) inside a bit (4) outside by more than epsilon
#
-$EXE +proj=latlong +ellps=WGS84 +nadgrids=ntf_r93.gsb \
+$EXE +proj=latlong +ellps=WGS84 +nadgrids=ntf_r93.gsb,null \
+to +proj=latlong +datum=WGS84 \
-E -f "%.12f" >>${OUT} <<EOF
-5.5 52.0
@@ -87,7 +87,7 @@ $EXE +proj=latlong +ellps=WGS84 +nadgrids=ntf_r93.gsb \
EOF
#
$EXE +proj=latlong +datum=WGS84 \
- +to +proj=latlong +ellps=WGS84 +nadgrids=ntf_r93.gsb \
+ +to +proj=latlong +ellps=WGS84 +nadgrids=ntf_r93.gsb,null \
-E -f "%.12f" >>${OUT} <<EOF
-5.5 52.0
-5.5000000000001 52.0000000000001
diff --git a/test/old/testvarious b/test/old/testvarious
index dbaeb0ce..b3ba4040 100755
--- a/test/old/testvarious
+++ b/test/old/testvarious
@@ -523,7 +523,7 @@ EOF
#
echo "##############################################################" >> ${OUT}
echo "Test the Natural Earth Projection" >> ${OUT}
-$EXE +proj=latlong +a=1 +lon_0=0 \
+$EXE +proj=latlong +a=6371008.7714 +b=6371008.7714 \
+to +proj=natearth +a=6371008.7714 +b=6371008.7714 -f '%.'7'f' \
-E >>${OUT} <<EOF
0.0 0.0 0 0.0 0.0
@@ -554,7 +554,7 @@ $EXE +proj=latlong +a=1 +lon_0=0 \
EOF
echo "##############################################################" >> ${OUT}
echo "Test the Natural Earth II Projection" >> ${OUT}
-$EXE +proj=latlong +a=1 +lon_0=0 \
+$EXE +proj=latlong +a=6371008.7714 +b=6371008.7714 \
+to +proj=natearth2 +a=6371008.7714 +b=6371008.7714 -f '%.'7'f' \
-E >>${OUT} <<EOF
0.0 0.0 0 0.00000000 0.00000000
@@ -585,7 +585,7 @@ $EXE +proj=latlong +a=1 +lon_0=0 \
EOF
echo "##############################################################" >> ${OUT}
echo "Test the Compact Miller projection" >> ${OUT}
-$EXE +proj=latlong +a=1 +lon_0=0 \
+$EXE +proj=latlong +a=6371008.7714 +b=6371008.7714 \
+to +proj=comill +a=6371008.7714 +b=6371008.7714 -f '%.'7'f' \
-E >>${OUT} <<EOF
0.0 0.0 0 0.0 0.0
@@ -656,14 +656,14 @@ EOF
echo "##############################################################" >> ${OUT}
echo "Check inverse error handling with ob_tran (#225)" >> ${OUT}
$EXE +proj=ob_tran \
- +o_proj=moll +a=6378137 +es=0 +o_lon_p=LON_POLE +o_lat_p=LAT_POLE +lon_0=180 \
+ +o_proj=moll +a=6378137 +es=0 +o_lon_p=0 +o_lat_p=0 +lon_0=180 \
-E >>${OUT} <<EOF
300000 400000
20000000 30000000
EOF
echo "Test inverse handling" >> ${OUT}
$EXE -I +proj=ob_tran \
- +o_proj=moll +a=6378137 +es=0 +o_lon_p=LON_POLE +o_lat_p=LAT_POLE +lon_0=180 \
+ +o_proj=moll +a=6378137 +es=0 +o_lon_p=0 +o_lat_p=0 +lon_0=180 \
-E >>${OUT} <<EOF
10 20
EOF
@@ -939,6 +939,20 @@ $EXE -f '%0.3f' \
0 0 1000
EOF
+echo "##############################################################" >> ${OUT}
+echo "Test EPSG:4326 to EPSG:32631" >> ${OUT}
+# Input is latitude, longitude order
+$EXE EPSG:4326 +to EPSG:32631 -E >> ${OUT} <<EOF
+49 3 0
+EOF
+
+echo "##############################################################" >> ${OUT}
+echo "Test EPSG:32631 to EPSG:4326" >> ${OUT}
+# Input is latitude, longitude order
+$EXE EPSG:32631 EPSG:4326 -E >> ${OUT} <<EOF
+400000 5000000 0
+EOF
+
# Done!
# do 'diff' with distribution results
diff --git a/test/old/tv_out.dist b/test/old/tv_out.dist
index 222c0c5f..148d413d 100644
--- a/test/old/tv_out.dist
+++ b/test/old/tv_out.dist
@@ -139,7 +139,7 @@ Test healpix forward projection on ellipsoid
0 60.0 0.00000 3.35128 0.00000
0 -60.0 0.00000 -3.35128 0.00000
Test healpix inverse projection on ellipsoid
-0 0.7853981633974483 * * 0.00000
+0 0.7853981633974483 * * inf
-1.5707963267948966 0 -90.10072 0.00000 0.00000
0.0 0.0 0.00000 0.00000 0.00000
0.0 2.0547874222147415 0.00000 39.58811 0.00000
@@ -347,7 +347,7 @@ Test inverse calcofi projection
##############################################################
Check inverse error handling with ob_tran (#225)
300000 400000 42d45'22.377"W 85d35'28.083"N 0.000
-20000000 30000000 * * 0.000
+20000000 30000000 * * inf
Test inverse handling
10 20 -1384841.19 7581707.88 0.00
##############################################################
@@ -447,10 +447,16 @@ Test patterson inverse projection
20015114.352186374 -11409566.822831295 180.000 -90.000 0.000
##############################################################
Test Web Mercator to avoid issue #834 in the future
-487147.594520173 4934316.46263998 -10370728.796 5552839.742 -0.000
+487147.594520173 4934316.46263998 -10370728.796 5552839.742 0.000
##############################################################
Test vto_meter
0 0 1 0.000 0.000 1000.000
0 0 1 0.000 0.000 1000.000
0 0 1000 0.000 0.000 1.000
0 0 1000 0.000 0.000 1.000
+##############################################################
+Test EPSG:4326 to EPSG:32631
+49 3 0 500000.00 5427455.78 0.00
+##############################################################
+Test EPSG:32631 to EPSG:4326
+400000 5000000 0 45d8'47.014"N 1d43'40.681"E 0.000
diff --git a/test/unit/test_c_api.cpp b/test/unit/test_c_api.cpp
index 8c9f114b..6c22cade 100644
--- a/test/unit/test_c_api.cpp
+++ b/test/unit/test_c_api.cpp
@@ -809,6 +809,22 @@ TEST_F(CApi, proj_obj_get_source_target_crs_transformation) {
// ---------------------------------------------------------------------------
+TEST_F(CApi, proj_obj_get_source_crs_of_projected_crs) {
+ auto crs = proj_obj_create_from_wkt(
+ m_ctxt,
+ createProjectedCRS()->exportToWKT(WKTFormatter::create().get()).c_str(),
+ nullptr);
+ ASSERT_NE(crs, nullptr);
+ ObjectKeeper keeper(crs);
+
+ auto sourceCRS = proj_obj_get_source_crs(crs);
+ ASSERT_NE(sourceCRS, nullptr);
+ ObjectKeeper keeper_sourceCRS(sourceCRS);
+ EXPECT_EQ(std::string(proj_obj_get_name(sourceCRS)), "WGS 84");
+}
+
+// ---------------------------------------------------------------------------
+
TEST_F(CApi, proj_obj_get_source_target_crs_conversion_without_crs) {
auto obj = proj_obj_create_from_database(
m_ctxt, "EPSG", "16031", PJ_OBJ_CATEGORY_COORDINATE_OPERATION, false,
@@ -1955,4 +1971,69 @@ TEST_F(CApi, proj_obj_create_projections) {
/* END: Generated by scripts/create_c_api_projections.py*/
}
+// ---------------------------------------------------------------------------
+
+TEST_F(CApi, proj_obj_cs_get_axis_info) {
+ {
+ auto crs = proj_obj_create_from_database(
+ m_ctxt, "EPSG", "4326", PJ_OBJ_CATEGORY_CRS, false, nullptr);
+ ASSERT_NE(crs, nullptr);
+ ObjectKeeper keeper(crs);
+
+ auto cs = proj_obj_crs_get_coordinate_system(crs);
+ ASSERT_NE(cs, nullptr);
+ ObjectKeeper keeperCs(cs);
+
+ const char *type = proj_obj_cs_get_type(cs);
+ ASSERT_NE(type, nullptr);
+ EXPECT_EQ(std::string(type), "Ellipsoidal");
+
+ EXPECT_EQ(proj_obj_cs_get_axis_count(cs), 2);
+
+ EXPECT_FALSE(proj_obj_cs_get_axis_info(cs, -1, nullptr, nullptr,
+ nullptr, nullptr, nullptr));
+
+ EXPECT_FALSE(proj_obj_cs_get_axis_info(cs, 2, nullptr, nullptr, nullptr,
+ nullptr, nullptr));
+
+ EXPECT_TRUE(proj_obj_cs_get_axis_info(cs, 0, nullptr, nullptr, nullptr,
+ nullptr, nullptr));
+
+ const char *name = nullptr;
+ const char *abbrev = nullptr;
+ const char *direction = nullptr;
+ double unitConvFactor = 0.0;
+ const char *unitName = nullptr;
+
+ EXPECT_TRUE(proj_obj_cs_get_axis_info(cs, 0, &name, &abbrev, &direction,
+ &unitConvFactor, &unitName));
+ ASSERT_NE(name, nullptr);
+ ASSERT_NE(abbrev, nullptr);
+ ASSERT_NE(direction, nullptr);
+ ASSERT_NE(unitName, nullptr);
+ EXPECT_EQ(std::string(name), "Geodetic latitude");
+ EXPECT_EQ(std::string(abbrev), "Lat");
+ EXPECT_EQ(std::string(direction), "north");
+ EXPECT_EQ(unitConvFactor, 0.017453292519943295) << unitConvFactor;
+ EXPECT_EQ(std::string(unitName), "degree");
+ }
+
+ // Non CRS object
+ {
+ auto obj = proj_obj_create_from_database(
+ m_ctxt, "EPSG", "1170", PJ_OBJ_CATEGORY_COORDINATE_OPERATION, false,
+ nullptr);
+ ASSERT_NE(obj, nullptr);
+ ObjectKeeper keeper(obj);
+ EXPECT_EQ(proj_obj_crs_get_coordinate_system(obj), nullptr);
+
+ EXPECT_EQ(proj_obj_cs_get_type(obj), nullptr);
+
+ EXPECT_EQ(proj_obj_cs_get_axis_count(obj), -1);
+
+ EXPECT_FALSE(proj_obj_cs_get_axis_info(obj, 0, nullptr, nullptr,
+ nullptr, nullptr, nullptr));
+ }
+}
+
} // namespace
diff --git a/test/unit/test_io.cpp b/test/unit/test_io.cpp
index 99f58739..a4974234 100644
--- a/test/unit/test_io.cpp
+++ b/test/unit/test_io.cpp
@@ -5686,23 +5686,33 @@ TEST(io, projparse_longlat_a_f_non_zero) {
PROJStringParser().createFromPROJString("+proj=longlat +a=2 +f=0.5");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
- WKTFormatterNNPtr f(WKTFormatter::create());
- f->simulCurNodeHasId();
- crs->exportToWKT(f.get());
- auto expected = "GEODCRS[\"unknown\",\n"
- " DATUM[\"unknown\",\n"
- " ELLIPSOID[\"unknown\",2,2,\n"
- " LENGTHUNIT[\"metre\",1]]],\n"
- " PRIMEM[\"Reference meridian\",0,\n"
- " ANGLEUNIT[\"degree\",0.0174532925199433]],\n"
- " CS[ellipsoidal,2],\n"
- " AXIS[\"longitude\",east,\n"
- " ORDER[1],\n"
- " ANGLEUNIT[\"degree\",0.0174532925199433]],\n"
- " AXIS[\"latitude\",north,\n"
- " ORDER[2],\n"
- " ANGLEUNIT[\"degree\",0.0174532925199433]]]";
- EXPECT_EQ(f->toString(), expected);
+ EXPECT_EQ(crs->ellipsoid()->semiMajorAxis().getSIValue(), 2);
+ auto rf = crs->ellipsoid()->computedInverseFlattening();
+ EXPECT_EQ(rf, 2) << rf;
+}
+
+// ---------------------------------------------------------------------------
+
+TEST(io, projparse_longlat_a_e) {
+ auto obj =
+ PROJStringParser().createFromPROJString("+proj=longlat +a=2 +e=0.5");
+ auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+ EXPECT_EQ(crs->ellipsoid()->semiMajorAxis().getSIValue(), 2);
+ auto rf = crs->ellipsoid()->computedInverseFlattening();
+ EXPECT_NEAR(rf, 7.46410161513775, 1e-14) << rf;
+}
+
+// ---------------------------------------------------------------------------
+
+TEST(io, projparse_longlat_a_es) {
+ auto obj =
+ PROJStringParser().createFromPROJString("+proj=longlat +a=2 +es=0.5");
+ auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+ EXPECT_EQ(crs->ellipsoid()->semiMajorAxis().getSIValue(), 2);
+ auto rf = crs->ellipsoid()->computedInverseFlattening();
+ EXPECT_EQ(rf, 3.4142135623730958) << rf;
}
// ---------------------------------------------------------------------------
@@ -5711,23 +5721,31 @@ TEST(io, projparse_longlat_R) {
auto obj = PROJStringParser().createFromPROJString("+proj=longlat +R=2");
auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
ASSERT_TRUE(crs != nullptr);
- WKTFormatterNNPtr f(WKTFormatter::create());
- f->simulCurNodeHasId();
- crs->exportToWKT(f.get());
- auto expected = "GEODCRS[\"unknown\",\n"
- " DATUM[\"unknown\",\n"
- " ELLIPSOID[\"unknown\",2,0,\n"
- " LENGTHUNIT[\"metre\",1]]],\n"
- " PRIMEM[\"Reference meridian\",0,\n"
- " ANGLEUNIT[\"degree\",0.0174532925199433]],\n"
- " CS[ellipsoidal,2],\n"
- " AXIS[\"longitude\",east,\n"
- " ORDER[1],\n"
- " ANGLEUNIT[\"degree\",0.0174532925199433]],\n"
- " AXIS[\"latitude\",north,\n"
- " ORDER[2],\n"
- " ANGLEUNIT[\"degree\",0.0174532925199433]]]";
- EXPECT_EQ(f->toString(), expected);
+ EXPECT_TRUE(crs->ellipsoid()->isSphere());
+ EXPECT_EQ(crs->ellipsoid()->semiMajorAxis().getSIValue(), 2);
+}
+
+// ---------------------------------------------------------------------------
+
+TEST(io, projparse_longlat_a) {
+ auto obj = PROJStringParser().createFromPROJString("+proj=longlat +a=2");
+ auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+ EXPECT_TRUE(crs->ellipsoid()->isSphere());
+ EXPECT_EQ(crs->ellipsoid()->semiMajorAxis().getSIValue(), 2);
+}
+
+// ---------------------------------------------------------------------------
+
+TEST(io, projparse_longlat_a_override_ellps) {
+ auto obj = PROJStringParser().createFromPROJString(
+ "+proj=longlat +a=2 +ellps=WGS84");
+ auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+ EXPECT_TRUE(!crs->ellipsoid()->isSphere());
+ EXPECT_EQ(crs->ellipsoid()->semiMajorAxis().getSIValue(), 2);
+ EXPECT_EQ(crs->ellipsoid()->computedInverseFlattening(), 298.25722356300003)
+ << crs->ellipsoid()->computedInverseFlattening();
}
// ---------------------------------------------------------------------------
@@ -7505,6 +7523,16 @@ TEST(io, projparse_init) {
EXPECT_EQ(co->exportToPROJString(PROJStringFormatter::create().get()),
"+proj=pipeline +step +init=epsg:4326 +step +proj=longlat");
}
+
+ {
+ auto obj = PROJStringParser().createFromPROJString(
+ "init=epsg:4326 proj=longlat ellps=GRS80");
+ auto crs = nn_dynamic_pointer_cast<GeographicCRS>(obj);
+ ASSERT_TRUE(crs != nullptr);
+ EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=pipeline +step +proj=longlat +ellps=GRS80 "
+ "+step +proj=unitconvert +xy_in=rad +xy_out=deg");
+ }
}
// ---------------------------------------------------------------------------
@@ -7536,10 +7564,6 @@ TEST(io, projparse_errors) {
EXPECT_THROW(PROJStringParser().createFromPROJString(
"proj=pipeline step init=epsg:4326 init=epsg:4326"),
ParsingException);
-
- EXPECT_THROW(PROJStringParser().createFromPROJString(
- "proj=pipeline step init=epsg:4326 proj=longlat"),
- ParsingException);
}
// ---------------------------------------------------------------------------
@@ -7577,9 +7601,6 @@ TEST(io, projparse_longlat_errors) {
PROJStringParser().createFromPROJString("+proj=longlat +R=invalid"),
ParsingException);
- EXPECT_THROW(PROJStringParser().createFromPROJString("+proj=longlat +a=1"),
- ParsingException);
-
EXPECT_THROW(PROJStringParser().createFromPROJString("+proj=longlat +b=1"),
ParsingException);
diff --git a/test/unit/test_operation.cpp b/test/unit/test_operation.cpp
index 528aa6b8..818c10ec 100644
--- a/test/unit/test_operation.cpp
+++ b/test/unit/test_operation.cpp
@@ -4477,6 +4477,38 @@ TEST(operation, geogCRS_to_geogCRS_CH1903_to_CH1903plus_context) {
// ---------------------------------------------------------------------------
+TEST(operation, geogCRS_to_geogCRS_init_IGNF_to_init_IGNF_context) {
+
+ auto dbContext = DatabaseContext::create();
+
+ auto sourceCRS_obj = PROJStringParser()
+ .attachDatabaseContext(dbContext)
+ .setUsePROJ4InitRules(true)
+ .createFromPROJString("+init=IGNF:NTFG");
+ auto sourceCRS = nn_dynamic_pointer_cast<CRS>(sourceCRS_obj);
+ ASSERT_TRUE(sourceCRS != nullptr);
+
+ auto targetCRS_obj = PROJStringParser()
+ .attachDatabaseContext(dbContext)
+ .setUsePROJ4InitRules(true)
+ .createFromPROJString("+init=IGNF:RGF93G");
+ auto targetCRS = nn_dynamic_pointer_cast<CRS>(targetCRS_obj);
+ ASSERT_TRUE(targetCRS != nullptr);
+
+ auto authFactory = AuthorityFactory::create(dbContext, std::string());
+ auto ctxt = CoordinateOperationContext::create(authFactory, nullptr, 0.0);
+ auto list = CoordinateOperationFactory::create()->createOperations(
+ NN_CHECK_ASSERT(sourceCRS), NN_CHECK_ASSERT(targetCRS), ctxt);
+ ASSERT_EQ(list.size(), 1);
+
+ EXPECT_EQ(list[0]->nameStr(),
+ "NOUVELLE TRIANGULATION DE LA FRANCE (NTF) vers RGF93 (ETRS89)");
+ EXPECT_EQ(list[0]->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=hgridshift +grids=ntf_r93.gsb");
+}
+
+// ---------------------------------------------------------------------------
+
TEST(operation, geogCRS_to_geogCRS_3D) {
auto geogcrs_m_obj =
@@ -5110,6 +5142,83 @@ TEST(operation, boundCRS_of_geogCRS_to_unrelated_geogCRS) {
// ---------------------------------------------------------------------------
+TEST(operation, createOperation_boundCRS_identified_by_datum) {
+ auto objSrc =
+ PROJStringParser().createFromPROJString("+proj=longlat +datum=WGS84");
+ auto src = nn_dynamic_pointer_cast<GeographicCRS>(objSrc);
+ ASSERT_TRUE(src != nullptr);
+
+ auto objDest = PROJStringParser().createFromPROJString(
+ "+proj=utm +zone=32 +a=6378249.2 +b=6356515 "
+ "+towgs84=-263.0,6.0,431.0 +no_defs");
+ auto dest = nn_dynamic_pointer_cast<BoundCRS>(objDest);
+ ASSERT_TRUE(dest != nullptr);
+
+ auto op = CoordinateOperationFactory::create()->createOperation(
+ NN_CHECK_ASSERT(src), NN_CHECK_ASSERT(dest));
+ ASSERT_TRUE(op != nullptr);
+ EXPECT_EQ(op->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=pipeline +step +proj=unitconvert +xy_in=deg +xy_out=rad "
+ "+step +proj=cart +ellps=WGS84 "
+ "+step +proj=helmert +x=263 +y=-6 +z=-431 "
+ "+step +inv +proj=cart +ellps=clrk80ign "
+ "+step +proj=utm +zone=32 +ellps=clrk80ign");
+
+ auto authFactory =
+ AuthorityFactory::create(DatabaseContext::create(), std::string());
+ auto ctxt = CoordinateOperationContext::create(authFactory, nullptr, 0.0);
+ auto list = CoordinateOperationFactory::create()->createOperations(
+ NN_CHECK_ASSERT(src), NN_CHECK_ASSERT(dest), ctxt);
+ ASSERT_EQ(list.size(), 1U);
+ EXPECT_TRUE(list[0]->isEquivalentTo(op.get()));
+}
+
+// ---------------------------------------------------------------------------
+
+TEST(operation, boundCRS_of_clrk_66_geogCRS_to_nad83_geogCRS) {
+ auto objSrc = PROJStringParser().createFromPROJString(
+ "+proj=latlong +ellps=clrk66 +nadgrids=ntv1_can.dat,conus");
+ auto src = nn_dynamic_pointer_cast<CRS>(objSrc);
+ ASSERT_TRUE(src != nullptr);
+
+ auto objDest =
+ PROJStringParser().createFromPROJString("+proj=latlong +datum=NAD83");
+ auto dest = nn_dynamic_pointer_cast<CRS>(objDest);
+ ASSERT_TRUE(dest != nullptr);
+
+ auto op = CoordinateOperationFactory::create()->createOperation(
+ NN_CHECK_ASSERT(src), NN_CHECK_ASSERT(dest));
+ ASSERT_TRUE(op != nullptr);
+ EXPECT_EQ(op->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=pipeline +step +proj=unitconvert +xy_in=deg +xy_out=rad "
+ "+step +proj=hgridshift +grids=ntv1_can.dat,conus "
+ "+step +proj=unitconvert +xy_in=rad +xy_out=deg");
+}
+
+// ---------------------------------------------------------------------------
+
+TEST(operation, boundCRS_of_clrk_66_projCRS_to_nad83_geogCRS) {
+ auto objSrc = PROJStringParser().createFromPROJString(
+ "+proj=utm +zone=17 +ellps=clrk66 +nadgrids=ntv1_can.dat,conus");
+ auto src = nn_dynamic_pointer_cast<CRS>(objSrc);
+ ASSERT_TRUE(src != nullptr);
+
+ auto objDest =
+ PROJStringParser().createFromPROJString("+proj=latlong +datum=NAD83");
+ auto dest = nn_dynamic_pointer_cast<CRS>(objDest);
+ ASSERT_TRUE(dest != nullptr);
+
+ auto op = CoordinateOperationFactory::create()->createOperation(
+ NN_CHECK_ASSERT(src), NN_CHECK_ASSERT(dest));
+ ASSERT_TRUE(op != nullptr);
+ EXPECT_EQ(op->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=pipeline +step +inv +proj=utm +zone=17 +ellps=clrk66 "
+ "+step +proj=hgridshift +grids=ntv1_can.dat,conus "
+ "+step +proj=unitconvert +xy_in=rad +xy_out=deg");
+}
+
+// ---------------------------------------------------------------------------
+
TEST(operation, boundCRS_of_projCRS_to_geogCRS) {
auto utm31 = ProjectedCRS::create(
PropertyMap(), GeographicCRS::EPSG_4807,
@@ -5864,6 +5973,25 @@ TEST(operation, createOperation_on_crs_with_canonical_bound_crs) {
// ---------------------------------------------------------------------------
+TEST(operation, createOperation_fallback_to_proj4_strings) {
+ auto objDest = PROJStringParser().createFromPROJString(
+ "+proj=longlat +geoc +ellps=WGS84");
+ auto dest = nn_dynamic_pointer_cast<GeographicCRS>(objDest);
+ ASSERT_TRUE(dest != nullptr);
+
+ auto op = CoordinateOperationFactory::create()->createOperation(
+ GeographicCRS::EPSG_4326, NN_CHECK_ASSERT(dest));
+ ASSERT_TRUE(op != nullptr);
+ EXPECT_EQ(op->exportToPROJString(PROJStringFormatter::create().get()),
+ "+proj=pipeline +step +proj=axisswap +order=2,1 "
+ "+step +proj=unitconvert +xy_in=deg +xy_out=rad "
+ "+step +inv +proj=longlat +datum=WGS84 "
+ "+step +proj=longlat +geoc +ellps=WGS84 "
+ "+step +proj=unitconvert +xy_in=rad +xy_out=deg");
+}
+
+// ---------------------------------------------------------------------------
+
TEST(operation, mercator_variant_A_to_variant_B) {
auto projCRS = ProjectedCRS::create(
PropertyMap(), GeographicCRS::EPSG_4326,