aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2019-02-16 23:06:34 +0100
committerEven Rouault <even.rouault@spatialys.com>2019-02-16 23:07:27 +0100
commitacd7dda78bfeeff5a035215e852dd0da44dfcde8 (patch)
tree0076d52af795973709766f5182d6f01da614554f
parentaacbcb8361c547d1ebc05b8438859229fd517ef2 (diff)
downloadPROJ-acd7dda78bfeeff5a035215e852dd0da44dfcde8.tar.gz
PROJ-acd7dda78bfeeff5a035215e852dd0da44dfcde8.zip
Make sure proj_get_source_crs() and proj_get_target_crs() work on 'pseudo' PJ object returned by proj_create_crs_to_crs() when there are several alternatives
-rw-r--r--src/iso19111/c_api.cpp8
-rw-r--r--test/unit/gie_self_tests.cpp12
2 files changed, 20 insertions, 0 deletions
diff --git a/src/iso19111/c_api.cpp b/src/iso19111/c_api.cpp
index 240d11b3..79732bab 100644
--- a/src/iso19111/c_api.cpp
+++ b/src/iso19111/c_api.cpp
@@ -1736,6 +1736,10 @@ PJ *proj_get_source_crs(PJ_CONTEXT *ctx, const PJ *obj) {
}
return nullptr;
}
+ if (!obj->alternativeCoordinateOperations.empty()) {
+ return proj_get_source_crs(ctx,
+ obj->alternativeCoordinateOperations[0].pj);
+ }
proj_log_error(ctx, __FUNCTION__,
"Object is not a BoundCRS or a CoordinateOperation");
return nullptr;
@@ -1771,6 +1775,10 @@ PJ *proj_get_target_crs(PJ_CONTEXT *ctx, const PJ *obj) {
}
return nullptr;
}
+ if (!obj->alternativeCoordinateOperations.empty()) {
+ return proj_get_target_crs(ctx,
+ obj->alternativeCoordinateOperations[0].pj);
+ }
proj_log_error(ctx, __FUNCTION__,
"Object is not a BoundCRS or a CoordinateOperation");
return nullptr;
diff --git a/test/unit/gie_self_tests.cpp b/test/unit/gie_self_tests.cpp
index 91a3069c..5936791e 100644
--- a/test/unit/gie_self_tests.cpp
+++ b/test/unit/gie_self_tests.cpp
@@ -680,6 +680,18 @@ TEST(gie, proj_create_crs_to_crs_PULKOVO42_ETRS89) {
EXPECT_EQ(P->fwd3d, nullptr);
EXPECT_EQ(P->fwd4d, nullptr);
+ // get source CRS even if the P object is in a dummy state
+ auto src_crs = proj_get_source_crs(PJ_DEFAULT_CTX, P);
+ EXPECT_TRUE(src_crs != nullptr);
+ EXPECT_EQ(proj_get_name(src_crs), std::string("Pulkovo 1942(58)"));
+ proj_destroy(src_crs);
+
+ // get target CRS even if the P object is in a dummy state
+ auto target_crs = proj_get_target_crs(PJ_DEFAULT_CTX, P);
+ EXPECT_TRUE(target_crs != nullptr);
+ EXPECT_EQ(proj_get_name(target_crs), std::string("ETRS89"));
+ proj_destroy(target_crs);
+
// Romania
c.xyz.x = 45; // Lat
c.xyz.y = 25; // Long