diff options
| author | Kristian Evers <kristianevers@gmail.com> | 2017-07-12 11:52:14 +0200 |
|---|---|---|
| committer | Kristian Evers <kristianevers@gmail.com> | 2017-07-13 13:39:13 +0200 |
| commit | c3fd68227b408a0172afb449651d3dae6b38612e (patch) | |
| tree | dc034ac13ffe9facc7c528d5be3201e3d9544fc4 | |
| parent | 8731336c9101b1948b401e0b0d8149598d56fa90 (diff) | |
| download | PROJ-c3fd68227b408a0172afb449651d3dae6b38612e.tar.gz PROJ-c3fd68227b408a0172afb449651d3dae6b38612e.zip | |
Implemented proj_transform_coord() and proj_transform_obs()
| -rw-r--r-- | src/PJ_cart.c | 39 | ||||
| -rw-r--r-- | src/pj_obs_api.c | 52 | ||||
| -rw-r--r-- | src/proj.def | 55 | ||||
| -rw-r--r-- | src/proj.h | 2 |
4 files changed, 106 insertions, 42 deletions
diff --git a/src/PJ_cart.c b/src/PJ_cart.c index 9155dd03..c6d1dd74 100644 --- a/src/PJ_cart.c +++ b/src/PJ_cart.c @@ -235,6 +235,7 @@ int pj_cart_selftest (void) { PJ_CONTEXT *ctx; PJ *P; PJ_OBS a, b, obs[2]; + PJ_COORD coord[2]; int err; size_t n, sz; double dist, h, t; @@ -419,14 +420,42 @@ int pj_cart_selftest (void) { if (50 != obs[1].coo.lpz.z) return 27; /* NOTE: unchanged */ if (50==h) return 28; - /* Clean up */ - proj_destroy (P); + /* test proj_transform_obs() */ + + obs[0].coo = proj_coord (PJ_TORAD(12), PJ_TORAD(55), 45, 0); + obs[1].coo = proj_coord (PJ_TORAD(12), PJ_TORAD(56), 50, 0); + + if (proj_transform_obs(P, PJ_FWD, 2, obs)) + return 30; + if (a.coo.lpz.lam != obs[0].coo.lpz.lam) return 31; + if (a.coo.lpz.phi != obs[0].coo.lpz.phi) return 32; + if (a.coo.lpz.z != obs[0].coo.lpz.z) return 33; + if (b.coo.lpz.lam != obs[1].coo.lpz.lam) return 34; + if (b.coo.lpz.phi != obs[1].coo.lpz.phi) return 35; + if (b.coo.lpz.z != obs[1].coo.lpz.z) return 36; + + /* test proj_transform_coord() */ + + coord[0] = proj_coord (PJ_TORAD(12), PJ_TORAD(55), 45, 0); + coord[1] = proj_coord (PJ_TORAD(12), PJ_TORAD(56), 50, 0); + if (proj_transform_coord(P, PJ_FWD, 2, coord)) + return 40; + + if (a.coo.lpz.lam != coord[0].lpz.lam) return 41; + if (a.coo.lpz.phi != coord[0].lpz.phi) return 42; + if (a.coo.lpz.z != coord[0].lpz.z) return 43; + if (b.coo.lpz.lam != coord[1].lpz.lam) return 44; + if (b.coo.lpz.phi != coord[1].lpz.phi) return 45; + if (b.coo.lpz.z != coord[1].lpz.z) return 46; + + /* Clean up after transform* tests */ + proj_destroy (P); /* test proj_create_crs_to_crs() */ P = proj_create_crs_to_crs(0, "epsg:25832", "epsg:25833"); if (P==0) - return 30; + return 50; a.coo.xy.x = 700000.0; a.coo.xy.y = 6000000.0; @@ -435,14 +464,14 @@ int pj_cart_selftest (void) { a = proj_trans_obs(P, PJ_FWD, a); if (dist > 1e-7) - return 31; + return 51; proj_destroy(P); /* let's make sure that only entries in init-files results in a usable PJ */ P = proj_create_crs_to_crs(0, "proj=utm +zone=32 +datum=WGS84", "proj=utm +zone=33 +datum=WGS84"); if (P != 0) { proj_destroy(P); - return 32; + return 52; } return 0; diff --git a/src/pj_obs_api.c b/src/pj_obs_api.c index 1b353b46..81a6e337 100644 --- a/src/pj_obs_api.c +++ b/src/pj_obs_api.c @@ -216,7 +216,7 @@ size_t proj_transform ( In most cases, the stride will be identical for x, y,z, and t, since they will typically be either individual arrays (stride = sizeof(double)), or strided views into an array of application specific data structures (stride = sizeof (...)). - + But in order to support cases where x, y, z, and t come from heterogeneous sources, individual strides, sx, sy, sz, st, are used. @@ -244,7 +244,7 @@ size_t proj_transform ( if (0==ny) y = &null_broadcast; if (0==nz) z = &null_broadcast; if (0==nt) t = &null_broadcast; - + /* nothing to do? */ if (0==nx+ny+nz+nt) return 0; @@ -315,10 +315,46 @@ size_t proj_transform ( *z = coord.xyzt.z; if (nt==1) *t = coord.xyzt.t; - + return i; } +/*****************************************************************************/ +int proj_transform_obs (PJ *P, enum proj_direction direction, size_t n, PJ_OBS *obs) { +/****************************************************************************** + Batch transform an array of PJ_OBS. + + Returns 0 if all observations are transformed without error, otherwise + returns error number. +******************************************************************************/ + size_t i; + for (i=0; i<n; i++) { + obs[i] = proj_trans_obs(P, direction, obs[i]); + if (proj_errno(P)) + return proj_errno(P); + } + + return 0; +} + +/*****************************************************************************/ +int proj_transform_coord (PJ *P, enum proj_direction direction, size_t n, PJ_COORD *coord) { +/****************************************************************************** + Batch transform an array of PJ_COORD. + + Returns 0 if all coordinates are transformed without error, otherwise + returns error number. +******************************************************************************/ + size_t i; + for (i=0; i<n; i++) { + coord[i] = proj_trans_coord(P, direction, coord[i]); + if (proj_errno(P)) + return proj_errno(P); + } + + return 0; +} + PJ *proj_create (PJ_CONTEXT *ctx, const char *definition) { @@ -423,13 +459,13 @@ int proj_errno_reset (PJ *P) { /****************************************************************************** Clears errno in the PJ, and bubbles it up to the context and pj_errno levels through the low level pj_ctx interface. - + Returns the previous value of the errno, for convenient reset/restore operations: void foo (PJ *P) { int last_errno = proj_errno_reset (P); - + do_something_with_P (P); (* failure - keep latest error status *) @@ -489,9 +525,3 @@ void *proj_release (void *buffer) { double proj_torad (double angle_in_degrees) { return PJ_TORAD (angle_in_degrees);} double proj_todeg (double angle_in_radians) { return PJ_TODEG (angle_in_radians);} - - -/* The shape of jazz to come! */ - -int proj_transform_obs (PJ *P, enum proj_direction direction, size_t n, PJ_OBS *obs); -int proj_transform_coord (PJ *P, enum proj_direction direction, size_t n, PJ_COORD *coord); diff --git a/src/proj.def b/src/proj.def index c8f8be10..a61151ed 100644 --- a/src/proj.def +++ b/src/proj.def @@ -98,36 +98,39 @@ EXPORTS proj_trans_obs @94 proj_trans_coord @95 proj_transform @96 - proj_roundtrip @97 + proj_transform_obs @97 + proj_transform_coord @98 + proj_roundtrip @99 - proj_coord @98 - proj_coord_error @99 - proj_obs_error @100 + proj_coord @100 + proj_obs @101 + proj_coord_error @102 + proj_obs_error @103 - proj_errno @101 - proj_errno_set @102 - proj_errno_reset @103 - proj_errno_restore @104 - proj_context_errno_set @105 + proj_errno @104 + proj_errno_set @105 + proj_errno_reset @106 + proj_errno_restore @107 + proj_context_errno_set @108 - proj_context_create @106 - proj_context_set @107 - proj_context_inherit @108 - proj_context_destroy @109 + proj_context_create @109 + proj_context_set @110 + proj_context_inherit @111 + proj_context_destroy @112 - proj_lp_dist @110 - proj_xy_dist @111 - proj_xyz_dist @112 + proj_lp_dist @113 + proj_xy_dist @114 + proj_xyz_dist @115 - proj_log_level @113 - proj_log_func @114 - proj_log_error @115 - proj_log_debug @116 - proj_log_trace @117 + proj_log_level @116 + proj_log_func @117 + proj_log_error @118 + proj_log_debug @119 + proj_log_trace @120 - proj_definition_retrieve @118 - proj_release @119 - proj_torad @120 - proj_todeg @121 + proj_definition_retrieve @121 + proj_release @122 + proj_torad @123 + proj_todeg @124 - pj_find_file @122 + pj_find_file @125 @@ -311,6 +311,8 @@ size_t proj_transform ( double *t, size_t st, size_t nt ); +int proj_transform_obs (PJ *P, enum proj_direction direction, size_t n, PJ_OBS *obs); +int proj_transform_coord (PJ *P, enum proj_direction direction, size_t n, PJ_COORD *coord); /* Initializers */ PJ_COORD proj_coord (double x, double y, double z, double t); |
