From a2fd4206924fedc96c3fd12607fb61e84c4841c0 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Wed, 26 Dec 2018 12:34:47 +0100 Subject: Remove PJ_OBJ type since it is now merged into PJ --- src/4D_api.cpp | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) (limited to 'src/4D_api.cpp') diff --git a/src/4D_api.cpp b/src/4D_api.cpp index 71144a75..96d76ad8 100644 --- a/src/4D_api.cpp +++ b/src/4D_api.cpp @@ -83,6 +83,9 @@ int proj_angular_output (PJ *P, enum PJ_DIRECTION dir) { /* Geodesic distance (in meter) + fwd and rev azimuth between two points on the ellipsoid */ PJ_COORD proj_geod (const PJ *P, PJ_COORD a, PJ_COORD b) { PJ_COORD c; + if( !P->geod ) { + return proj_coord_error(); + } /* Note: the geodesic code takes arguments in degrees */ geod_inverse (P->geod, PJ_TODEG(a.lpz.phi), PJ_TODEG(a.lpz.lam), @@ -98,6 +101,9 @@ PJ_COORD proj_geod (const PJ *P, PJ_COORD a, PJ_COORD b) { double proj_lp_dist (const PJ *P, PJ_COORD a, PJ_COORD b) { double s12, azi1, azi2; /* Note: the geodesic code takes arguments in degrees */ + if( !P->geod ) { + return HUGE_VAL; + } geod_inverse (P->geod, PJ_TODEG(a.lpz.phi), PJ_TODEG(a.lpz.lam), PJ_TODEG(b.lpz.phi), PJ_TODEG(b.lpz.lam), @@ -744,12 +750,6 @@ PJ *proj_create_crs_to_crs (PJ_CONTEXT *ctx, const char *source_crs, const char PJ *P = proj_create_crs_to_crs(0, "EPSG:25832", "EPSG:25833", NULL); ******************************************************************************/ - PJ *P; - PJ_OBJ* src; - PJ_OBJ* dst; - PJ_OPERATION_FACTORY_CONTEXT* operation_ctx; - PJ_OBJ_LIST* op_list; - PJ_OBJ* op; const char* proj_string; const char* const optionsProj4Mode[] = { "USE_PROJ4_INIT_RULES=YES", nullptr }; @@ -760,23 +760,23 @@ PJ *proj_create_crs_to_crs (PJ_CONTEXT *ctx, const char *source_crs, const char const char* const* optionsImportCRS = proj_context_get_use_proj4_init_rules(ctx, FALSE) ? optionsProj4Mode : nullptr; - src = proj_obj_create_from_user_input(ctx, source_crs, optionsImportCRS); + auto src = proj_obj_create_from_user_input(ctx, source_crs, optionsImportCRS); if( !src ) { proj_context_log_debug(ctx, "Cannot instanciate source_crs"); return nullptr; } - dst = proj_obj_create_from_user_input(ctx, target_crs, optionsImportCRS); + auto dst = proj_obj_create_from_user_input(ctx, target_crs, optionsImportCRS); if( !dst ) { proj_context_log_debug(ctx, "Cannot instanciate target_crs"); - proj_obj_destroy(src); + proj_destroy(src); return nullptr; } - operation_ctx = proj_create_operation_factory_context(ctx, nullptr); + auto operation_ctx = proj_create_operation_factory_context(ctx, nullptr); if( !operation_ctx ) { - proj_obj_destroy(src); - proj_obj_destroy(dst); + proj_destroy(src); + proj_destroy(dst); return nullptr; } @@ -793,11 +793,11 @@ PJ *proj_create_crs_to_crs (PJ_CONTEXT *ctx, const char *source_crs, const char proj_operation_factory_context_set_grid_availability_use( ctx, operation_ctx, PROJ_GRID_AVAILABILITY_DISCARD_OPERATION_IF_MISSING_GRID); - op_list = proj_obj_create_operations(ctx, src, dst, operation_ctx); + auto op_list = proj_obj_create_operations(ctx, src, dst, operation_ctx); proj_operation_factory_context_destroy(operation_ctx); - proj_obj_destroy(src); - proj_obj_destroy(dst); + proj_destroy(src); + proj_destroy(dst); if( !op_list ) { return nullptr; @@ -809,7 +809,7 @@ PJ *proj_create_crs_to_crs (PJ_CONTEXT *ctx, const char *source_crs, const char return nullptr; } - op = proj_obj_list_get(ctx, op_list, 0); + auto op = proj_obj_list_get(ctx, op_list, 0); proj_obj_list_destroy(op_list); if( !op ) { return nullptr; @@ -817,11 +817,12 @@ PJ *proj_create_crs_to_crs (PJ_CONTEXT *ctx, const char *source_crs, const char proj_string = proj_obj_as_proj_string(ctx, op, PJ_PROJ_5, nullptr); if( !proj_string) { - proj_obj_destroy(op); + proj_destroy(op); proj_context_log_debug(ctx, "Cannot export operation as a PROJ string"); return nullptr; } + PJ* P; if( proj_string[0] == '\0' ) { /* Null transform ? */ P = proj_create(ctx, "proj=affine"); @@ -829,7 +830,7 @@ PJ *proj_create_crs_to_crs (PJ_CONTEXT *ctx, const char *source_crs, const char P = proj_create(ctx, proj_string); } - proj_obj_destroy(op); + proj_destroy(op); return P; } -- cgit v1.2.3 From c9b32000d5fc12705bea92e6509fbedb37193012 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Wed, 26 Dec 2018 13:42:46 +0100 Subject: Make ISO-19111 objects of type CoordinateOperation directly usable with proj_trans() and similar methods --- src/4D_api.cpp | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) (limited to 'src/4D_api.cpp') diff --git a/src/4D_api.cpp b/src/4D_api.cpp index 96d76ad8..43ffe72c 100644 --- a/src/4D_api.cpp +++ b/src/4D_api.cpp @@ -42,6 +42,9 @@ #include "projects.h" #include "geodesic.h" +#include "proj/common.hpp" +#include "proj/coordinateoperation.hpp" + /* Initialize PJ_COORD struct */ PJ_COORD proj_coord (double x, double y, double z, double t) { @@ -1070,9 +1073,6 @@ PJ_PROJ_INFO proj_pj_info(PJ *P) { memset(&pjinfo, 0, sizeof(PJ_PROJ_INFO)); - /* Expected accuracy of the transformation. Hardcoded for now, will be improved */ - /* later. Most likely to be used when a transformation is set up with */ - /* proj_create_crs_to_crs in a future version that leverages the EPSG database. */ pjinfo.accuracy = -1.0; if (nullptr==P) @@ -1082,8 +1082,30 @@ PJ_PROJ_INFO proj_pj_info(PJ *P) { if (pj_param(P->ctx, P->params, "tproj").i) pjinfo.id = pj_param(P->ctx, P->params, "sproj").s; - /* projection description */ - pjinfo.description = P->descr; + /* coordinate operation description */ + if( P->iso_obj ) { + pjinfo.description = P->iso_obj->nameStr().c_str(); + } else { + pjinfo.description = P->descr; + } + + // accuracy + if( P->iso_obj ) { + auto conv = dynamic_cast(P->iso_obj.get()); + if( conv ) { + pjinfo.accuracy = 0.0; + } else { + auto op = dynamic_cast(P->iso_obj.get()); + if( op ) { + const auto& accuracies = op->coordinateOperationAccuracies(); + if( !accuracies.empty() ) { + try { + pjinfo.accuracy = std::stod(accuracies[0]->value()); + } catch ( const std::exception& ) {} + } + } + } + } /* projection definition */ if (P->def_full) -- cgit v1.2.3 From 8ab6f683cd316acf57bb89ed83932a267c5aa3c2 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Wed, 26 Dec 2018 14:58:26 +0100 Subject: Merge projects.h into proj_internal.h --- src/4D_api.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/4D_api.cpp') diff --git a/src/4D_api.cpp b/src/4D_api.cpp index 43ffe72c..ce9d7bd9 100644 --- a/src/4D_api.cpp +++ b/src/4D_api.cpp @@ -39,7 +39,7 @@ #include "proj.h" #include "proj_internal.h" #include "proj_math.h" -#include "projects.h" +#include "proj_internal.h" #include "geodesic.h" #include "proj/common.hpp" -- cgit v1.2.3 From 0e0e0e475414ddeb75e0e140d8a3381a431036d9 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Fri, 28 Dec 2018 11:00:50 +0100 Subject: Rename proj_obj_XXX as proj_XXX and PJ_OBJ_XXX as PJ_XXX --- src/4D_api.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'src/4D_api.cpp') diff --git a/src/4D_api.cpp b/src/4D_api.cpp index ce9d7bd9..d8288af8 100644 --- a/src/4D_api.cpp +++ b/src/4D_api.cpp @@ -743,7 +743,7 @@ PJ *proj_create_crs_to_crs (PJ_CONTEXT *ctx, const char *source_crs, const char - a PROJ string, like "+proj=longlat +datum=WGS84". When using that syntax, the axis order and unit for geographic CRS will be longitude, latitude, and the unit degrees. - - more generally any string accepted by proj_obj_create_from_user_input() + - more generally any string accepted by proj_create_from_user_input() An "area of use" can be specified in area. When it is supplied, the more accurate transformation between two given systems can be chosen. @@ -763,13 +763,13 @@ PJ *proj_create_crs_to_crs (PJ_CONTEXT *ctx, const char *source_crs, const char const char* const* optionsImportCRS = proj_context_get_use_proj4_init_rules(ctx, FALSE) ? optionsProj4Mode : nullptr; - auto src = proj_obj_create_from_user_input(ctx, source_crs, optionsImportCRS); + auto src = proj_create_from_user_input(ctx, source_crs, optionsImportCRS); if( !src ) { proj_context_log_debug(ctx, "Cannot instanciate source_crs"); return nullptr; } - auto dst = proj_obj_create_from_user_input(ctx, target_crs, optionsImportCRS); + auto dst = proj_create_from_user_input(ctx, target_crs, optionsImportCRS); if( !dst ) { proj_context_log_debug(ctx, "Cannot instanciate target_crs"); proj_destroy(src); @@ -796,7 +796,7 @@ PJ *proj_create_crs_to_crs (PJ_CONTEXT *ctx, const char *source_crs, const char proj_operation_factory_context_set_grid_availability_use( ctx, operation_ctx, PROJ_GRID_AVAILABILITY_DISCARD_OPERATION_IF_MISSING_GRID); - auto op_list = proj_obj_create_operations(ctx, src, dst, operation_ctx); + auto op_list = proj_create_operations(ctx, src, dst, operation_ctx); proj_operation_factory_context_destroy(operation_ctx); proj_destroy(src); @@ -806,19 +806,19 @@ PJ *proj_create_crs_to_crs (PJ_CONTEXT *ctx, const char *source_crs, const char return nullptr; } - if( proj_obj_list_get_count(op_list) == 0 ) { - proj_obj_list_destroy(op_list); + if( proj_list_get_count(op_list) == 0 ) { + proj_list_destroy(op_list); proj_context_log_debug(ctx, "No operation found matching criteria"); return nullptr; } - auto op = proj_obj_list_get(ctx, op_list, 0); - proj_obj_list_destroy(op_list); + auto op = proj_list_get(ctx, op_list, 0); + proj_list_destroy(op_list); if( !op ) { return nullptr; } - proj_string = proj_obj_as_proj_string(ctx, op, PJ_PROJ_5, nullptr); + proj_string = proj_as_proj_string(ctx, op, PJ_PROJ_5, nullptr); if( !proj_string) { proj_destroy(op); proj_context_log_debug(ctx, "Cannot export operation as a PROJ string"); -- cgit v1.2.3