aboutsummaryrefslogtreecommitdiff
path: root/src/4D_api.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2019-09-26 12:16:15 +0200
committerEven Rouault <even.rouault@spatialys.com>2019-09-26 13:28:54 +0200
commit668d882938b3e907bc3738df770f903843bf8578 (patch)
tree7f493eaac0739bc10c335f35e191fcc93e9bc8af /src/4D_api.cpp
parent36fb1cb5d74181475cbab9d01834059673d629f8 (diff)
downloadPROJ-668d882938b3e907bc3738df770f903843bf8578.tar.gz
PROJ-668d882938b3e907bc3738df770f903843bf8578.zip
proj_create_crs_to_crs(): fix when there are only transformations with ballpark steps
Currently we would discard all operations, resulting in a PJ object with zero candidates. Better use those operations if nothing better is available. Was seen on transforming from ETRS89 / UTM zone 31N + EGM96 height to WGS 84 (G1762). The horizontal transformation from ETRS89 to WGS 84 (G1762) is a ballpark one.
Diffstat (limited to 'src/4D_api.cpp')
-rw-r--r--src/4D_api.cpp21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/4D_api.cpp b/src/4D_api.cpp
index 70eaac6a..40cd609f 100644
--- a/src/4D_api.cpp
+++ b/src/4D_api.cpp
@@ -1137,6 +1137,8 @@ PJ *proj_create_crs_to_crs_from_pj (PJ_CONTEXT *ctx, const PJ *source_crs, cons
try
{
+ bool skipDefaultTransforms = true;
+
// Iterate over source->target candidate transformations and reproject
// their long-lat bounding box into the source CRS.
for( int i = 0; i < op_count; i++ )
@@ -1149,12 +1151,25 @@ PJ *proj_create_crs_to_crs_from_pj (PJ_CONTEXT *ctx, const PJ *source_crs, cons
double north_lat = 0.0;
const char* name = proj_get_name(op);
- if( name && (strstr(name, "Ballpark geographic offset") ||
+ bool canUseOp = true;
+ if( skipDefaultTransforms &&
+ name && (strstr(name, "Ballpark geographic offset") ||
strstr(name, "Ballpark geocentric translation")) )
{
- // Skip default transformations
+ // Skip default transformations unless there is already one at
+ // the beginning (in which case all of them will have one)
+ if( i == 0 )
+ {
+ skipDefaultTransforms = false;
+ }
+ else
+ {
+ canUseOp = false;
+ }
}
- else if( proj_get_area_of_use(ctx, op,
+
+ if( canUseOp &&
+ proj_get_area_of_use(ctx, op,
&west_lon, &south_lat, &east_lon, &north_lat, nullptr) )
{
if( west_lon <= east_lon )