diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2022-02-09 16:20:22 +0100 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2022-02-09 16:26:50 +0100 |
| commit | b210728be7960e713a5558e8980af20dccc698e2 (patch) | |
| tree | 52e68b07876a60be2756f620a90c4aceee84ab13 /test/unit | |
| parent | 61c918f163a7e8cfd89c6ae58c8769bb2e33b386 (diff) | |
| download | PROJ-b210728be7960e713a5558e8980af20dccc698e2.tar.gz PROJ-b210728be7960e713a5558e8980af20dccc698e2.zip | |
createOperations(): fix transformations from/to a BoundCRS of a DerivedGeographicCRS coming from WKT
Diffstat (limited to 'test/unit')
| -rw-r--r-- | test/unit/test_operationfactory.cpp | 139 |
1 files changed, 85 insertions, 54 deletions
diff --git a/test/unit/test_operationfactory.cpp b/test/unit/test_operationfactory.cpp index e78c4e3f..e07f88d1 100644 --- a/test/unit/test_operationfactory.cpp +++ b/test/unit/test_operationfactory.cpp @@ -6972,67 +6972,98 @@ TEST(operation, createOperation_ossfuzz_18587) { // --------------------------------------------------------------------------- -TEST(operation, derivedGeographicCRS_with_to_wgs84_to_geographicCRS) { +class derivedGeographicCRS_with_to_wgs84_to_geographicCRS + : public ::testing::Test { + protected: + void run(const CRSNNPtr &src) { + auto objDst = PROJStringParser().createFromPROJString( + "+proj=longlat +datum=WGS84 +type=crs"); + auto dst = nn_dynamic_pointer_cast<CRS>(objDst); + ASSERT_TRUE(dst != nullptr); + + { + auto op = CoordinateOperationFactory::create()->createOperation( + src, NN_CHECK_ASSERT(dst)); + ASSERT_TRUE(op != nullptr); + std::string pipeline( + "+proj=pipeline " + "+step +proj=unitconvert +xy_in=deg +xy_out=rad " + "+step +inv +proj=ob_tran +o_proj=latlon +over +lat_0=0 " + "+lon_0=180 " + "+o_lat_p=18 +o_lon_p=-200 +ellps=WGS84 " + "+step +proj=push +v_3 " + "+step +proj=cart +ellps=WGS84 " + "+step +proj=helmert +x=1 +y=2 +z=3 " + "+step +inv +proj=cart +ellps=WGS84 " + "+step +proj=pop +v_3 " + "+step +proj=unitconvert +xy_in=rad +xy_out=deg"); + EXPECT_EQ( + op->exportToPROJString(PROJStringFormatter::create().get()), + pipeline); + + auto op2 = CoordinateOperationFactory::create()->createOperation( + src, nn_static_pointer_cast<CRS>(GeographicCRS::EPSG_4326)); + ASSERT_TRUE(op2 != nullptr); + EXPECT_EQ( + op2->exportToPROJString(PROJStringFormatter::create().get()), + pipeline + " +step +proj=axisswap +order=2,1"); + } + + { + auto op = CoordinateOperationFactory::create()->createOperation( + NN_CHECK_ASSERT(dst), src); + ASSERT_TRUE(op != nullptr); + std::string pipeline( + "+step +proj=unitconvert +xy_in=deg +xy_out=rad " + "+step +proj=push +v_3 " + "+step +proj=cart +ellps=WGS84 " + "+step +proj=helmert +x=-1 +y=-2 +z=-3 " + "+step +inv +proj=cart +ellps=WGS84 " + "+step +proj=pop +v_3 " + "+step +proj=ob_tran +o_proj=latlon +over +lat_0=0 +lon_0=180 " + "+o_lat_p=18 +o_lon_p=-200 +ellps=WGS84 " + "+step +proj=unitconvert +xy_in=rad +xy_out=deg"); + EXPECT_EQ( + op->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=pipeline " + pipeline); + + auto op2 = CoordinateOperationFactory::create()->createOperation( + nn_static_pointer_cast<CRS>(GeographicCRS::EPSG_4326), src); + ASSERT_TRUE(op2 != nullptr); + EXPECT_EQ( + op2->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=pipeline +step +proj=axisswap +order=2,1 " + pipeline); + } + } +}; + +// --------------------------------------------------------------------------- + +TEST_F(derivedGeographicCRS_with_to_wgs84_to_geographicCRS, src_from_proj) { auto objSrc = PROJStringParser().createFromPROJString( "+proj=ob_tran +o_proj=latlon +lat_0=0 +lon_0=180 +o_lat_p=18.0 " "+o_lon_p=-200.0 +ellps=WGS84 +towgs84=1,2,3 +over +type=crs"); auto src = nn_dynamic_pointer_cast<CRS>(objSrc); ASSERT_TRUE(src != nullptr); - auto objDst = PROJStringParser().createFromPROJString( - "+proj=longlat +datum=WGS84 +type=crs"); - auto dst = nn_dynamic_pointer_cast<CRS>(objDst); - ASSERT_TRUE(dst != nullptr); + run(NN_CHECK_ASSERT(src)); +} - { - auto op = CoordinateOperationFactory::create()->createOperation( - NN_CHECK_ASSERT(src), NN_CHECK_ASSERT(dst)); - ASSERT_TRUE(op != nullptr); - std::string pipeline( - "+proj=pipeline " - "+step +proj=unitconvert +xy_in=deg +xy_out=rad " - "+step +inv +proj=ob_tran +o_proj=latlon +over +lat_0=0 +lon_0=180 " - "+o_lat_p=18 +o_lon_p=-200 +ellps=WGS84 " - "+step +proj=push +v_3 " - "+step +proj=cart +ellps=WGS84 " - "+step +proj=helmert +x=1 +y=2 +z=3 " - "+step +inv +proj=cart +ellps=WGS84 " - "+step +proj=pop +v_3 " - "+step +proj=unitconvert +xy_in=rad +xy_out=deg"); - EXPECT_EQ(op->exportToPROJString(PROJStringFormatter::create().get()), - pipeline); - - auto op2 = CoordinateOperationFactory::create()->createOperation( - NN_CHECK_ASSERT(src), - nn_static_pointer_cast<CRS>(GeographicCRS::EPSG_4326)); - ASSERT_TRUE(op2 != nullptr); - EXPECT_EQ(op2->exportToPROJString(PROJStringFormatter::create().get()), - pipeline + " +step +proj=axisswap +order=2,1"); - } +// --------------------------------------------------------------------------- - { - auto op = CoordinateOperationFactory::create()->createOperation( - NN_CHECK_ASSERT(dst), NN_CHECK_ASSERT(src)); - ASSERT_TRUE(op != nullptr); - std::string pipeline( - "+step +proj=unitconvert +xy_in=deg +xy_out=rad " - "+step +proj=push +v_3 " - "+step +proj=cart +ellps=WGS84 " - "+step +proj=helmert +x=-1 +y=-2 +z=-3 " - "+step +inv +proj=cart +ellps=WGS84 " - "+step +proj=pop +v_3 " - "+step +proj=ob_tran +o_proj=latlon +over +lat_0=0 +lon_0=180 " - "+o_lat_p=18 +o_lon_p=-200 +ellps=WGS84 " - "+step +proj=unitconvert +xy_in=rad +xy_out=deg"); - EXPECT_EQ(op->exportToPROJString(PROJStringFormatter::create().get()), - "+proj=pipeline " + pipeline); - - auto op2 = CoordinateOperationFactory::create()->createOperation( - nn_static_pointer_cast<CRS>(GeographicCRS::EPSG_4326), - NN_CHECK_ASSERT(src)); - ASSERT_TRUE(op2 != nullptr); - EXPECT_EQ(op2->exportToPROJString(PROJStringFormatter::create().get()), - "+proj=pipeline +step +proj=axisswap +order=2,1 " + pipeline); - } +TEST_F(derivedGeographicCRS_with_to_wgs84_to_geographicCRS, src_from_wkt2) { + // Same as above, but testing with a WKT CRS source + // The subtle difference is that the base CRS of the DerivedGeographicCRS + // will have a lat, lon axis order + auto objSrcProj = PROJStringParser().createFromPROJString( + "+proj=ob_tran +o_proj=latlon +lat_0=0 +lon_0=180 +o_lat_p=18.0 " + "+o_lon_p=-200.0 +ellps=WGS84 +towgs84=1,2,3 +over +type=crs"); + auto srcFromProj = nn_dynamic_pointer_cast<CRS>(objSrcProj); + ASSERT_TRUE(srcFromProj != nullptr); + auto srcWkt = srcFromProj->exportToWKT(WKTFormatter::create().get()); + auto objSrc = createFromUserInput(srcWkt, DatabaseContext::create(), false); + auto src = nn_dynamic_pointer_cast<CRS>(objSrc); + ASSERT_TRUE(src != nullptr); + run(NN_CHECK_ASSERT(src)); } // --------------------------------------------------------------------------- |
