From 24405e60078abf9693a9d1a058824c4edd8d4f2b Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Thu, 26 Sep 2019 12:16:15 +0200 Subject: 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. --- src/4D_api.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) (limited to 'src/4D_api.cpp') diff --git a/src/4D_api.cpp b/src/4D_api.cpp index db1d9516..4b47c4e9 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 ) -- cgit v1.2.3