This is an automated email from the git hooks/post-receive script. sebastic pushed a commit to branch experimental in repository proj.
commit 881ab4caef1aa40fc591b7bc13c1e9a3db55645d Author: Bas Couwenberg <sebas...@xs4all.nl> Date: Fri Feb 23 20:40:17 2018 +0100 New upstream version 5.0.0~rc5 --- NEWS | 6 +- man/man1/cct.1 | 4 +- man/man1/proj.1 | 4 +- nad/CMakeLists.txt | 3 +- nad/Makefile.am | 4 +- nad/Makefile.in | 4 +- nad/README | 7 - nad/test27 | 2 +- nad/test83 | 2 +- src/PJ_calcofi.c | 2 +- src/PJ_horner.c | 16 +- src/cct.c | 4 +- src/geodesic.c | 16 +- src/geodesic.h | 4 +- src/geodtest.c | 232 ++++++++++++++++++++++++++++- src/gie.c | 133 +++++++++++++---- src/pj_mlfn.c | 2 +- test/CMakeLists.txt | 1 + test/gie/DHDN_ETRS89.gie | 373 +++++++++++++++++++++++++++++++++++++++++++++++ test/gie/Makefile.am | 8 +- test/gie/Makefile.in | 8 +- 21 files changed, 768 insertions(+), 67 deletions(-) diff --git a/NEWS b/NEWS index c61bcd2..5ef2a12 100644 --- a/NEWS +++ b/NEWS @@ -162,7 +162,7 @@ o The PROJ.4 project also distributes the datum-grid package, o Updated EPSG database to version 9.2.0. - o Geodesic library updated to version 1.49.1-c. + o Geodesic library updated to version 1.49.2-c. o Support for analytical partial derivatives has been removed. @@ -232,9 +232,9 @@ o The PROJ.4 project also distributes the datum-grid package, o Equations for meridian convergence and partial derivatives have been corrected for non-conformal projections. #526. - o Fixed scaling of cartesian coordiantes in pj_transform(). #726. + o Fixed scaling of cartesian coordinates in pj_transform(). #726. - o Additional bug fixes courtesy of Googles OSS-Fuzz program: + o Additional bug fixes courtesy of Google's OSS-Fuzz program: https://bugs.chromium.org/p/oss-fuzz/issues/list?can=1&q=proj4 diff --git a/man/man1/cct.1 b/man/man1/cct.1 index b74896f..d055310 100644 --- a/man/man1/cct.1 +++ b/man/man1/cct.1 @@ -30,7 +30,7 @@ professor of Geodesy at the University of Copenhagen, mentor and advisor for a generation of Danish geodesists, colleague and collaborator for two generations of global geodesists, Secretary General for the International Association of Geodesy, IAG (1995--2007), fellow of the -Amercan Geophysical Union (1991), recipient of the IAG Levallois Medal +American Geophysical Union (1991), recipient of the IAG Levallois Medal (2007), the European Geosciences Union Vening Meinesz Medal (2008), and of numerous other honours. .PP @@ -40,7 +40,7 @@ the development of geodesy - both through his scientific contributions, comprising more than 250 publications, and by his mentoring and teaching of the next generations of geodesists. .PP -As Christian was an avid Fortran programmer, and a keen Unix connoiseur, +As Christian was an avid Fortran programmer, and a keen Unix connoisseur, he would have enjoyed to know that his initials would be used to name a modest Unix style transformation filter, hinting at the tireless aspect of his personality, which was certainly one of the reasons he accomplished diff --git a/man/man1/proj.1 b/man/man1/proj.1 index 5bcd11c..5b58fcd 100644 --- a/man/man1/proj.1 +++ b/man/man1/proj.1 @@ -119,7 +119,7 @@ output from x-y or longitude-latitude to y-x or latitude-longitude. .TP .BI \-S Causes estimation of -.I meridinal +.I meridional and .I parallel scale factors, @@ -131,7 +131,7 @@ and and .I minimum scale factors to be listed between <> for each input point. -For conformal projections meridinal and parallel scales factors +For conformal projections meridional and parallel scales factors will be equal and angular distortion zero. Equal area projections will have an area factor of 1. .TP diff --git a/nad/CMakeLists.txt b/nad/CMakeLists.txt index 9858e05..904066f 100644 --- a/nad/CMakeLists.txt +++ b/nad/CMakeLists.txt @@ -23,7 +23,8 @@ set(PROJ_DICTIONARY epsg # file(GLOB GSB_FILES *.gsb) -set(GRIDSHIFT_FILES ${GSB_FILES}) +file(GLOB GTX_FILES *.gtx) +set(GRIDSHIFT_FILES ${GSB_FILES} ${GTX_FILES}) set(GRIDSHIFT_FILES ${GRIDSHIFT_FILES} ) option(CONVERT_DATA "convert some ascii file to binary file for use in proj4" OFF) diff --git a/nad/Makefile.am b/nad/Makefile.am index 99d00da..001b1b0 100644 --- a/nad/Makefile.am +++ b/nad/Makefile.am @@ -50,7 +50,7 @@ install-data-local: process-nad2bin else \ echo "nad2nad NADCON source files not present"; \ fi - @for gridfile in $(NADPATH)/*.gsb $(NADPATH)/ntv1_can.dat dummy \ + @for gridfile in $(NADPATH)/*.gsb $(NADPATH)/*.gtx $(NADPATH)/ntv1_can.dat dummy \ $(NADPATH)/alaska $(NADPATH)/conus $(NADPATH)/hawaii $(NADPATH)/null \ $(NADPATH)/prvi $(NADPATH)/stgeorge $(NADPATH)/stlrnc $(NADPATH)/stpaul \ $(NADPATH)/FL $(NADPATH)/MD $(NADPATH)/TN $(NADPATH)/WI $(NADPATH)/WO; do \ @@ -63,7 +63,7 @@ install-data-local: process-nad2bin check-local: process-nad2bin # Check if we are doing an out-of-tree build @if test ! -f epsg; then \ - for gridfile in $(NADPATH)/*.gsb $(NADPATH)/ntv1_can.dat dummy ; do \ + for gridfile in $(NADPATH)/*.gsb $(NADPATH)/*.gtx $(NADPATH)/ntv1_can.dat dummy ; do \ if test "$$gridfile" != "dummy" -a -f "$$gridfile" ; then \ cp $$gridfile .; \ fi; \ diff --git a/nad/Makefile.in b/nad/Makefile.in index 6960030..74e0f11 100644 --- a/nad/Makefile.in +++ b/nad/Makefile.in @@ -543,7 +543,7 @@ install-data-local: process-nad2bin else \ echo "nad2nad NADCON source files not present"; \ fi - @for gridfile in $(NADPATH)/*.gsb $(NADPATH)/ntv1_can.dat dummy \ + @for gridfile in $(NADPATH)/*.gsb $(NADPATH)/*.gtx $(NADPATH)/ntv1_can.dat dummy \ $(NADPATH)/alaska $(NADPATH)/conus $(NADPATH)/hawaii $(NADPATH)/null \ $(NADPATH)/prvi $(NADPATH)/stgeorge $(NADPATH)/stlrnc $(NADPATH)/stpaul \ $(NADPATH)/FL $(NADPATH)/MD $(NADPATH)/TN $(NADPATH)/WI $(NADPATH)/WO; do \ @@ -556,7 +556,7 @@ install-data-local: process-nad2bin check-local: process-nad2bin # Check if we are doing an out-of-tree build @if test ! -f epsg; then \ - for gridfile in $(NADPATH)/*.gsb $(NADPATH)/ntv1_can.dat dummy ; do \ + for gridfile in $(NADPATH)/*.gsb $(NADPATH)/*.gtx $(NADPATH)/ntv1_can.dat dummy ; do \ if test "$$gridfile" != "dummy" -a -f "$$gridfile" ; then \ cp $$gridfile .; \ fi; \ diff --git a/nad/README b/nad/README index 4ed6b19..886e345 100644 --- a/nad/README +++ b/nad/README @@ -67,10 +67,3 @@ TN.lla.Z --- Tennessee WI.lla.Z --- Wisconsin WO.lla.Z --- Washington, Oregon, N. California - Other grid shift files -ntv1_can.dat --- Canadian NTv1 grid shift file (NAD27-->NAD83) -ntf_r93.gsb --- French NTv2 grid shift file (NTF-->RGF93) -BETA2007.gsb --- German NTv2 grid shift file (DE_DHDN-->ETRS89) : - http://crs.bkg.bund.de/crseu/crs/descrtrans/BeTA/de_dhdn2etrs_beta.php - Confirmed with Uwe Schmitz <uwe.schm...@bezreg-koeln.nrw.de> that free - redistribution is allowed and welcome. diff --git a/nad/test27 b/nad/test27 index 917f571..e154a0d 100755 --- a/nad/test27 +++ b/nad/test27 @@ -4,7 +4,7 @@ # the second pair of numbers are respective easting and northing output. # # Proj will vary in the .001ft range with projections using Transverse -# Mercator due to greater precision of meridinal distance function. +# Mercator due to greater precision of meridional distance function. # NAD_DIR=`dirname $0` EXE=$1 diff --git a/nad/test83 b/nad/test83 index cf182ce..c025938 100755 --- a/nad/test83 +++ b/nad/test83 @@ -5,7 +5,7 @@ # the second pair of numbers are respective easting and northing output. # # Proj will vary in the .001ft range with projections using Transverse -# Mercator due to greater precision of meridinal distance function. +# Mercator due to greater precision of meridional distance function. # NAD_DIR=`dirname $0` EXE=$1 diff --git a/src/PJ_calcofi.c b/src/PJ_calcofi.c index 5c0b64a..955e82c 100644 --- a/src/PJ_calcofi.c +++ b/src/PJ_calcofi.c @@ -13,7 +13,7 @@ PROJ_HEAD(calcofi, /* Conversions for the California Cooperative Oceanic Fisheries Investigations Line/Station coordinate system following the algorithm of: -Eber, L.E., and R.P. Hewitt. 1979. Conversion algorithms for the CALCOFI +Eber, L.E., and R.P. Hewitt. 1979. Conversion algorithms for the CalCOFI station grid. California Cooperative Oceanic Fisheries Investigations Reports 20:135-137. (corrected for typographical errors). http://www.calcofi.org/publications/calcofireports/v20/Vol_20_Eber___Hewitt.pdf diff --git a/src/PJ_horner.c b/src/PJ_horner.c index d1146aa..a132eff 100644 --- a/src/PJ_horner.c +++ b/src/PJ_horner.c @@ -96,6 +96,8 @@ static HORNER *horner_alloc (size_t order, int complex_polynomia); static void horner_free (HORNER *h); struct horner { + int uneg; /* u axis negated? */ + int vneg; /* v axis negated? */ int order; /* maximum degree of polynomium */ int coefs; /* number of coefficients for each polynomium */ double range; /* radius of the region of validity */ @@ -340,11 +342,19 @@ polynomial evaluation engine. c = cb + sz; e = position.u - transformation->fwd_origin->u; n = position.v - transformation->fwd_origin->v; + if (transformation->uneg) + e = -e; + if (transformation->vneg) + n = -n; } else { /* inverse */ cb = transformation->inv_c; c = cb + sz; e = position.u - transformation->inv_origin->u; n = position.v - transformation->inv_origin->v; + if (transformation->uneg) + e = -e; + if (transformation->vneg) + n = -n; } if ((fabs(n) > range) || (fabs(e) > range)) { @@ -454,6 +464,10 @@ PJ *PROJECTION(horner) { P->opaque = (void *) Q; if (complex_horner) { + /* Westings and/or southings? */ + Q->uneg = pj_param_exists (P->params, "uneg") ? 1 : 0; + Q->vneg = pj_param_exists (P->params, "vneg") ? 1 : 0; + n = 2*degree + 2; if (0==parse_coefs (P, Q->fwd_c, "fwd_c", n)) return horner_freeup (P, PJD_ERR_MISSING_ARGS); @@ -461,8 +475,8 @@ PJ *PROJECTION(horner) { return horner_freeup (P, PJD_ERR_MISSING_ARGS); P->fwd4d = complex_horner_forward_4d; P->inv4d = complex_horner_reverse_4d; - } + else { n = horner_number_of_coefficients (degree); if (0==parse_coefs (P, Q->fwd_u, "fwd_u", n)) diff --git a/src/cct.c b/src/cct.c index dc68122..25e97af 100644 --- a/src/cct.c +++ b/src/cct.c @@ -24,7 +24,7 @@ professor of Geodesy at the University of Copenhagen, mentor and advisor for a generation of Danish geodesists, colleague and collaborator for two generations of global geodesists, Secretary General for the International Association of Geodesy, IAG (1995--2007), fellow of the -Amercan Geophysical Union (1991), recipient of the IAG Levallois Medal +American Geophysical Union (1991), recipient of the IAG Levallois Medal (2007), the European Geosciences Union Vening Meinesz Medal (2008), and of numerous other honours. @@ -34,7 +34,7 @@ the development of geodesy - both through his scientific contributions, comprising more than 250 publications, and by his mentoring and teaching of the next generations of geodesists. -As Christian was an avid Fortran programmer, and a keen Unix connoiseur, +As Christian was an avid Fortran programmer, and a keen Unix connoisseur, he would have enjoyed to know that his initials would be used to name a modest Unix style transformation filter, hinting at the tireless aspect of his personality, which was certainly one of the reasons he accomplished diff --git a/src/geodesic.c b/src/geodesic.c index 233dc34..23557b5 100644 --- a/src/geodesic.c +++ b/src/geodesic.c @@ -18,7 +18,7 @@ * * See the comments in geodesic.h for documentation. * - * Copyright (c) Charles Karney (2012-2017) <char...@karney.com> and licensed + * Copyright (c) Charles Karney (2012-2018) <char...@karney.com> and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ */ @@ -89,10 +89,14 @@ static void Init() { tolb = tol0 * tol2; xthresh = 1000 * tol2; degree = pi/180; + #if defined(NAN) + NaN = NAN; + #else { real minus1 = -1; NaN = sqrt(minus1); } + #endif init = 1; } } @@ -1809,13 +1813,13 @@ int transitdirect(real lon1, real lon2) { #if HAVE_C99_MATH lon1 = remainder(lon1, (real)(720)); lon2 = remainder(lon2, (real)(720)); - return ( (lon2 >= 0 && lon2 < 360 ? 0 : 1) - - (lon1 >= 0 && lon1 < 360 ? 0 : 1) ); + return ( (lon2 <= 0 && lon2 > -360 ? 1 : 0) - + (lon1 <= 0 && lon1 > -360 ? 1 : 0) ); #else lon1 = fmod(lon1, (real)(720)); lon2 = fmod(lon2, (real)(720)); - return ( ((lon2 >= 0 && lon2 < 360) || lon2 < -360 ? 0 : 1) - - ((lon1 >= 0 && lon1 < 360) || lon1 < -360 ? 0 : 1) ); + return ( ((lon2 <= 0 && lon2 > -360) || lon2 > 360 ? 1 : 0) - + ((lon1 <= 0 && lon1 > -360) || lon1 > 360 ? 1 : 0) ); #endif } @@ -1888,7 +1892,7 @@ void geod_polygon_addpoint(const struct geod_geodesic* g, void geod_polygon_addedge(const struct geod_geodesic* g, struct geod_polygon* p, real azi, real s) { - if (p->num) { /* Do nothing is num is zero */ + if (p->num) { /* Do nothing is num is zero */ real lat, lon, S12 = 0; /* Initialize S12 to stop Visual Studio warning */ geod_gendirect(g, p->lat, p->lon, azi, GEOD_LONG_UNROLL, s, &lat, &lon, 0, diff --git a/src/geodesic.h b/src/geodesic.h index 43fd0d1..cd7c2b7 100644 --- a/src/geodesic.h +++ b/src/geodesic.h @@ -107,7 +107,7 @@ * twice about restructuring the internals of the C code since this may make * porting fixes from the C++ code more difficult. * - * Copyright (c) Charles Karney (2012-2017) <char...@karney.com> and licensed + * Copyright (c) Charles Karney (2012-2018) <char...@karney.com> and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ * @@ -132,7 +132,7 @@ * The patch level of the geodesic library. (This tracks the version of * GeographicLib.) **********************************************************************/ -#define GEODESIC_VERSION_PATCH 1 +#define GEODESIC_VERSION_PATCH 2 /** * Pack the version components into a single integer. Users should not rely on diff --git a/src/geodtest.c b/src/geodtest.c index 0f2c0ac..76c0d14 100644 --- a/src/geodtest.c +++ b/src/geodtest.c @@ -4,7 +4,7 @@ * * Run these tests by configuring with cmake and running "make test". * - * Copyright (c) Charles Karney (2015-2017) <char...@karney.com> and licensed + * Copyright (c) Charles Karney (2015-2018) <char...@karney.com> and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ @@ -688,6 +688,48 @@ static int GeodSolve78() { return result; } +static int GeodSolve80() { + /* Some tests to add code coverage: computing scale in special cases + zero + length geodesic (includes GeodSolve80 - GeodSolve83) + using an incapable + line. */ + double a12, s12, azi1, azi2, m12, M12, M21, S12; + struct geod_geodesic g; + struct geod_geodesicline l; + int result = 0; + geod_init(&g, wgs84_a, wgs84_f); + geod_geninverse(&g, 0, 0, 0, 90, 0, 0, 0, 0, &M12, &M21, 0); + result += assertEquals(M12, -0.0052842753, 0.5e-10); + result += assertEquals(M21, -0.0052842753, 0.5e-10); + geod_geninverse(&g, 0, 0, 1e-6, 1e-6, 0, 0, 0, 0, &M12, &M21, 0); + result += assertEquals(M12, 1, 0.5e-10); + result += assertEquals(M21, 1, 0.5e-10); + a12 = geod_geninverse(&g, 20.001, 0, 20.001, 0, + &s12, &azi1, &azi2, &m12, &M12, &M21, &S12); + result += a12 == 0 ? 0 : 1; + result += s12 == 0 ? 0 : 1; + result += azi1 == 180 ? 0 : 1; + result += azi2 == 180 ? 0 : 1; + result += m12 == 0 ? 0 : 1; + result += assertEquals(M12, 1, 1e-15); + result += assertEquals(M21, 1, 1e-15); + result += S12 == 0 ? 0 : 1; + a12 = geod_geninverse(&g, 90, 0, 90, 180, + &s12, &azi1, &azi2, &m12, &M12, &M21, &S12); + result += a12 == 0 ? 0 : 1; + result += s12 == 0 ? 0 : 1; + result += azi1 == 0 ? 0 : 1; + result += azi2 == 180 ? 0 : 1; + result += m12 == 0 ? 0 : 1; + result += assertEquals(M12, 1, 1e-15); + result += assertEquals(M21, 1, 1e-15); + result += assertEquals(S12, 127516405431022, 0.5); + /* An incapable line which can't take distance as input */ + geod_lineinit(&l, &g, 1, 2, 90, GEOD_LATITUDE); + a12 = geod_genposition(&l, 0, 1000, 0, 0, 0, 0, 0, 0, 0, 0); + result += a12 != a12 ? 0 : 1; + return result; +} + static int Planimeter0() { /* Check fix for pole-encircling bug found 2011-03-16 */ double pa[4][2] = {{89, 0}, {89, 90}, {89, 180}, {89, 270}}; @@ -787,6 +829,188 @@ static int Planimeter13() { return result; } +static int Planimeter15() { + /* Coverage tests, includes Planimeter15 - Planimeter18 (combinations of + reverse and sign) + calls to testpoint, testedge, geod_polygonarea. */ + struct geod_geodesic g; + struct geod_polygon p; + double lat[] = {2, 1, 3}, lon[] = {1, 2, 3}; + double area, s12, azi1; + double r = 18454562325.45119, + a0 = 510065621724088.5093; /* ellipsoid area */ + int result = 0; + geod_init(&g, wgs84_a, wgs84_f); + geod_polygon_init(&p, 0); + geod_polygon_addpoint(&g, &p, lat[0], lon[0]); + geod_polygon_addpoint(&g, &p, lat[1], lon[1]); + geod_polygon_testpoint(&g, &p, lat[2], lon[2], 0, 1, &area, 0); + result += assertEquals(area, r, 0.5); + geod_polygon_testpoint(&g, &p, lat[2], lon[2], 0, 0, &area, 0); + result += assertEquals(area, r, 0.5); + geod_polygon_testpoint(&g, &p, lat[2], lon[2], 1, 1, &area, 0); + result += assertEquals(area, -r, 0.5); + geod_polygon_testpoint(&g, &p, lat[2], lon[2], 1, 0, &area, 0); + result += assertEquals(area, a0-r, 0.5); + geod_inverse(&g, lat[1], lon[1], lat[2], lon[2], &s12, &azi1, 0); + geod_polygon_testedge(&g, &p, azi1, s12, 0, 1, &area, 0); + result += assertEquals(area, r, 0.5); + geod_polygon_testedge(&g, &p, azi1, s12, 0, 0, &area, 0); + result += assertEquals(area, r, 0.5); + geod_polygon_testedge(&g, &p, azi1, s12, 1, 1, &area, 0); + result += assertEquals(area, -r, 0.5); + geod_polygon_testedge(&g, &p, azi1, s12, 1, 0, &area, 0); + result += assertEquals(area, a0-r, 0.5); + geod_polygon_addpoint(&g, &p, lat[2], lon[2]); + geod_polygon_compute(&g, &p, 0, 1, &area, 0); + result += assertEquals(area, r, 0.5); + geod_polygon_compute(&g, &p, 0, 0, &area, 0); + result += assertEquals(area, r, 0.5); + geod_polygon_compute(&g, &p, 1, 1, &area, 0); + result += assertEquals(area, -r, 0.5); + geod_polygon_compute(&g, &p, 1, 0, &area, 0); + result += assertEquals(area, a0-r, 0.5); + geod_polygonarea(&g, lat, lon, 3, &area, 0); + result += assertEquals(area, r, 0.5); + return result; +} + +static int Planimeter19() { + /* Coverage tests, includes Planimeter19 - Planimeter20 (degenerate + polygons) + extra cases. */ + struct geod_geodesic g; + struct geod_polygon p; + double area, perim; + int result = 0; + geod_init(&g, wgs84_a, wgs84_f); + geod_polygon_init(&p, 0); + geod_polygon_compute(&g, &p, 0, 1, &area, &perim); + result += area == 0 ? 0 : 1; + result += perim == 0 ? 0 : 1; + geod_polygon_testpoint(&g, &p, 1, 1, 0, 1, &area, &perim); + result += area == 0 ? 0 : 1; + result += perim == 0 ? 0 : 1; + geod_polygon_testedge(&g, &p, 90, 1000, 0, 1, &area, &perim); + result += area != area ? 0 : 1; + result += perim != perim ? 0 : 1; + geod_polygon_addpoint(&g, &p, 1, 1); + geod_polygon_compute(&g, &p, 0, 1, &area, &perim); + result += area == 0 ? 0 : 1; + result += perim == 0 ? 0 : 1; + geod_polygon_init(&p, 1); + geod_polygon_compute(&g, &p, 0, 1, 0, &perim); + result += perim == 0 ? 0 : 1; + geod_polygon_testpoint(&g, &p, 1, 1, 0, 1, 0, &perim); + result += perim == 0 ? 0 : 1; + geod_polygon_testedge(&g, &p, 90, 1000, 0, 1, 0, &perim); + result += perim != perim ? 0 : 1; + geod_polygon_addpoint(&g, &p, 1, 1); + geod_polygon_compute(&g, &p, 0, 1, 0, &perim); + result += perim == 0 ? 0 : 1; + return result; +} + +static int Planimeter21() { + /* Some test to add code coverage: multiple circlings of pole (includes + Planimeter21 - Planimeter28) + invocations via testpoint and testedge. + Some of the results for i = 4 in the loop are wrong because we don't + reduce the area to the allowed range correctly. However these cases are + not "simple" polygons, so we'll defer fixing the problem for now. + */ + struct geod_geodesic g; + struct geod_polygon p; + double area, lat = 45, + a = 39.2144607176828184218, s = 8420705.40957178156285, + r = 39433884866571.4277, /* Area for one circuit */ + a0 = 510065621724088.5093; /* Ellipsoid area */ + int result = 0, i; + geod_init(&g, wgs84_a, wgs84_f); + geod_polygon_init(&p, 0); + geod_polygon_addpoint(&g, &p, lat, 60); + geod_polygon_addpoint(&g, &p, lat, 180); + geod_polygon_addpoint(&g, &p, lat, -60); + geod_polygon_addpoint(&g, &p, lat, 60); + geod_polygon_addpoint(&g, &p, lat, 180); + geod_polygon_addpoint(&g, &p, lat, -60); + for (i = 3; i <= 4; ++i) { + geod_polygon_addpoint(&g, &p, lat, 60); + geod_polygon_addpoint(&g, &p, lat, 180); + geod_polygon_testpoint(&g, &p, lat, -60, 0, 1, &area, 0); + if (i != 4) result += assertEquals(area, i*r, 0.5); + geod_polygon_testpoint(&g, &p, lat, -60, 0, 0, &area, 0); + if (i != 4) result += assertEquals(area, i*r, 0.5); + geod_polygon_testpoint(&g, &p, lat, -60, 1, 1, &area, 0); + if (i != 4) result += assertEquals(area, -i*r, 0.5); + geod_polygon_testpoint(&g, &p, lat, -60, 1, 0, &area, 0); + result += assertEquals(area, -i*r + a0, 0.5); + geod_polygon_testedge(&g, &p, a, s, 0, 1, &area, 0); + if (i != 4) result += assertEquals(area, i*r, 0.5); + geod_polygon_testedge(&g, &p, a, s, 0, 0, &area, 0); + if (i != 4) result += assertEquals(area, i*r, 0.5); + geod_polygon_testedge(&g, &p, a, s, 1, 1, &area, 0); + if (i != 4) result += assertEquals(area, -i*r, 0.5); + geod_polygon_testedge(&g, &p, a, s, 1, 0, &area, 0); + result += assertEquals(area, -i*r + a0, 0.5); + geod_polygon_addpoint(&g, &p, lat, -60); + geod_polygon_compute(&g, &p, 0, 1, &area, 0); + if (i != 4) result += assertEquals(area, i*r, 0.5); + geod_polygon_compute(&g, &p, 0, 0, &area, 0); + if (i != 4) result += assertEquals(area, i*r, 0.5); + geod_polygon_compute(&g, &p, 1, 1, &area, 0); + if (i != 4) result += assertEquals(area, -i*r, 0.5); + geod_polygon_compute(&g, &p, 1, 0, &area, 0); + result += assertEquals(area, -i*r + a0, 0.5); + } + return result; +} + +static int AddEdge1() { + /* Check fix to transitdirect vs transit zero handling inconsistency */ + struct geod_geodesic g; + struct geod_polygon p; + double area; + int result = 0; + geod_init(&g, wgs84_a, wgs84_f); + geod_polygon_init(&p, 0); + geod_polygon_addpoint(&g, &p, 0, 0); + geod_polygon_addedge(&g, &p, 90, 1000); + geod_polygon_addedge(&g, &p, 0, 1000); + geod_polygon_addedge(&g, &p, -90, 1000); + geod_polygon_compute(&g, &p, 0, 1, &area, 0); + result += assertEquals(area, 1000000.0, 0.01); + return result; +} + +static int EmptyPoly() { + struct geod_geodesic g; + struct geod_polygon p; + double perim, area; + int result = 0; + geod_init(&g, wgs84_a, wgs84_f); + geod_polygon_init(&p, 0); + geod_polygon_testpoint(&g, &p, 1, 1, 0, 1, &area, &perim); + result += area == 0 ? 0 : 1; + result += perim == 0 ? 0 : 1; + geod_polygon_testedge(&g, &p, 90, 1000, 0, 1, &area, &perim); + result += area != area ? 0 : 1; + result += perim != perim ? 0 : 1; + geod_polygon_compute(&g, &p, 0, 1, &area, &perim); + result += area == 0 ? 0 : 1; + result += perim == 0 ? 0 : 1; + geod_polygon_init(&p, 1); + geod_polygon_testpoint(&g, &p, 1, 1, 0, 1, 0, &perim); + result += perim == 0 ? 0 : 1; + geod_polygon_testedge(&g, &p, 90, 1000, 0, 1, 0, &perim); + result += perim != perim ? 0 : 1; + geod_polygon_compute(&g, &p, 0, 1, 0, &perim); + result += perim == 0 ? 0 : 1; + geod_polygon_addpoint(&g, &p, 1, 1); + geod_polygon_testedge(&g, &p, 90, 1000, 0, 1, 0, &perim); + result += assertEquals(perim, 1000, 1e-10); + geod_polygon_testpoint(&g, &p, 2, 2, 0, 1, 0, &perim); + result += assertEquals(perim, 156876.149, 0.5e-3); + return result; +} + int main() { int n = 0, i; if ((i = testinverse())) {++n; printf("testinverse fail: %d\n", i);} @@ -818,11 +1042,17 @@ int main() { if ((i = GeodSolve74())) {++n; printf("GeodSolve74 fail: %d\n", i);} if ((i = GeodSolve76())) {++n; printf("GeodSolve76 fail: %d\n", i);} if ((i = GeodSolve78())) {++n; printf("GeodSolve78 fail: %d\n", i);} + if ((i = GeodSolve80())) {++n; printf("GeodSolve80 fail: %d\n", i);} if ((i = Planimeter0())) {++n; printf("Planimeter0 fail: %d\n", i);} if ((i = Planimeter5())) {++n; printf("Planimeter5 fail: %d\n", i);} if ((i = Planimeter6())) {++n; printf("Planimeter6 fail: %d\n", i);} if ((i = Planimeter12())) {++n; printf("Planimeter12 fail: %d\n", i);} if ((i = Planimeter13())) {++n; printf("Planimeter13 fail: %d\n", i);} + if ((i = Planimeter15())) {++n; printf("Planimeter15 fail: %d\n", i);} + if ((i = Planimeter19())) {++n; printf("Planimeter19 fail: %d\n", i);} + if ((i = Planimeter21())) {++n; printf("Planimeter21 fail: %d\n", i);} + if ((i = AddEdge1())) {++n; printf("AddEdge1 fail: %d\n", i);} + if ((i = EmptyPoly())) {++n; printf("EmptyPoly fail: %d\n", i);} return n; } diff --git a/src/gie.c b/src/gie.c index 577ad7c..d9323ba 100644 --- a/src/gie.c +++ b/src/gie.c @@ -146,7 +146,7 @@ static ffio *ffio_create (const char **tags, size_t n_tags, size_t max_record_si static const char *gie_tags[] = { "<gie>", "operation", "accept", "expect", "roundtrip", "banner", "verbose", - "direction", "tolerance", "ignore", "builtins", "echo", "</gie>" + "direction", "tolerance", "ignore", "builtins", "echo", "skip", "</gie>" }; static const size_t n_gie_tags = sizeof gie_tags / sizeof gie_tags[0]; @@ -177,6 +177,7 @@ typedef struct { PJ_COORD a, b, c, e; PJ_DIRECTION dir; int verbosity; + int skip; int op_id; int op_ok, op_ko, op_skip; int total_ok, total_ko, total_skip; @@ -192,6 +193,8 @@ typedef struct { ffio *F = 0; static gie_ctx T; +int tests=0, succs=0, succ_fails=0, fail_fails=0, succ_rtps=0, fail_rtps=0; +int succ_builtins=0, fail_builtins=0; static const char delim[] = {"-------------------------------------------------------------------------------\n"}; @@ -299,6 +302,13 @@ int main (int argc, char **argv) { fprintf (T.fout, "%sGrand total: %d. Success: %d, Skipped: %d, Failure: %d\n", delim, T.grand_ok+T.grand_ko+T.grand_skip, T.grand_ok, T.grand_skip, T.grand_ko); fprintf (T.fout, "%s", delim); + if (T.verbosity > 1) { + fprintf (T.fout, "Failing roundtrips: %4d, Succeeding roundtrips: %4d\n", fail_rtps, succ_rtps); + fprintf (T.fout, "Failing failures: %4d, Succeeding failures: %4d\n", fail_fails, succ_fails); + fprintf (T.fout, "Failing builtins: %4d, Succeeding builtins: %4d\n", fail_builtins, succ_builtins); + fprintf (T.fout, "Internal counters: %4.4d(%4.4d)\n", tests, succs); + fprintf (T.fout, "%s", delim); + } } else if (T.grand_ko) @@ -315,21 +325,54 @@ int main (int argc, char **argv) { static int another_failure (void) { T.op_ko++; T.total_ko++; + proj_errno_reset (T.P); return 0; } static int another_skip (void) { T.op_skip++; T.total_skip++; + proj_errno_reset (T.P); return 0; } static int another_success (void) { T.op_ok++; T.total_ok++; + proj_errno_reset (T.P); return 0; } +static int another_succeeding_failure (void) { + succ_fails++; + return another_success (); +} + +static int another_failing_failure (void) { + fail_fails++; + return another_failure (); +} + +static int another_succeeding_roundtrip (void) { + succ_rtps++; + return another_success (); +} + +static int another_failing_roundtrip (void) { + fail_rtps++; + return another_failure (); +} + +static int another_succeeding_builtin (void) { + succ_builtins++; + return another_success (); +} + +static int another_failing_builtin (void) { + fail_builtins++; + return another_failure (); +} + static int process_file (const char *fname) { FILE *f; @@ -339,6 +382,9 @@ static int process_file (const char *fname) { T.op_ko = T.total_ko = 0; T.op_skip = T.total_skip = 0; + if (T.skip) + return proj_destroy (T.P), T.P = 0, 0; + f = fopen (fname, "rt"); if (0==f) { if (T.verbosity > 0) { @@ -556,27 +602,27 @@ using the "builtins" command verb. i = pj_unitconvert_selftest (); if (i!=0) { fprintf (T.fout, "pj_unitconvert_selftest fails with %d\n", i); - another_failure(); + another_failing_builtin(); } else - another_success (); + another_succeeding_builtin (); i = pj_cart_selftest (); if (i!=0) { fprintf (T.fout, "pj_cart_selftest fails with %d\n", i); - another_failure(); + another_failing_builtin(); } else - another_success (); + another_succeeding_builtin (); i = pj_horner_selftest (); if (i!=0) { fprintf (T.fout, "pj_horner_selftest fails with %d\n", i); - another_failure(); + another_failing_builtin(); } else - another_success (); + another_succeeding_builtin (); return 0; } @@ -674,7 +720,7 @@ back/forward transformation pairs. r = proj_roundtrip (T.P, T.dir, ntrips, &coo); if (r <= d) - return another_success (); + return another_succeeding_roundtrip (); if (T.verbosity > -1) { if (0==T.op_ko && T.verbosity < 2) @@ -683,7 +729,7 @@ back/forward transformation pairs. fprintf (T.fout, " FAILURE in %s(%d):\n", opt_strip_path (T.curr_file), (int) F->lineno); fprintf (T.fout, " roundtrip deviation: %.6f mm, expected: %.6f mm\n", 1000*r, 1000*d); } - return another_failure (); + return another_failing_roundtrip (); } @@ -723,7 +769,7 @@ static int expect_message_cannot_parse (const char *args) { } static int expect_failure_with_errno_message (int expected, int got) { - another_failure (); + another_failing_failure (); if (T.verbosity < 0) return 1; @@ -779,14 +825,16 @@ Tell GIE what to expect, when transforming the ACCEPTed input if (expect_failure_with_errno && proj_errno (T.P)!=expect_failure_with_errno) return expect_failure_with_errno_message (expect_failure_with_errno, proj_errno(T.P)); - return another_success (); + return another_succeeding_failure (); } /* Otherwise, it's a true failure */ banner (T.operation); - errmsg(3, "%sInvalid operation definition in line no. %d: %s\n", - delim, (int) T.operation_lineno, pj_strerrno(proj_errno(T.P))); - return another_failure (); + errmsg (3, "%sInvalid operation definition in line no. %d:\n %s (errno=%s/%d)\n", + delim, (int) T.operation_lineno, pj_strerrno(proj_errno(T.P)), + err_const_from_errno (proj_errno(T.P)), proj_errno(T.P) + ); + return another_failing_failure (); } /* We may still successfully fail even if the proj_create succeeded */ @@ -797,20 +845,24 @@ Tell GIE what to expect, when transforming the ACCEPTed input ci = proj_angular_input (T.P, T.dir)? torad_coord (T.P, T.dir, T.a): T.a; co = expect_trans_n_dim (ci); - /* Failed to fail? - that's a failure */ - if (co.xyz.x!=HUGE_VAL) - return another_failure (); - if (expect_failure_with_errno) { - printf ("errno=%d, expected=%d\n", proj_errno (T.P), expect_failure_with_errno); if (proj_errno (T.P)==expect_failure_with_errno) - return another_success (); - - return another_failure (); + return another_succeeding_failure (); + printf ("errno=%d, expected=%d\n", proj_errno (T.P), expect_failure_with_errno); + return another_failing_failure (); } - /* Yes, we failed successfully */ - return another_success (); + + /* Succeeded in failing? - that's a success */ + if (co.xyz.x==HUGE_VAL) + return another_succeeding_failure (); + + /* Failed to fail? - that's a failure */ + banner (T.operation); + errmsg (3, "%sFailed to fail. Operation definition in line no. %d\n", + delim, (int) T.operation_lineno + ); + return another_failing_failure (); } @@ -822,10 +874,12 @@ Tell GIE what to expect, when transforming the ACCEPTed input printf ("left: %d right: %d\n", T.P->left, T.P->right); } + tests++; T.e = parse_coord (args); if (HUGE_VAL==T.e.v[0]) return expect_message_cannot_parse (args); + /* expected angular values, probably in degrees */ ce = proj_angular_output (T.P, T.dir)? torad_coord (T.P, T.dir, T.e): T.e; if (T.verbosity > 3) @@ -836,8 +890,14 @@ Tell GIE what to expect, when transforming the ACCEPTed input if (T.verbosity > 3) printf ("ACCEPTS %.12f %.12f %.12f %.12f\n", ci.v[0],ci.v[1],ci.v[2],ci.v[3]); - /* angular output from proj_trans comes in radians */ + /* do the transformation, but mask off dimensions not given in expect-ation */ co = expect_trans_n_dim (ci); + if (T.dimensions_given < 4) + co.v[3] = 0; + if (T.dimensions_given < 3) + co.v[2] = 0; + + /* angular output from proj_trans comes in radians */ T.b = proj_angular_output (T.P, T.dir)? todeg_coord (T.P, T.dir, co): co; if (T.verbosity > 3) printf ("GOT %.12f %.12f %.12f %.12f\n", co.v[0],co.v[1],co.v[2],co.v[3]); @@ -856,6 +916,7 @@ Tell GIE what to expect, when transforming the ACCEPTed input if (d > T.tolerance) return expect_message (d, args); + succs++; another_success (); return 0; @@ -893,7 +954,20 @@ fprintf (T.fout, "%s\n", args); +/*****************************************************************************/ +static int skip (const char *args) { +/***************************************************************************** +Indicate that the remaining material should be skipped. Mostly for debugging. +******************************************************************************/ + T.skip = 1; + (void) args; + return 0; +} + + static int dispatch (const char *cmnd, const char *args) { + if (T.skip) + return SKIP; if (0==strcmp (cmnd, "operation")) return operation ((char *) args); if (0==strcmp (cmnd, "accept")) return accept (args); if (0==strcmp (cmnd, "expect")) return expect (args); @@ -902,9 +976,10 @@ static int dispatch (const char *cmnd, const char *args) { if (0==strcmp (cmnd, "verbose")) return verbose (args); if (0==strcmp (cmnd, "direction")) return direction (args); if (0==strcmp (cmnd, "tolerance")) return tolerance (args); - if (0==strcmp (cmnd, "ignore")) return ignore (args); + if (0==strcmp (cmnd, "ignore")) return ignore (args); if (0==strcmp (cmnd, "builtins")) return builtins (args); if (0==strcmp (cmnd, "echo")) return echo (args); + if (0==strcmp (cmnd, "skip")) return skip (args); return 0; } @@ -1223,6 +1298,8 @@ static int nextline (ffio *G) { Read next line of input file. Returns 1 on success, 0 on failure. ****************************************************************************************/ G->next_args[0] = 0; + if (T.skip) + return 0; if (0==fgets (G->next_args, (int) G->next_args_size - 1, G->f)) return 0; if (feof (G->f)) @@ -1570,7 +1647,7 @@ static int pj_cart_selftest (void) { /* Forward projection: Ellipsoidal-to-3D-Cartesian */ dist = proj_roundtrip (P, PJ_FWD, 1, &a); - if (dist > 1e-12) + if (dist > 1e-9) return 8; /* Test at the South Pole */ @@ -1582,7 +1659,7 @@ static int pj_cart_selftest (void) { /* Forward projection: Ellipsoidal-to-3D-Cartesian */ dist = proj_roundtrip (P, PJ_FWD, 1, &a); - if (dist > 1e-12) + if (dist > 1e-9) return 9; diff --git a/src/pj_mlfn.c b/src/pj_mlfn.c index e00f2bf..84282d2 100644 --- a/src/pj_mlfn.c +++ b/src/pj_mlfn.c @@ -1,5 +1,5 @@ #include <projects.h> -/* meridinal distance for ellipsoid and inverse +/* meridional distance for ellipsoid and inverse ** 8th degree - accurate to < 1e-5 meters when used in conjunction ** with typical major axis values. ** Inverse determines phi to EPS (1e-11) radians, about 1e-6 seconds. diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 7475f71..4310523 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -8,6 +8,7 @@ proj_add_gie_test("Deformation" "gie/deformation.gie") proj_add_gie_test("Ellipsoid" "gie/ellipsoid.gie") proj_add_gie_test("GDA" "gie/GDA.gie") proj_add_gie_test("4D-API-cs2cs-style" "gie/4D-API_cs2cs-style.gie") +proj_add_gie_test("DHDN_ETRS89" "gie/DHDN_ETRS89.gie") # GIGS tests. Uncommented tests are expected to fail due to issues with # various projections. Should be investigated further and fixed. diff --git a/test/gie/DHDN_ETRS89.gie b/test/gie/DHDN_ETRS89.gie new file mode 100644 index 0000000..f536821 --- /dev/null +++ b/test/gie/DHDN_ETRS89.gie @@ -0,0 +1,373 @@ +<gie> + +------------------------------------------------------------------------------- +operation proj=latlong datum=potsdam ellps=bessel +------------------------------------------------------------------------------- +DE_DHDN (BeTA, 2007) to ETRS89 using NTv2 grid. epsg:15948 +------------------------------------------------------------------------------- + +tolerance 1 mm +accept 7.482506019176 53.498461143331 # ETRS89_Lat-Lon +expect 7.483333333333 53.500000000000 # DE_DHDN_Lat-Lon + +direction inverse + +accept 7.483333333333 53.500000000000 # DE_DHDN_Lat-Lon +expect 7.482506019176 53.498461143331 # ETRS89_Lat-Lon +accept 10.333333333333 48.833333333333 # DE_DHDN_Lat-Lon +expect 10.332117283303 48.832327188640 # ETRS89_Lat-Lon +accept 8.000000000000 50.083333333333 # DE_DHDN_Lat-Lon +expect 7.999097344043 50.082172046476 # ETRS89_Lat-Lon +accept 10.016666666667 51.033333333333 # DE_DHDN_Lat-Lon +expect 10.015460839103 51.032075951188 # ETRS89_Lat-Lon +accept 10.466666666667 54.333333333333 # DE_DHDN_Lat-Lon +expect 10.465373788153 54.331696254077 # ETRS89_Lat-Lon +accept 10.750000000000 53.583333333333 # DE_DHDN_Lat-Lon +expect 10.748659705929 53.581781243436 # ETRS89_Lat-Lon +accept 10.016666666667 53.500000000000 # DE_DHDN_Lat-Lon +expect 10.015444367463 53.498457503620 # ETRS89_Lat-Lon +accept 11.000000000000 53.466666666667 # DE_DHDN_Lat-Lon +expect 10.998619309575 53.465127257963 # ETRS89_Lat-Lon +accept 13.466666666667 53.766666666667 # DE_DHDN_Lat-Lon +expect 13.464877774631 53.765109112396 # ETRS89_Lat-Lon +accept 10.983333333333 52.766666666667 # DE_DHDN_Lat-Lon +expect 10.981965431979 52.765211787713 # ETRS89_Lat-Lon +accept 13.000000000000 51.783333333333 # DE_DHDN_Lat-Lon +expect 12.998336654827 51.782006921265 # ETRS89_Lat-Lon +accept 10.466666666667 52.500000000000 # DE_DHDN_Lat-Lon +expect 10.465380298337 52.498573633365 # ETRS89_Lat-Lon +accept 10.550000000000 51.466666666667 # DE_DHDN_Lat-Lon +expect 10.548711467380 51.465361979987 # ETRS89_Lat-Lon +accept 10.450000000000 50.583333333333 # DE_DHDN_Lat-Lon +expect 10.448735275612 50.582129474187 # ETRS89_Lat-Lon +accept 10.416666666667 49.666666666667 # DE_DHDN_Lat-Lon +expect 10.415423634267 49.665566047661 # ETRS89_Lat-Lon +accept 10.550000000000 47.750000000000 # DE_DHDN_Lat-Lon +expect 10.548775945187 47.749120260296 # ETRS89_Lat-Lon +accept 13.450000000000 50.666666666667 # DE_DHDN_Lat-Lon +expect 13.448283429558 50.665476385913 # ETRS89_Lat-Lon +accept 13.550000000000 51.333333333333 # DE_DHDN_Lat-Lon +expect 13.548264242652 51.332063317958 # ETRS89_Lat-Lon +accept 13.566666666667 52.050000000000 # DE_DHDN_Lat-Lon +expect 13.564906713066 52.048646469731 # ETRS89_Lat-Lon +accept 13.433333333333 53.166666666667 # DE_DHDN_Lat-Lon +expect 13.431569610583 53.165185284138 # ETRS89_Lat-Lon +accept 13.466666666667 52.483333333333 # DE_DHDN_Lat-Lon +expect 13.464913254978 52.481930297429 # ETRS89_Lat-Lon +accept 13.133333333333 49.066666666667 # DE_DHDN_Lat-Lon +expect 13.131706947050 49.065661709281 # ETRS89_Lat-Lon +accept 8.666666666667 53.116666666667 # DE_DHDN_Lat-Lon +expect 8.665654272188 53.115169791635 # ETRS89_Lat-Lon +accept 12.950000000000 47.650000000000 # DE_DHDN_Lat-Lon +expect 12.948437185277 47.649155713893 # ETRS89_Lat-Lon +accept 8.500000000000 54.716666666667 # DE_DHDN_Lat-Lon +expect 8.499027339833 54.714992333813 # ETRS89_Lat-Lon +accept 7.483333333333 51.983333333333 # DE_DHDN_Lat-Lon +expect 7.482494584516 51.981965147975 # ETRS89_Lat-Lon +accept 7.516666666667 51.016666666667 # DE_DHDN_Lat-Lon +expect 7.515823996992 51.015402184493 # ETRS89_Lat-Lon +accept 7.466666666667 50.500000000000 # DE_DHDN_Lat-Lon +expect 7.465834308888 50.498791390585 # ETRS89_Lat-Lon +accept 7.533333333333 49.333333333333 # DE_DHDN_Lat-Lon +expect 7.532503616986 49.332250779407 # ETRS89_Lat-Lon +accept 7.250000000000 49.333333333333 # DE_DHDN_Lat-Lon +expect 7.249209260581 49.332249456364 # ETRS89_Lat-Lon +accept 7.533333333333 47.666666666667 # DE_DHDN_Lat-Lon +expect 7.532530252396 47.665765608135 # ETRS89_Lat-Lon +------------------------------------------------------------------------------- + + + +------------------------------------------------------------------------------- +operation proj=latlong + towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7 ellps=bessel +------------------------------------------------------------------------------- +DE_DHDN to ETRS89 using deprecated 7 parameter Helmert transform. The results +agree at the 3 m level. +------------------------------------------------------------------------------- +tolerance 3 m + +accept 7.482506019176 53.498461143331 # ETRS89_Lat-Lon +expect 7.483333333333 53.500000000000 # DE_DHDN_Lat-Lon + +direction inverse + +accept 7.483333333333 53.500000000000 # DE_DHDN_Lat-Lon +expect 7.482506019176 53.498461143331 # ETRS89_Lat-Lon + +accept 10.333333333333 48.833333333333 # DE_DHDN_Lat-Lon +expect 10.332117283303 48.832327188640 # ETRS89_Lat-Lon +accept 8.000000000000 50.083333333333 # DE_DHDN_Lat-Lon +expect 7.999097344043 50.082172046476 # ETRS89_Lat-Lon +accept 10.016666666667 51.033333333333 # DE_DHDN_Lat-Lon +expect 10.015460839103 51.032075951188 # ETRS89_Lat-Lon +accept 10.466666666667 54.333333333333 # DE_DHDN_Lat-Lon +expect 10.465373788153 54.331696254077 # ETRS89_Lat-Lon +accept 10.750000000000 53.583333333333 # DE_DHDN_Lat-Lon +expect 10.748659705929 53.581781243436 # ETRS89_Lat-Lon +accept 10.016666666667 53.500000000000 # DE_DHDN_Lat-Lon +expect 10.015444367463 53.498457503620 # ETRS89_Lat-Lon +accept 11.000000000000 53.466666666667 # DE_DHDN_Lat-Lon +expect 10.998619309575 53.465127257963 # ETRS89_Lat-Lon +accept 13.466666666667 53.766666666667 # DE_DHDN_Lat-Lon +expect 13.464877774631 53.765109112396 # ETRS89_Lat-Lon +accept 10.983333333333 52.766666666667 # DE_DHDN_Lat-Lon +expect 10.981965431979 52.765211787713 # ETRS89_Lat-Lon +accept 13.000000000000 51.783333333333 # DE_DHDN_Lat-Lon +expect 12.998336654827 51.782006921265 # ETRS89_Lat-Lon +accept 10.466666666667 52.500000000000 # DE_DHDN_Lat-Lon +expect 10.465380298337 52.498573633365 # ETRS89_Lat-Lon +accept 10.550000000000 51.466666666667 # DE_DHDN_Lat-Lon +expect 10.548711467380 51.465361979987 # ETRS89_Lat-Lon +accept 10.450000000000 50.583333333333 # DE_DHDN_Lat-Lon +expect 10.448735275612 50.582129474187 # ETRS89_Lat-Lon +accept 10.416666666667 49.666666666667 # DE_DHDN_Lat-Lon +expect 10.415423634267 49.665566047661 # ETRS89_Lat-Lon +accept 10.550000000000 47.750000000000 # DE_DHDN_Lat-Lon +expect 10.548775945187 47.749120260296 # ETRS89_Lat-Lon +accept 13.450000000000 50.666666666667 # DE_DHDN_Lat-Lon +expect 13.448283429558 50.665476385913 # ETRS89_Lat-Lon +accept 13.550000000000 51.333333333333 # DE_DHDN_Lat-Lon +expect 13.548264242652 51.332063317958 # ETRS89_Lat-Lon +accept 13.566666666667 52.050000000000 # DE_DHDN_Lat-Lon +expect 13.564906713066 52.048646469731 # ETRS89_Lat-Lon +accept 13.433333333333 53.166666666667 # DE_DHDN_Lat-Lon +expect 13.431569610583 53.165185284138 # ETRS89_Lat-Lon +accept 13.466666666667 52.483333333333 # DE_DHDN_Lat-Lon +expect 13.464913254978 52.481930297429 # ETRS89_Lat-Lon +accept 13.133333333333 49.066666666667 # DE_DHDN_Lat-Lon +expect 13.131706947050 49.065661709281 # ETRS89_Lat-Lon +accept 8.666666666667 53.116666666667 # DE_DHDN_Lat-Lon +expect 8.665654272188 53.115169791635 # ETRS89_Lat-Lon +accept 12.950000000000 47.650000000000 # DE_DHDN_Lat-Lon +expect 12.948437185277 47.649155713893 # ETRS89_Lat-Lon +accept 8.500000000000 54.716666666667 # DE_DHDN_Lat-Lon +expect 8.499027339833 54.714992333813 # ETRS89_Lat-Lon +accept 7.483333333333 51.983333333333 # DE_DHDN_Lat-Lon +expect 7.482494584516 51.981965147975 # ETRS89_Lat-Lon +accept 7.516666666667 51.016666666667 # DE_DHDN_Lat-Lon +expect 7.515823996992 51.015402184493 # ETRS89_Lat-Lon +accept 7.466666666667 50.500000000000 # DE_DHDN_Lat-Lon +expect 7.465834308888 50.498791390585 # ETRS89_Lat-Lon +accept 7.533333333333 49.333333333333 # DE_DHDN_Lat-Lon +expect 7.532503616986 49.332250779407 # ETRS89_Lat-Lon +accept 7.250000000000 49.333333333333 # DE_DHDN_Lat-Lon +expect 7.249209260581 49.332249456364 # ETRS89_Lat-Lon +accept 7.533333333333 47.666666666667 # DE_DHDN_Lat-Lon +expect 7.532530252396 47.665765608135 # ETRS89_Lat-Lon +------------------------------------------------------------------------------- +</gie> + + + + + + + + + + +------------------------------------------------------------------------------- +The numerical material in this file is based on the contents of the +BKG test data file over at http://crs.bkg.bund.de/crseu/crs/descrtrans/BeTA/BETA2007testdaten.csv + +The conversion was carried out as follows: + +set insertkey=gawk 'BEGIN {FS=","}; {print $3","$0} +set reformat=gawk 'BEGIN {FS=","}; {print "accept " $6 " " $5 " # " $4 "\nexpect " $9 " " $8 " # " $7}' +cat BETA2007testdaten.csv | %insertkey% | sort | %reformat% >DHDN_ETRS89.gie +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +Tests for GK system zones to UTM32/33 not implemented yet +------------------------------------------------------------------------------- +accept 2598417.333192 5930677.980308 # DE_DHDN_3GK2 +expect 399340.601863 5928794.177992 # ETRS89_UTM32 +accept 2643120.946052 5551463.861308 # DE_DHDN_3GK2 +expect 428391.209209 5548246.766868 # ETRS89_UTM32 +accept 2678509.791823 5890320.494547 # DE_DHDN_3GK2 +expect 477621.722498 5885134.566909 # ETRS89_UTM32 +accept 2661073.960381 6067930.993896 # DE_DHDN_3GK2 +expect 467726.896146 6063191.974102 # ETRS89_UTM32 +accept 2601895.024514 5761935.671777 # DE_DHDN_3GK2 +expect 395783.496871 5760119.715259 # ETRS89_UTM32 +accept 2606412.760026 5654454.411797 # DE_DHDN_3GK2 +expect 395892.865206 5652585.895428 # ETRS89_UTM32 +accept 2604044.332230 5596917.811668 # DE_DHDN_3GK2 +expect 391195.030128 5595215.127880 # ETRS89_UTM32 +accept 2611430.565041 5467270.623504 # DE_DHDN_3GK2 +expect 393381.121595 5465427.351346 # ETRS89_UTM32 +accept 2590840.678885 5466891.206854 # DE_DHDN_3GK2 +expect 372799.647928 5465865.755414 # ETRS89_UTM32 +accept 2615145.447136 5281966.148083 # DE_DHDN_3GK2 +expect 389829.267589 5280195.601333 # ETRS89_UTM32 +accept 3399371.190396 5930724.531323 # DE_DHDN_3GK3 +expect 399340.601862 5928794.177992 # ETRS89_UTM32 +accept 3597874.421966 5411397.512092 # DE_DHDN_3GK3 +expect 597759.898637 5409672.239612 # ETRS89_UTM32 +accept 3428437.612810 5550026.645035 # DE_DHDN_3GK3 +expect 428391.209209 5548246.766869 # ETRS89_UTM32 +accept 3571307.006323 5655705.338031 # DE_DHDN_3GK3 +expect 571204.563344 5653882.476948 # ETRS89_UTM32 +accept 3595392.782000 6023387.959898 # DE_DHDN_3GK3 +expect 595286.044398 6021417.376973 # ETRS89_UTM32 +accept 3615881.001454 5940351.727710 # DE_DHDN_3GK3 +expect 615764.364007 5938413.819150 # ETRS89_UTM32 +accept 3615881.001454 5940351.727710 # DE_DHDN_3GK3 +expect 218617.111391 5945399.220269 # ETRS89_UTM33 +accept 3567455.742115 5930134.904864 # DE_DHDN_3GK3 +expect 567358.390548 5928201.976543 # ETRS89_UTM32 +accept 3632798.076882 5927807.051283 # DE_DHDN_3GK3 +expect 632674.379672 5925873.747901 # ETRS89_UTM32 +accept 3632798.076882 5927807.051283 # DE_DHDN_3GK3 +expect 234423.486615 5931470.592457 # ETRS89_UTM33 +accept 3633848.721200 5849896.198513 # DE_DHDN_3GK3 +expect 633723.734075 5847994.536970 # ETRS89_UTM32 +accept 3633848.721200 5849896.198513 # DE_DHDN_3GK3 +expect 228947.171966 5853725.067987 # ETRS89_UTM33 +accept 3599586.686397 5819391.659845 # DE_DHDN_3GK3 +expect 599474.934168 5817502.626999 # ETRS89_UTM32 +accept 3607695.214682 5704557.217497 # DE_DHDN_3GK3 +expect 607578.857121 5702714.405562 # ETRS89_UTM32 +accept 3607695.214682 5704557.217497 # DE_DHDN_3GK3 +expect 190859.292094 5710978.842070 # ETRS89_UTM33 +accept 3602680.921862 5606162.921133 # DE_DHDN_3GK3 +expect 602565.455313 5604359.618990 # ETRS89_UTM32 +accept 3602680.921862 5606162.921133 # DE_DHDN_3GK3 +expect 177845.139712 5613251.897383 # ETRS89_UTM33 +accept 3602255.364740 5504172.212483 # DE_DHDN_3GK3 +expect 602139.527314 5502409.680191 # ETRS89_UTM32 +accept 3602255.364740 5504172.212483 # DE_DHDN_3GK3 +expect 169220.450101 5511545.700292 # ETRS89_UTM33 +accept 3616211.566778 5291255.078896 # DE_DHDN_3GK3 +expect 616089.408439 5289578.131826 # ETRS89_UTM32 +accept 3616211.566778 5291255.078896 # DE_DHDN_3GK3 +expect 166384.067958 5298018.237122 # ETRS89_UTM33 +accept 3477684.063162 5887048.676718 # DE_DHDN_3GK3 +expect 477621.722499 5885134.566914 # ETRS89_UTM32 +accept 3467781.947036 6065176.417740 # DE_DHDN_3GK3 +expect 467726.896147 6063191.974105 # ETRS89_UTM32 +accept 3395815.326925 5761982.907482 # DE_DHDN_3GK3 +expect 395783.496872 5760119.715259 # ETRS89_UTM32 +accept 3395925.872234 5654406.808724 # DE_DHDN_3GK3 +expect 395892.865206 5652585.895428 # ETRS89_UTM32 +accept 3391226.589718 5597013.366086 # DE_DHDN_3GK3 +expect 391195.030128 5595215.127881 # ETRS89_UTM32 +accept 3393414.080125 5467174.397245 # DE_DHDN_3GK3 +expect 393381.121595 5465427.351346 # ETRS89_UTM32 +accept 3372824.499428 5467612.907301 # DE_DHDN_3GK3 +expect 372799.647928 5465865.755413 # ETRS89_UTM32 +accept 3389860.774004 5281869.239226 # DE_DHDN_3GK3 +expect 389829.267590 5280195.601333 # ETRS89_UTM32 +accept 4377657.794741 5411879.839992 # DE_DHDN_3GK4 +expect 597759.898636 5409672.239612 # ETRS89_UTM32 +accept 4360897.154310 5657085.679344 # DE_DHDN_3GK4 +expect 571204.563343 5653882.476947 # ETRS89_UTM32 +accept 4400271.505998 6023480.198072 # DE_DHDN_3GK4 +expect 595286.044399 6021417.376972 # ETRS89_UTM32 +accept 4417225.999425 5939654.081375 # DE_DHDN_3GK4 +expect 615764.364007 5938413.819151 # ETRS89_UTM32 +accept 4417225.999425 5939654.081375 # DE_DHDN_3GK4 +expect 218617.111391 5945399.220269 # ETRS89_UTM33 +accept 4368411.664264 5931484.902370 # DE_DHDN_3GK4 +expect 567358.390548 5928201.976543 # ETRS89_UTM32 +accept 4433598.021986 5926410.006980 # DE_DHDN_3GK4 +expect 632674.379671 5925873.747901 # ETRS89_UTM32 +accept 4433598.021986 5926410.006980 # DE_DHDN_3GK4 +expect 234423.486614 5931470.592457 # ETRS89_UTM33 +accept 4596699.814954 5960328.296681 # DE_DHDN_3GK4 +expect 794226.051532 5966642.993890 # ETRS89_UTM32 +accept 4596699.814954 5960328.296681 # DE_DHDN_3GK4 +expect 398811.452821 5958481.617326 # ETRS89_UTM33 +accept 4431385.771953 5848536.122437 # DE_DHDN_3GK4 +expect 633723.734074 5847994.536971 # ETRS89_UTM32 +accept 4431385.771953 5848536.122437 # DE_DHDN_3GK4 +expect 228947.171966 5853725.067987 # ETRS89_UTM33 +accept 4568999.833703 5739119.060681 # DE_DHDN_3GK4 +expect 775766.817929 5744357.999264 # ETRS89_UTM32 +accept 4568999.833703 5739119.060681 # DE_DHDN_3GK4 +expect 361924.813552 5738688.111797 # ETRS89_UTM33 +accept 4395886.918912 5819485.694352 # DE_DHDN_3GK4 +expect 599474.934169 5817502.626999 # ETRS89_UTM32 +accept 4399252.521454 5704414.901133 # DE_DHDN_3GK4 +expect 607578.857121 5702714.405563 # ETRS89_UTM32 +accept 4399252.521454 5704414.901133 # DE_DHDN_3GK4 +expect 190859.292094 5710978.842070 # ETRS89_UTM33 +accept 4390237.957560 5606306.171667 # DE_DHDN_3GK4 +expect 602565.455313 5604359.618990 # ETRS89_UTM32 +accept 4390237.957560 5606306.171667 # DE_DHDN_3GK4 +expect 177845.139712 5613251.897384 # ETRS89_UTM33 +accept 4385715.060070 5504412.338975 # DE_DHDN_3GK4 +expect 602139.527314 5502409.680191 # ETRS89_UTM32 +accept 4385715.060070 5504412.338975 # DE_DHDN_3GK4 +expect 169220.450101 5511545.700292 # ETRS89_UTM33 +accept 4391285.796869 5291109.755123 # DE_DHDN_3GK4 +expect 616089.408439 5289578.131827 # ETRS89_UTM32 +accept 4391285.796869 5291109.755123 # DE_DHDN_3GK4 +expect 166384.067958 5298018.237122 # ETRS89_UTM33 +accept 4602499.566145 5615431.379860 # DE_DHDN_3GK4 +expect 814311.364242 5622071.326313 # ETRS89_UTM32 +accept 4602499.566145 5615431.379860 # DE_DHDN_3GK4 +expect 390338.211462 5613774.353256 # ETRS89_UTM33 +accept 4608008.855658 5689725.987089 # DE_DHDN_3GK4 +expect 816793.461724 5696579.298817 # ETRS89_UTM32 +accept 4608008.855658 5689725.987089 # DE_DHDN_3GK4 +expect 398863.493307 5687753.129020 # ETRS89_UTM33 +accept 4607459.254388 5769472.054323 # DE_DHDN_3GK4 +expect 812962.846098 5776288.882564 # ETRS89_UTM32 +accept 4607459.254388 5769472.054323 # DE_DHDN_3GK4 +expect 401589.388273 5767420.751372 # ETRS89_UTM33 +accept 4595844.509596 5893520.178529 # DE_DHDN_3GK4 +expect 796184.889876 5899821.806119 # ETRS89_UTM32 +accept 4595844.509596 5893520.178529 # DE_DHDN_3GK4 +expect 395147.893839 5891795.036022 # ETRS89_UTM33 +accept 4599624.347102 5817537.418158 # DE_DHDN_3GK4 +expect 803137.012417 5824018.671556 # ETRS89_UTM32 +accept 4599624.347102 5817537.418158 # DE_DHDN_3GK4 +expect 395754.092849 5815749.835902 # ETRS89_UTM33 +accept 4582806.457775 5437104.667215 # DE_DHDN_3GK4 +expect 801769.133341 5442981.626260 # ETRS89_UTM32 +accept 4582806.457775 5437104.667215 # DE_DHDN_3GK4 +expect 363531.446507 5436436.282581 # ETRS89_UTM33 +accept 4571363.304563 5279411.440581 # DE_DHDN_3GK4 +expect 796505.582915 5284862.664428 # ETRS89_UTM32 +accept 4571363.304563 5279411.440581 # DE_DHDN_3GK4 +expect 345930.907036 5279345.459526 # ETRS89_UTM33 +accept 5398905.047545 5960421.130827 # DE_DHDN_3GK5 +expect 794226.051532 5966642.993889 # ETRS89_UTM32 +accept 5398905.047545 5960421.130827 # DE_DHDN_3GK5 +expect 398811.452821 5958481.617326 # ETRS89_UTM33 +accept 5362005.247500 5740538.568445 # DE_DHDN_3GK5 +expect 775766.817929 5744357.999262 # ETRS89_UTM32 +accept 5362005.247500 5740538.568445 # DE_DHDN_3GK5 +expect 361924.813551 5738688.111796 # ETRS89_UTM33 +accept 5390431.824773 5615574.548074 # DE_DHDN_3GK5 +expect 814311.364241 5622071.326313 # ETRS89_UTM32 +accept 5390431.824773 5615574.548074 # DE_DHDN_3GK5 +expect 390338.211462 5613774.353256 # ETRS89_UTM33 +accept 5398959.121385 5689583.521018 # DE_DHDN_3GK5 +expect 816793.461724 5696579.298817 # ETRS89_UTM32 +accept 5398959.121385 5689583.521018 # DE_DHDN_3GK5 +expect 398863.493307 5687753.129020 # ETRS89_UTM33 +accept 5401685.729154 5769283.220752 # DE_DHDN_3GK5 +expect 812962.846098 5776288.882564 # ETRS89_UTM32 +accept 5401685.729154 5769283.220752 # DE_DHDN_3GK5 +expect 401589.388272 5767420.751372 # ETRS89_UTM33 +accept 5395240.318989 5893707.029636 # DE_DHDN_3GK5 +expect 796184.889876 5899821.806119 # ETRS89_UTM32 +accept 5395240.318989 5893707.029636 # DE_DHDN_3GK5 +expect 395147.893840 5891795.036022 # ETRS89_UTM33 +accept 5395847.545864 5817631.467237 # DE_DHDN_3GK5 +expect 803137.012417 5824018.671556 # ETRS89_UTM32 +accept 5395847.545864 5817631.467237 # DE_DHDN_3GK5 +expect 395754.092849 5815749.835902 # ETRS89_UTM33 +accept 5363615.032963 5438164.610427 # DE_DHDN_3GK5 +expect 801769.133341 5442981.626260 # ETRS89_UTM32 +accept 5363615.032963 5438164.610427 # DE_DHDN_3GK5 +expect 363531.446506 5436436.282581 # ETRS89_UTM33 +accept 5346007.854521 5281010.564511 # DE_DHDN_3GK5 +expect 796505.582915 5284862.664427 # ETRS89_UTM32 +accept 5346007.854521 5281010.564511 # DE_DHDN_3GK5 +expect 345930.907036 5279345.459525 # ETRS89_UTM33 +------------------------------------------------------------------------------- diff --git a/test/gie/Makefile.am b/test/gie/Makefile.am index 4d5b206..7b1dc37 100644 --- a/test/gie/Makefile.am +++ b/test/gie/Makefile.am @@ -8,7 +8,8 @@ EXTRA_DIST = 4D-API_cs2cs-style.gie \ deformation.gie \ ellipsoid.gie \ more_builtins.gie \ - unitconvert.gie + unitconvert.gie \ + DHDN_ETRS89.gie PROJ_LIB ?= $(top_srcdir)/nad @@ -36,4 +37,7 @@ more_builtins: more_builtins.gie unitconvert: unitconvert.gie PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $< -check-local: 4D-API-cs2cs-style GDA axisswap builtins deformation ellipsoid more_builtins unitconvert +DHDN_ETRS89: + PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $< + +check-local: 4D-API-cs2cs-style GDA axisswap builtins deformation ellipsoid more_builtins unitconvert DHDN_ETRS89 diff --git a/test/gie/Makefile.in b/test/gie/Makefile.in index 3ff1cac..02240d8 100644 --- a/test/gie/Makefile.in +++ b/test/gie/Makefile.in @@ -250,7 +250,8 @@ EXTRA_DIST = 4D-API_cs2cs-style.gie \ deformation.gie \ ellipsoid.gie \ more_builtins.gie \ - unitconvert.gie + unitconvert.gie \ + DHDN_ETRS89.gie all: all-am @@ -472,7 +473,10 @@ more_builtins: more_builtins.gie unitconvert: unitconvert.gie PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $< -check-local: 4D-API-cs2cs-style GDA axisswap builtins deformation ellipsoid more_builtins unitconvert +DHDN_ETRS89: + PROJ_LIB=$(PROJ_LIB) $(GIEEXE) $< + +check-local: 4D-API-cs2cs-style GDA axisswap builtins deformation ellipsoid more_builtins unitconvert DHDN_ETRS89 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/proj.git _______________________________________________ Pkg-grass-devel mailing list Pkg-grass-devel@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel