From 608c7c6f568cab02abcebcbc162db47dfdb6da8a Mon Sep 17 00:00:00 2001 From: Kristian Evers Date: Wed, 12 Jul 2017 10:15:16 +0200 Subject: Implemented proj_create_crs_to_crs() --- src/pj_obs_api.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) (limited to 'src/pj_obs_api.c') diff --git a/src/pj_obs_api.c b/src/pj_obs_api.c index d8395b0f..e52d9c1c 100644 --- a/src/pj_obs_api.c +++ b/src/pj_obs_api.c @@ -314,6 +314,36 @@ PJ *proj_create_argv (PJ_CONTEXT *ctx, int argc, char **argv) { return pj_init_ctx (ctx, argc, argv); } +/*****************************************************************************/ +PJ *proj_create_crs_to_crs (PJ_CONTEXT *ctx, const char *srid_from, const char *srid_to) { +/****************************************************************************** + Create a transformation pipeline between two known coordinate reference + systems. + + srid_from and srid_to should be the value part of a +init=... parameter + set, i.e. "epsg:25833" or "IGNF:AMST63". Any projection definition that is + can be found in a init-file in PROJ_LIB is a valid input to this function. + + For now the function mimics the cs2cs app: An input and an output CRS is + given and coordinates are transformed via a hub datum (WGS84). This + transformation strategy is referred to as "early-binding" by the EPSG. The + function can be extended to support "late-binding" transformations in the + future without affecting users of the function. + + Example call: + + PJ *P = proj_create_crs_to_crs(0, "epsg:25832", "epsg:25833"); + +******************************************************************************/ + PJ *P; + char buffer[256]; + + sprintf(buffer, "+proj=pipeline +step +init=%s +inv +step +init=%s", srid_from, srid_to); + P = proj_create(ctx, buffer); + + return P; +} + PJ *proj_destroy (PJ *P) { pj_free (P); return 0; @@ -447,4 +477,3 @@ double proj_todeg (double angle_in_radians) { return PJ_TODEG (angle_in_radians) 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); PJ_OBS proj_obs (double x, double y, double z, double t, double o, double p, double k, int id, unsigned int flags); -PJ *proj_create_crs_to_crs (PJ_CONTEXT *ctx, const char *def_from, const char *def_to); -- cgit v1.2.3 From 8731336c9101b1948b401e0b0d8149598d56fa90 Mon Sep 17 00:00:00 2001 From: Kristian Evers Date: Wed, 12 Jul 2017 10:42:44 +0200 Subject: Implemented proj_obs() --- src/pj_obs_api.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'src/pj_obs_api.c') diff --git a/src/pj_obs_api.c b/src/pj_obs_api.c index e52d9c1c..1b353b46 100644 --- a/src/pj_obs_api.c +++ b/src/pj_obs_api.c @@ -42,6 +42,7 @@ #include +/* Initialize PJ_COORD struct */ PJ_COORD proj_coord (double x, double y, double z, double t) { PJ_COORD res; res.v[0] = x; @@ -51,6 +52,24 @@ PJ_COORD proj_coord (double x, double y, double z, double t) { return res; } +/* Initialize PJ_OBS struct */ +PJ_OBS proj_obs (double x, double y, double z, double t, double o, double p, double k, int id, unsigned int flags) { + PJ_OBS res; + res.coo.v[0] = x; + res.coo.v[1] = y; + res.coo.v[2] = z; + res.coo.v[3] = t; + res.anc.v[0] = o; + res.anc.v[1] = p; + res.anc.v[2] = k; + res.id = id; + res.flags = flags; + + return res; +} + + + /* Geodesic distance between two points with angular 2D coordinates */ double proj_lp_dist (PJ *P, LP a, LP b) { double s12, azi1, azi2; @@ -476,4 +495,3 @@ double proj_todeg (double angle_in_radians) { return PJ_TODEG (angle_in_radians) 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); -PJ_OBS proj_obs (double x, double y, double z, double t, double o, double p, double k, int id, unsigned int flags); -- cgit v1.2.3 From c3fd68227b408a0172afb449651d3dae6b38612e Mon Sep 17 00:00:00 2001 From: Kristian Evers Date: Wed, 12 Jul 2017 11:52:14 +0200 Subject: Implemented proj_transform_coord() and proj_transform_obs() --- src/pj_obs_api.c | 52 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 11 deletions(-) (limited to 'src/pj_obs_api.c') 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 Date: Wed, 12 Jul 2017 14:07:31 +0200 Subject: Added proj_has_inverse(). Fixes #155. --- src/pj_obs_api.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/pj_obs_api.c') diff --git a/src/pj_obs_api.c b/src/pj_obs_api.c index 81a6e337..4fac1dac 100644 --- a/src/pj_obs_api.c +++ b/src/pj_obs_api.c @@ -525,3 +525,7 @@ 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);} + +int proj_has_inverse(PJ *P) { + return (P->inv != 0 || P->inv3d != 0 || P->invobs != 0); +} -- cgit v1.2.3 From 40bc7c0bb8b422774be37fa7af0f80877bb52696 Mon Sep 17 00:00:00 2001 From: Kristian Evers Date: Thu, 13 Jul 2017 14:00:47 +0200 Subject: Add proj_dmstor() and proj_rtodms() to proj.h API. Resolves #172. --- src/pj_obs_api.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src/pj_obs_api.c') diff --git a/src/pj_obs_api.c b/src/pj_obs_api.c index 4fac1dac..05fe58f0 100644 --- a/src/pj_obs_api.c +++ b/src/pj_obs_api.c @@ -529,3 +529,11 @@ double proj_todeg (double angle_in_radians) { return PJ_TODEG (angle_in_radians) int proj_has_inverse(PJ *P) { return (P->inv != 0 || P->inv3d != 0 || P->invobs != 0); } + +double proj_dmstor(const char *is, char **rs) { + return dmstor(is, rs); +} + +char* proj_rtodms(char *s, double r, int pos, int neg) { + return rtodms(s, r, pos, neg); +} -- cgit v1.2.3