aboutsummaryrefslogtreecommitdiff
path: root/src/4D_api.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/4D_api.cpp')
-rw-r--r--src/4D_api.cpp37
1 files changed, 35 insertions, 2 deletions
diff --git a/src/4D_api.cpp b/src/4D_api.cpp
index 1b3374f3..81e16600 100644
--- a/src/4D_api.cpp
+++ b/src/4D_api.cpp
@@ -51,6 +51,7 @@
#include "proj/common.hpp"
#include "proj/coordinateoperation.hpp"
#include "proj/internal/internal.hpp"
+#include "proj/internal/io_internal.hpp"
using namespace NS_PROJ::internal;
@@ -192,6 +193,8 @@ similarly, but prefers the 2D resp. 3D interfaces if available.
direction = opposite_direction(direction);
if( !P->alternativeCoordinateOperations.empty() ) {
+ // Do a first pass and select the first coordinate operation whose area
+ // of use is compatible with the input coordinate
int i = 0;
for( const auto &alt: P->alternativeCoordinateOperations ) {
if( direction == PJ_FWD ) {
@@ -223,6 +226,35 @@ similarly, but prefers the 2D resp. 3D interfaces if available.
}
i ++;
}
+
+ // In case we did not find an operation whose area of use is compatible
+ // with the input coordinate, then goes through again the list, and
+ // use the first operation that does not require grids.
+ i = 0;
+ for( const auto &alt: P->alternativeCoordinateOperations ) {
+ auto coordOperation = dynamic_cast<
+ NS_PROJ::operation::CoordinateOperation*>(alt.pj->iso_obj.get());
+ if( coordOperation ) {
+ if( coordOperation->gridsNeeded(P->ctx->cpp_context ?
+ P->ctx->cpp_context->databaseContext.as_nullable() :
+ nullptr).empty() ) {
+ if( P->iCurCoordOp != i ) {
+ std::string msg("Using coordinate operation ");
+ msg += alt.name;
+ pj_log(P->ctx, PJ_LOG_TRACE, msg.c_str());
+ P->iCurCoordOp = i;
+ }
+ if( direction == PJ_FWD ) {
+ return pj_fwd4d( coord, alt.pj );
+ }
+ else {
+ return pj_inv4d( coord, alt.pj );
+ }
+ }
+ }
+ i++;
+ }
+
proj_errno_set (P, EINVAL);
return proj_coord_error ();
}
@@ -1102,8 +1134,8 @@ PJ *proj_create_crs_to_crs (PJ_CONTEXT *ctx, const char *source_crs, const char
double north_lat = 0.0;
const char* name = proj_get_name(op);
- if( name && (strstr(name, "Null geographic offset") ||
- strstr(name, "Null geocentric translation")) )
+ if( name && (strstr(name, "Ballpark geographic offset") ||
+ strstr(name, "Ballpark geocentric translation")) )
{
// Skip default transformations
}
@@ -1333,6 +1365,7 @@ static char *path_append (char *buf, const char *app, size_t *buf_size) {
pj_dealloc (buf);
buf = p;
}
+ assert(buf);
/* Only append a semicolon if something's already there */
if (0 != buflen)