aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2020-07-09 11:50:44 +0200
committerGitHub <noreply@github.com>2020-07-09 11:50:44 +0200
commit668fb0aacd46db2c4aaadb557b14443eee028405 (patch)
tree67e0e2c041687bb62471c3c624c33a7d15b47f79
parent24624869b426b6e436697ee4f7b116f5db823c66 (diff)
parent5c9bd6e722e2ccfd4048633239756b85b901c9f2 (diff)
downloadPROJ-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.cpp31
-rw-r--r--test/unit/test_io.cpp34
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");