aboutsummaryrefslogtreecommitdiff
path: root/src/4D_api.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2021-06-17 17:53:11 +0200
committerEven Rouault <even.rouault@spatialys.com>2021-06-17 17:53:11 +0200
commit5f6fac3afdb03aef5a26ce5f60c10ed612fa6fc2 (patch)
treef26e1e183d1cd73e84eef01571d9596f76d1b5a3 /src/4D_api.cpp
parent987c8e9a4521c3e80fac73dbaa76ff77747d854b (diff)
downloadPROJ-5f6fac3afdb03aef5a26ce5f60c10ed612fa6fc2.tar.gz
PROJ-5f6fac3afdb03aef5a26ce5f60c10ed612fa6fc2.zip
proj_trans/cs2cs: If two operations have the same accuracy, use the one that is contained within a larger one
Relates to https://github.com/OSGeo/gdal/issues/3998 Before that change, cs2cs on a NAD83(HARN) to WGS84 transformation would use the "NAD83(HARN) to WGS 84 (1)" transformation (a null Helmert shift) that is valid for whole US, including non-CONUS areas, even when used on points located on CONUS that has a "NAD83(HARN) to WGS 84 (3)" transformation (non-null Helmert shift) with same accuracy (1m). But if doing EPSG:2874 "NAD83(HARN) / California zone 5 (ftUS)" to WGS84, we would use this later "NAD83(HARN) to WGS 84 (3)" transformation because the area of use of EPSG:2874 restricts to CONUS. This isn't consistant. With that change, we now have more consistent behavior, even if it can be argued which of the 2 transformations is the best... $ echo 34 -120 | src/cs2cs -d 8 EPSG:4326 "NAD83(HARN)" | src/cs2cs "NAD83(HARN)" EPSG:2874 5955507.74 1828410.98 0.00 $ echo 34 -120 | src/cs2cs EPSG:4326 EPSG:2874 5955507.74 1828410.98 0.00
Diffstat (limited to 'src/4D_api.cpp')
-rw-r--r--src/4D_api.cpp10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/4D_api.cpp b/src/4D_api.cpp
index 8b676f9b..95582e48 100644
--- a/src/4D_api.cpp
+++ b/src/4D_api.cpp
@@ -243,7 +243,15 @@ int pj_get_suggested_operation(PJ_CONTEXT*,
// onshore. So in a general way, prefer a onshore area to a
// offshore one.
if( iBest < 0 ||
- (alt.accuracy >= 0 && alt.accuracy < bestAccuracy &&
+ (alt.accuracy >= 0 &&
+ (alt.accuracy < bestAccuracy ||
+ // If two operations have the same accuracy, use the one that
+ // is contained within a larger one
+ (alt.accuracy == bestAccuracy &&
+ alt.minxSrc > opList[iBest].minxSrc &&
+ alt.minySrc > opList[iBest].minySrc &&
+ alt.maxxSrc < opList[iBest].maxxSrc &&
+ alt.maxySrc < opList[iBest].maxySrc)) &&
!alt.isOffshore) ) {
iBest = i;
bestAccuracy = alt.accuracy;