aboutsummaryrefslogtreecommitdiff
path: root/src/4D_api.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2019-02-16 19:19:43 +0100
committerEven Rouault <even.rouault@spatialys.com>2019-02-16 19:19:43 +0100
commit9689243b940e6b908db377dee357f422a00129e8 (patch)
treef5c0b79c46db32575b1203e9b92de3a798cd328f /src/4D_api.cpp
parentfd0f8849bb8a217e5f7c788f65f47a5b90bc1720 (diff)
downloadPROJ-9689243b940e6b908db377dee357f422a00129e8.tar.gz
PROJ-9689243b940e6b908db377dee357f422a00129e8.zip
Make sure that the PJ object returned by proj_create_crs_to_crs() is a proper CoordinateOperation so that we can call proj_get_source_crs() on it for example
Diffstat (limited to 'src/4D_api.cpp')
-rw-r--r--src/4D_api.cpp49
1 files changed, 10 insertions, 39 deletions
diff --git a/src/4D_api.cpp b/src/4D_api.cpp
index b44cdf39..1b3374f3 100644
--- a/src/4D_api.cpp
+++ b/src/4D_api.cpp
@@ -818,23 +818,6 @@ std::string pj_add_type_crs_if_needed(const std::string& str)
}
/*****************************************************************************/
-static PJ* op_to_pj(PJ_CONTEXT* ctx, PJ* op)
-/*****************************************************************************/
-{
- auto proj_string = proj_as_proj_string(ctx, op, PJ_PROJ_5, nullptr);
- if( !proj_string) {
- return nullptr;
- }
-
- if( proj_string[0] == '\0' ) {
- /* Null transform ? */
- return proj_create(ctx, "proj=affine");
- } else {
- return proj_create(ctx, proj_string);
- }
-}
-
-/*****************************************************************************/
static void reproject_bbox(PJ* pjGeogToCrs,
double west_lon, double south_lat,
double east_lon, double north_lat,
@@ -890,7 +873,7 @@ static void reproject_bbox(PJ* pjGeogToCrs,
/*****************************************************************************/
-static PJ* add_coord_op_to_list(PJ_CONTEXT* ctx, PJ* op,
+static PJ* add_coord_op_to_list(PJ* op,
double west_lon, double south_lat,
double east_lon, double north_lat,
PJ* pjGeogToSrc,
@@ -916,15 +899,10 @@ static PJ* add_coord_op_to_list(PJ_CONTEXT* ctx, PJ* op,
{
const char* c_name = proj_get_name(op);
std::string name(c_name ? c_name : "");
- auto pj = op_to_pj(ctx, op);
- proj_destroy(op);
+ altCoordOps.emplace_back(minxSrc, minySrc, maxxSrc, maxySrc,
+ minxDst, minyDst, maxxDst, maxyDst,
+ op, name);
op = nullptr;
- if( pj )
- {
- altCoordOps.emplace_back(minxSrc, minySrc, maxxSrc, maxySrc,
- minxDst, minyDst, maxxDst, maxyDst,
- pj, name);
- }
}
return op;
}
@@ -988,9 +966,7 @@ static PJ* create_operation_to_base_geog_crs(PJ_CONTEXT* ctx, PJ* crs) {
auto opGeogToCrs = proj_list_get(ctx, op_list_to_geodetic, 0);
assert(opGeogToCrs);
proj_list_destroy(op_list_to_geodetic);
- auto P = op_to_pj(ctx, opGeogToCrs);
- proj_destroy(opGeogToCrs);
- return P;
+ return opGeogToCrs;
}
/*****************************************************************************/
@@ -1072,13 +1048,8 @@ PJ *proj_create_crs_to_crs (PJ_CONTEXT *ctx, const char *source_crs, const char
return nullptr;
}
- PJ* P;
- {
- auto op = proj_list_get(ctx, op_list, 0);
- assert(op);
- P = op_to_pj(ctx, op);
- proj_destroy(op);
- }
+ PJ* P = proj_list_get(ctx, op_list, 0);
+ assert(P);
if( P == nullptr || op_count == 1 || (area && area->bbox_set) ||
proj_get_type(src) == PJ_TYPE_GEOCENTRIC_CRS ||
@@ -1141,7 +1112,7 @@ PJ *proj_create_crs_to_crs (PJ_CONTEXT *ctx, const char *source_crs, const char
{
if( west_lon <= east_lon )
{
- op = add_coord_op_to_list(ctx, op,
+ op = add_coord_op_to_list(op,
west_lon, south_lat, east_lon, north_lat,
pjGeogToSrc, pjGeogToDst,
P->alternativeCoordinateOperations);
@@ -1150,11 +1121,11 @@ PJ *proj_create_crs_to_crs (PJ_CONTEXT *ctx, const char *source_crs, const char
{
auto op_clone = proj_clone(ctx, op);
- op = add_coord_op_to_list(ctx, op,
+ op = add_coord_op_to_list(op,
west_lon, south_lat, 180, north_lat,
pjGeogToSrc, pjGeogToDst,
P->alternativeCoordinateOperations);
- op_clone = add_coord_op_to_list(ctx, op_clone,
+ op_clone = add_coord_op_to_list(op_clone,
-180, south_lat, east_lon, north_lat,
pjGeogToSrc, pjGeogToDst,
P->alternativeCoordinateOperations);