diff options
Diffstat (limited to 'examples/pj_obs_api_test.c')
| -rw-r--r-- | examples/pj_obs_api_test.c | 243 |
1 files changed, 0 insertions, 243 deletions
diff --git a/examples/pj_obs_api_test.c b/examples/pj_obs_api_test.c deleted file mode 100644 index bb792c62..00000000 --- a/examples/pj_obs_api_test.c +++ /dev/null @@ -1,243 +0,0 @@ -/******************************************************************************* - Tiny test of an evolving new API, demonstrating simple examples of - 2D and 3D transformations. - - The main transformation setup object is PJ, well known from the two - former proj APIs (projects.h and proj_api.h) - - The main data object PJ_OBS is new, but encapsulates the older - LP, XY etc. objects in a framework for storing a 3D observation taken at - a 4D point in space-time, and including some additional metadata (e.g. - a serial number or an epsg code). - - PJ_OBS uses unions to enforce explicit statement of what kind of - coordinates are expected at a given spot in the code. - - The primary elements of the API are: - - pj_create (char *desc): - Create a new PJ object from a text description. - pj_trans (PJ *P, int direction, PJ_OBS obs): - Forward or inverse transformation of obs. - pj_error (PJ *P): - Check error status of P. - pj_free (PJ *P): - Clean up when done with the transformation object. - - These 4 functions should cover most of the common use cases. Additional - functionality for handling thread contexts are provided by the functions - pj_debug_set, pj_error_set, pj_log_set, pj_context_renew, - pj_context_inherit, pj_context_free, pj_fileapi_set. - - The proj thread contexts have not seen widespread use, so one of the - intentions with this new API is to make them less visible on the API - surface: Contexts do not have a life by themselves, they are only - visible through their associated PJs, and the number of functions - supporting them is limited. - - Compilation example: - gcc -pedantic -W -Wall -Wextra -I../src -o pj_proj_test pj_proj_test.c -L../../../build/proj.4/lib -lproj_4_9 - - Thomas Knudsen, 2016-10-30/11-03 -*******************************************************************************/ -#include <proj.h> - -int pj_pipeline_selftest (void); - -int main (void) { - PJ *P; - PJ_OBS a, b; - char *args[3] = {"proj=utm", "zone=32", "ellps=GRS80"}; - int err; - double dist; - XY cph_utm32; - - /* Log everything libproj offers to log for you */ - pj_log_level (0, PJ_LOG_TRACE); - - /* An utm projection on the GRS80 ellipsoid */ - P = pj_create ("+proj=utm +zone=32 +ellps=GRS80"); - if (0==P) - return puts ("Oops"), 0; - - /* Clean up */ - pj_free (P); - - /* Same projection, now using argc/argv style initialization */ - P = pj_create_argv (3, args); - if (0==P) - return puts ("Oops"), 0; - - /* zero initialize everything, then set (longitude, latitude) to (12, 55) */ - a = pj_obs_null (); - /* a.coo.lp: The coordinate part of a, interpreted as a classic LP pair */ - a.coo.lp.lam = TORAD(12); - a.coo.lp.phi = TORAD(55); - - /* Forward projection */ - b = pj_trans (P, PJ_FWD, a); - printf ("FWD: %15.9f %15.9f\n", b.coo.enh.e, b.coo.enh.n); - cph_utm32 = b.coo.xy; - - /* Inverse projection */ - a = pj_trans (P, PJ_INV, b); - printf ("INV: %15.9f %15.9f\n", TODEG(a.coo.lpz.lam), TODEG(a.coo.lpz.phi)); - - /* Null projection */ - a = pj_trans (P, PJ_IDENT, a); - printf ("IDENT: %15.9f %15.9f\n", TODEG(a.coo.lpz.lam), TODEG(a.coo.lpz.phi)); - - /* Forward again, to get two linear items for comparison */ - a = pj_trans (P, PJ_FWD, a); - printf ("FWD: %15.9f %15.9f\n", b.coo.enh.e, b.coo.enh.n); - - dist = pj_xy_dist (a.coo.xy, b.coo.xy); - printf ("Roundtrip deviation, (nm): %15.9f\n", dist*1e9); - - /* should be identical - checking whether null-init is done */ - dist = pj_xyz_dist (a.coo.xyz, b.coo.xyz); - printf ("Roundtrip deviation, (nm): %15.9f\n", dist*1e9); - - /* Invalid projection */ - a = pj_trans (P, 42, a); - if (a.coo.lpz.lam!=DBL_MAX) - printf ("%15.9f %15.9f\n", a.coo.lpz.lam, a.coo.lpz.phi); - err = pj_err_level (P, PJ_ERR_TELL); - printf ("pj_err_level: %d\n", err); - - /* Clean up */ - pj_free (P); - - /* Now do some 3D transformations */ - P = pj_create ("+proj=cart +ellps=GRS80"); - if (0==P) - return puts ("Oops"), 0; - - /* zero initialize everything, then set (longitude, latitude, height) to (12, 55, 100) */ - a = b = pj_obs_null (); - a.coo.lpz.lam = TORAD(12); - a.coo.lpz.phi = TORAD(55); - a.coo.lpz.z = 100; - - /* Forward projection: 3D-Cartesian-to-Ellipsoidal */ - b = pj_trans (P, PJ_FWD, a); - printf ("FWD: %15.9f %15.9f %15.9f\n", b.coo.xyz.x, b.coo.xyz.y, b.coo.xyz.z); - - /* Check roundtrip precision for 10000 iterations each way */ - dist = pj_roundtrip (P, PJ_FWD, 10000, a); - printf ("Roundtrip deviation, fwd (nm): %15.9f\n", dist*1e9*1e5); - dist = pj_roundtrip (P, PJ_INV, 10000, b); - printf ("Roundtrip deviation, inv (nm): %15.9f\n", dist*1e9); - - /* Inverse projection: Ellipsoidal-to-3D-Cartesian */ - b = pj_trans (P, PJ_INV, b); - printf ("INV: %15.9f %15.9f %15.9f\n", TODEG(b.coo.lpz.lam), TODEG(b.coo.lpz.phi), b.coo.lpz.z); - - /* Move p to another context */ - pj_context_renew (P); - b = pj_trans (P, PJ_FWD, b); - printf ("CTX1: %15.9f %15.9f %15.9f\n", b.coo.xyz.x, b.coo.xyz.y, b.coo.xyz.z); - - /* Move it back to the default context */ - pj_context_free (P); - b = pj_trans (P, PJ_INV, b); - printf ("CTX0: %15.9f %15.9f %15.9f\n", TODEG(b.coo.lpz.lam), TODEG(b.coo.lpz.phi), b.coo.lpz.z); - - pj_free (P); - - /*************************************************************************** - - P I P E L I N E T E S T S - - ***************************************************************************/ - - /* forward-reverse geo->utm->geo */ - P = pj_create ( - "+proj=pipeline +ellps=GRS80 +zone=32 +step " - "+proj=utm +step " - "+proj=utm +inv" - ); - if (0==P) - return puts ("Oops"), 0; - /* zero initialize everything, then set (longitude, latitude, height) to (12, 55, 100) */ - a = b = pj_obs_null (); - a.coo.lpz.lam = TORAD(12); - a.coo.lpz.phi = TORAD(55); - a.coo.lpz.z = 100; - printf ("PRE: %15.9f %15.9f\n", a.coo.lpz.lam, a.coo.lpz.phi); - - /* Forward projection */ - b = pj_trans (P, PJ_FWD, a); - printf ("FWD: %15.9f %15.9f\n", TODEG(b.coo.lpz.lam), TODEG(b.coo.lpz.phi)); - - /* Inverse projection */ - a = pj_trans (P, PJ_INV, b); - printf ("INV: %15.9f %15.9f\n", TODEG(a.coo.lpz.lam), TODEG(a.coo.lpz.phi)); - - pj_free (P); - - - /* And now the back-to-back situation utm->geo->utm */ - P = pj_create ( - "+proj=pipeline +ellps=GRS80 +zone=32 +step " - "+proj=utm +inv +step " - "+proj=utm"); - if (0==P) - return puts ("Oops"), 0; - - /* zero initialize everything, then set (easting, northing) to utm(12, 55) */ - a = b = pj_obs_null (); - a.coo.xy = cph_utm32; - printf ("PRE: %15.9f %15.9f\n", a.coo.xy.x, a.coo.xy.y); - - /* Forward projection */ - b = pj_trans (P, PJ_FWD, a); - printf ("FWD: %15.9f %15.9f\n", b.coo.xy.x, b.coo.xy.y); - - /* Inverse projection */ - a = pj_trans (P, PJ_INV, b); - printf ("INV: %15.9f %15.9f\n", a.coo.xy.x, a.coo.xy.y); - - pj_free (P); - - - - /* Finally testing a corner case: A rather pointless one-step pipeline geo->utm */ - P = pj_create ("+proj=pipeline +ellps=GRS80 +zone=32 +step +proj=utm"); - if (0==P) - return puts ("Oops"), 0; - - /* zero initialize everything, then set (easting, northing) to utm(12, 55) */ - a = b = pj_obs_null (); - a.coo.lpz.lam = TORAD(12); - a.coo.lpz.phi = TORAD(55); - printf ("PRE: %15.9f %15.9f\n", TODEG(a.coo.lp.lam), TODEG(a.coo.lp.phi)); - printf ("EXP: %15.9f %15.9f\n", cph_utm32.x, cph_utm32.y); - - /* Forward projection */ - b = pj_trans (P, PJ_FWD, a); - printf ("FWD: %15.9f %15.9f\n", b.coo.xy.x, b.coo.xy.y); - - /* Inverse projection */ - a = pj_trans (P, PJ_INV, b); - printf ("INV: %15.9f %15.9f\n", TODEG(a.coo.lp.lam), TODEG(a.coo.lp.phi)); - - /* Geodesic distance between two points with angular 2D coordinates */ - a.coo.lp.lam = TORAD(12); - a.coo.lp.phi = TORAD(60); - b.coo.lp.lam = TORAD(12); - b.coo.lp.phi = TORAD(61); - dist = pj_lp_dist (P, a.coo.lp, b.coo.lp); - printf ("1 deg at 60N: %15.9f\n", dist); - - a.coo.lp.lam = TORAD(12); - a.coo.lp.phi = TORAD(0.); - b.coo.lp.lam = TORAD(12); - b.coo.lp.phi = TORAD(1.); - dist = pj_lp_dist (P, a.coo.lp, b.coo.lp); - printf ("1 deg at Equator: %15.9f\n", dist); - - pj_free (P); - pj_pipeline_selftest (); - return 0; -} |
