aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Evers <kristianevers@gmail.com>2017-07-12 11:52:14 +0200
committerKristian Evers <kristianevers@gmail.com>2017-07-13 13:39:13 +0200
commitc3fd68227b408a0172afb449651d3dae6b38612e (patch)
treedc034ac13ffe9facc7c528d5be3201e3d9544fc4
parent8731336c9101b1948b401e0b0d8149598d56fa90 (diff)
downloadPROJ-c3fd68227b408a0172afb449651d3dae6b38612e.tar.gz
PROJ-c3fd68227b408a0172afb449651d3dae6b38612e.zip
Implemented proj_transform_coord() and proj_transform_obs()
-rw-r--r--src/PJ_cart.c39
-rw-r--r--src/pj_obs_api.c52
-rw-r--r--src/proj.def55
-rw-r--r--src/proj.h2
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
diff --git a/src/proj.h b/src/proj.h
index d15a798f..f94fb384 100644
--- a/src/proj.h
+++ b/src/proj.h
@@ -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);