Skip to content

Commit

Permalink
Merge pull request #2747 from rouault/fix_gdal_3958
Browse files Browse the repository at this point in the history
BoundCRS::identify(): avoid incompatible transformation for WKT1 / TOWGS84 export (fixes OSGeo/gdal#3958)
  • Loading branch information
rouault authored Jun 10, 2021
2 parents 51ec5e3 + db10e86 commit 385ca0e
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 4 deletions.
10 changes: 9 additions & 1 deletion src/iso19111/crs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@
#include "proj/internal/internal.hpp"
#include "proj/internal/io_internal.hpp"

#include "operation/oputils.hpp"

#include "proj_constants.h"
#include "proj_json_streaming_writer.hpp"

Expand Down Expand Up @@ -5519,7 +5521,13 @@ BoundCRS::_identify(const io::AuthorityFactoryPtr &authorityFactory) const {
auto opNormalized = op->normalizeForVisualization();
std::string opTransfPROJString;
bool opTransfPROJStringValid = false;
if (op->nameStr().find("Ballpark geographic") == 0) {
const auto &opName = op->nameStr();
if (starts_with(opName,
osgeo::proj::operation::
BALLPARK_GEOCENTRIC_TRANSLATION) ||
starts_with(
opName,
osgeo::proj::operation::NULL_GEOGRAPHIC_OFFSET)) {
if (refIsNullTransform) {
res.emplace_back(create(candidateBaseCRS,
d->hubCRS_,
Expand Down
26 changes: 23 additions & 3 deletions test/unit/test_crs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4646,9 +4646,10 @@ TEST(crs, boundCRS_identify_db) {
auto res = crs->identify(factoryEPSG);
ASSERT_EQ(res.size(), 1U);
EXPECT_EQ(res.front().second, 25);
auto wkt = crs->exportToWKT(
WKTFormatter::create(WKTFormatter::Convention::WKT1_GDAL).get());
EXPECT_TRUE(wkt.find("32122") != std::string::npos) << wkt;
auto boundCRS = dynamic_cast<const BoundCRS *>(res.front().first.get());
ASSERT_TRUE(boundCRS != nullptr);
EXPECT_EQ(boundCRS->baseCRS()->getEPSGCode(), 32122);
EXPECT_EQ(boundCRS->transformation()->method()->getEPSGCode(), 9603);
}

{
Expand All @@ -4665,6 +4666,25 @@ TEST(crs, boundCRS_identify_db) {
EXPECT_EQ(boundCRS->baseCRS()->getEPSGCode(), 3148);
EXPECT_EQ(res.front().second, 70);
}

{
// Identify a WKT with datum WGS84 and TOWGS84
auto obj = WKTParser().attachDatabaseContext(dbContext).createFromWKT(
"GEOGCS[\"WGS84 Coordinate System\",DATUM[\"WGS 1984\","
"SPHEROID[\"WGS 1984\",6378137,298.257223563],"
"TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",\"6326\"]],"
"PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433],"
"AUTHORITY[\"EPSG\",\"4326\"]]");
auto crs = nn_dynamic_pointer_cast<BoundCRS>(obj);
ASSERT_TRUE(crs != nullptr);
auto res = crs->identify(factoryEPSG);
ASSERT_EQ(res.size(), 1U);
EXPECT_EQ(res.front().second, 100);
auto boundCRS = dynamic_cast<const BoundCRS *>(res.front().first.get());
ASSERT_TRUE(boundCRS != nullptr);
EXPECT_EQ(boundCRS->baseCRS()->getEPSGCode(), 4326);
EXPECT_EQ(boundCRS->transformation()->method()->getEPSGCode(), 9606);
}
}

// ---------------------------------------------------------------------------
Expand Down

0 comments on commit 385ca0e

Please sign in to comment.