diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2020-07-09 11:50:44 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-07-09 11:50:44 +0200 |
| commit | 668fb0aacd46db2c4aaadb557b14443eee028405 (patch) | |
| tree | 67e0e2c041687bb62471c3c624c33a7d15b47f79 | |
| parent | 24624869b426b6e436697ee4f7b116f5db823c66 (diff) | |
| parent | 5c9bd6e722e2ccfd4048633239756b85b901c9f2 (diff) | |
| download | PROJ-668fb0aacd46db2c4aaadb557b14443eee028405.tar.gz PROJ-668fb0aacd46db2c4aaadb557b14443eee028405.zip | |
Merge pull request #2300 from rouault/krovak_czech
PROJ string export of +proj=krovak +czech: make sure we export +czech…
| -rw-r--r-- | src/iso19111/coordinateoperation.cpp | 31 | ||||
| -rw-r--r-- | test/unit/test_io.cpp | 34 |
2 files changed, 52 insertions, 13 deletions
diff --git a/src/iso19111/coordinateoperation.cpp b/src/iso19111/coordinateoperation.cpp index 482e6e6d..dd8658fb 100644 --- a/src/iso19111/coordinateoperation.cpp +++ b/src/iso19111/coordinateoperation.cpp @@ -6282,6 +6282,8 @@ void Conversion::_exportToPROJString( bEllipsoidParametersDone = true; } + auto l_targetCRS = targetCRS(); + bool bAxisSpecFound = false; if (!bConversionDone) { const MethodMapping *mapping = getMapping(l_method.get()); @@ -6291,14 +6293,32 @@ void Conversion::_exportToPROJString( formatter->addParam("approx"); } if (mapping->proj_name_aux) { + bool addAux = true; if (internal::starts_with(mapping->proj_name_aux, "axis=")) { + if (mapping->epsg_code == EPSG_CODE_METHOD_KROVAK) { + auto projCRS = dynamic_cast<const crs::ProjectedCRS *>( + l_targetCRS.get()); + if (projCRS) { + const auto &axisList = + projCRS->coordinateSystem()->axisList(); + if (axisList[0]->direction() == + cs::AxisDirection::WEST && + axisList[1]->direction() == + cs::AxisDirection::SOUTH) { + formatter->addParam("czech"); + addAux = false; + } + } + } bAxisSpecFound = true; } - auto kv = split(mapping->proj_name_aux, '='); - if (kv.size() == 2) { - formatter->addParam(kv[0], kv[1]); - } else { - formatter->addParam(mapping->proj_name_aux); + if (addAux) { + auto kv = split(mapping->proj_name_aux, '='); + if (kv.size() == 2) { + formatter->addParam(kv[0], kv[1]); + } else { + formatter->addParam(mapping->proj_name_aux); + } } } @@ -6352,7 +6372,6 @@ void Conversion::_exportToPROJString( } } - auto l_targetCRS = targetCRS(); if (l_targetCRS && applyTargetCRSModifiers) { crs::CRS *horiz = l_targetCRS.get(); const auto compound = dynamic_cast<const crs::CompoundCRS *>(horiz); diff --git a/test/unit/test_io.cpp b/test/unit/test_io.cpp index e6e56d44..433e3e6d 100644 --- a/test/unit/test_io.cpp +++ b/test/unit/test_io.cpp @@ -1306,13 +1306,6 @@ TEST(wkt_parse, wkt1_krovak_south_west) { expectedPROJString); obj = PROJStringParser().createFromPROJString( - "+proj=krovak +czech +type=crs"); - crs2 = nn_dynamic_pointer_cast<ProjectedCRS>(obj); - ASSERT_TRUE(crs2 != nullptr); - EXPECT_EQ(crs2->exportToPROJString(PROJStringFormatter::create().get()), - expectedPROJString); - - obj = PROJStringParser().createFromPROJString( "+type=crs +proj=pipeline +step +proj=unitconvert +xy_in=deg " "+xy_out=rad " "+step +proj=krovak +lat_0=49.5 " @@ -8709,6 +8702,33 @@ TEST(io, projparse_krovak_axis_swu) { // --------------------------------------------------------------------------- +TEST(io, projparse_krovak_czech) { + auto obj = PROJStringParser().createFromPROJString( + "+proj=krovak +czech +type=crs"); + auto crs = nn_dynamic_pointer_cast<ProjectedCRS>(obj); + ASSERT_TRUE(crs != nullptr); + EXPECT_EQ(crs->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=krovak +czech +lat_0=49.5 +lon_0=24.8333333333333 " + "+alpha=30.2881397527778 +k=0.9999 +x_0=0 +y_0=0 " + "+ellps=bessel +units=m +no_defs +type=crs"); + WKTFormatterNNPtr f(WKTFormatter::create()); + f->simulCurNodeHasId(); + f->setMultiLine(false); + crs->exportToWKT(f.get()); + auto wkt = f->toString(); + EXPECT_TRUE(wkt.find("METHOD[\"Krovak\",ID[\"EPSG\",9819]]") != + std::string::npos) + << wkt; + EXPECT_TRUE(wkt.find(",AXIS[\"westing\",west,ORDER[1]") != + std::string::npos) + << wkt; + EXPECT_TRUE(wkt.find(",AXIS[\"southing\",south,ORDER[2]") != + std::string::npos) + << wkt; +} + +// --------------------------------------------------------------------------- + TEST(io, projparse_etmerc) { auto obj = PROJStringParser().createFromPROJString("+proj=etmerc +type=crs"); |
