From e1fabf92fca6af58b2716f97c2ebe884000c07f5 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Fri, 13 Sep 2019 02:28:24 +0200 Subject: Fix support for +proj=ob_tran +o_proj=lonlat/latlong/latlon (only +o_proj=longlat worked) (fixes #1601) --- src/iso19111/io.cpp | 5 ++++- test/unit/test_io.cpp | 43 ++++++++++++++++++++++++++----------------- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp index a86982d4..7194a838 100644 --- a/src/iso19111/io.cpp +++ b/src/iso19111/io.cpp @@ -8577,7 +8577,10 @@ CRSNNPtr PROJStringParser::Private::buildProjectedCRS( parameters, values) .as_nullable(); - if (methodName == "PROJ ob_tran o_proj=longlat") { + if (methodName == "PROJ ob_tran o_proj=longlat" || + methodName == "PROJ ob_tran o_proj=lonlat" || + methodName == "PROJ ob_tran o_proj=latlon" || + methodName == "PROJ ob_tran o_proj=latlong") { return DerivedGeographicCRS::create( PropertyMap().set(IdentifiedObject::NAME_KEY, "unnamed"), geogCRS, NN_NO_CHECK(conv), diff --git a/test/unit/test_io.cpp b/test/unit/test_io.cpp index 85f3e06a..872038fc 100644 --- a/test/unit/test_io.cpp +++ b/test/unit/test_io.cpp @@ -8540,23 +8540,32 @@ TEST(io, projparse_projected_wktext) { // --------------------------------------------------------------------------- TEST(io, projparse_ob_tran_longlat) { - std::string input( - "+type=crs +proj=pipeline +step +proj=axisswap +order=2,1 +step " - "+proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=ob_tran " - "+o_proj=longlat +o_lat_p=52 +o_lon_p=-30 +lon_0=-25 +ellps=WGS84 " - "+step +proj=axisswap +order=2,1"); - auto obj = PROJStringParser().createFromPROJString(input); - auto crs = nn_dynamic_pointer_cast(obj); - ASSERT_TRUE(crs != nullptr); - auto op = CoordinateOperationFactory::create()->createOperation( - GeographicCRS::EPSG_4326, NN_NO_CHECK(crs)); - 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 +proj=ob_tran " - "+o_proj=longlat +o_lat_p=52 +o_lon_p=-30 +lon_0=-25 " - "+ellps=WGS84 +step +proj=unitconvert +xy_in=rad +xy_out=deg " - "+step +proj=axisswap +order=2,1"); + for (const char *o_proj : {"longlat", "lonlat", "latlong", "latlon"}) { + std::string input( + "+type=crs +proj=pipeline +step +proj=axisswap +order=2,1 +step " + "+proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=ob_tran " + "+o_proj="); + input += o_proj; + input += " +o_lat_p=52 +o_lon_p=-30 +lon_0=-25 +ellps=WGS84 " + "+step +proj=axisswap +order=2,1"; + auto obj = PROJStringParser().createFromPROJString(input); + auto crs = nn_dynamic_pointer_cast(obj); + ASSERT_TRUE(crs != nullptr); + auto op = CoordinateOperationFactory::create()->createOperation( + GeographicCRS::EPSG_4326, NN_NO_CHECK(crs)); + ASSERT_TRUE(op != nullptr); + std::string expected( + "+proj=pipeline +step +proj=axisswap +order=2,1 +step " + "+proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=ob_tran " + "+o_proj="); + expected += o_proj; + expected += + " +o_lat_p=52 +o_lon_p=-30 +lon_0=-25 " + "+ellps=WGS84 +step +proj=unitconvert +xy_in=rad +xy_out=deg " + "+step +proj=axisswap +order=2,1"; + EXPECT_EQ(op->exportToPROJString(PROJStringFormatter::create().get()), + expected); + } } // --------------------------------------------------------------------------- -- cgit v1.2.3