Package: proj Version: 4.4.9d-2 Severity: wishlist
Also sent to the [EMAIL PROTECTED] Patch in attachment can be applied to proj-4.5.0. To apply the patch: tar xzf proj-4.5.0.tgz cd proj-4.5.0 patch -p1 <../proj-4.5.0-geod_api.patch Following functions were added: GEODESIC_T *GEOD_init(int, char **, GEODESIC_T *geodesic); GEODESIC_T *GEOD_init_plus(const char *args, GEODESIC_T *geodesic); They work the same way as proj_init and proj_init_plus, except that they accept additional parameter GEODESIC_T *geodesic. If geodesic is 0, memory for GEODESIC_T will be allocated and pointer to allocated memory will be returned. Functions geodetic_for, geod_inv, geod_pre are changed to accept pointer to the GEODESIC_T. All global variables are moved to this structure. Functions geod_for, geod_inv, geod_pre become members of the proj library. I also include changes to Makefile.in, but may be it is better to regenerate it again (or even exclude from distribution as it is generated file). Following 2 functions are not included into the patch, they just make usage of the geod functions convinient. void geod_fwd(GEODESIC_T *GEODESIC, double lon1, double lat1, double S, double az, double *lon2, double *lat2) { GEODESIC->p1.u = lat1; GEODESIC->p1.v = lon1; al12 = az; GEODESIC->DIST = S; //* GEODESIC->FR_METER; geod_pre(GEODESIC); geod_for(GEODESIC); *lat2 = GEODESIC->p2.u; *lon2 = GEODESIC->p2.v; } int geod_rev(GEODESIC_T *GEODESIC, double lon1, double lat1, double lon2, double lat2, double *S, double *az) { GEODESIC->p1.u = lat1; GEODESIC->p1.v = lon1; GEODESIC->p2.u = lat2; GEODESIC->p2.v = lon2; int ret = geod_inv(GEODESIC); if(al12 < 0) { al12 += TWOPI; } *az = al12; *S = GEODESIC->DIST; // * GEODESIC->TO_METER; return ret; } Hope it will be useful. -- System Information: Debian Release: testing/unstable APT prefers testing APT policy: (500, 'testing') Architecture: i386 (i686) Shell: /bin/sh linked to /bin/bash Kernel: Linux 2.6.17-2-k7 Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) Versions of packages proj depends on: ii libc6 2.3.6.ds1-7 GNU C Library: Shared libraries proj recommends no packages. -- no debconf information
diff -Naur proj-4.5.0-orig/src/geod.c proj-4.5.0/src/geod.c --- proj-4.5.0-orig/src/geod.c 2006-12-04 11:18:34.000000000 +0100 +++ proj-4.5.0/src/geod.c 2006-12-05 12:35:35.000000000 +0100 @@ -23,7 +23,12 @@ pline[50], /* work string */ *usage = "%s\nusage: %s [ -afFIptTwW [args] ] [ +opts[=arg] ] [ files ]\n"; - static void + + +static GEODESIC_T Geodesic; +static GEODESIC_T *GEODESIC = &Geodesic; + +static void printLL(double p, double l) { if (oform) { (void)printf(oform, p * RAD_TO_DEG); TAB; @@ -33,28 +38,31 @@ (void)fputs(rtodms(pline, l, 'E', 'W'),stdout); } } - static void + + +static void do_arc(void) { double az; - printLL(phi2, lam2); putchar('\n'); - for (az = al12; n_alpha--; ) { - al12 = az = adjlon(az + del_alpha); - geod_pre(); - geod_for(); - printLL(phi2, lam2); putchar('\n'); + printLL(GEODESIC->p2.u, GEODESIC->p2.v); putchar('\n'); + for (az = GEODESIC->ALPHA12; GEODESIC->n_alpha--; ) { + GEODESIC->ALPHA12 = az = adjlon(az + GEODESIC->del_alpha); + geod_pre(GEODESIC); + geod_for(GEODESIC); + printLL(GEODESIC->p2.u, GEODESIC->p2.v); putchar('\n'); } } - static void /* generate intermediate geodesic coordinates */ + +static void /* generate intermediate geodesic coordinates */ do_geod(void) { double phil, laml, del_S; - phil = phi2; - laml = lam2; - printLL(phi1, lam1); putchar('\n'); - for ( geod_S = del_S = geod_S / n_S; --n_S; geod_S += del_S) { - geod_for(); - printLL(phi2, lam2); putchar('\n'); + phil = GEODESIC->p2.u; + laml = GEODESIC->p2.v; + printLL(GEODESIC->p1.u, GEODESIC->p1.v); putchar('\n'); + for ( GEODESIC->DIST = del_S = GEODESIC->DIST / GEODESIC->n_S; --(GEODESIC->n_S); GEODESIC->DIST += del_S) { + geod_for(GEODESIC); + printLL(GEODESIC->p2.u, GEODESIC->p2.v); putchar('\n'); } printLL(phil, laml); putchar('\n'); } @@ -76,51 +84,51 @@ fputs(line, stdout); continue; } - phi1 = dmstor(s, &s); - lam1 = dmstor(s, &s); + GEODESIC->p1.u = dmstor(s, &s); + GEODESIC->p1.v = dmstor(s, &s); if (inverse) { - phi2 = dmstor(s, &s); - lam2 = dmstor(s, &s); - geod_inv(); + GEODESIC->p2.u = dmstor(s, &s); + GEODESIC->p2.v = dmstor(s, &s); + geod_inv(GEODESIC); } else { - al12 = dmstor(s, &s); - geod_S = strtod(s, &s) * to_meter; - geod_pre(); - geod_for(); + GEODESIC->ALPHA12 = dmstor(s, &s); + GEODESIC->DIST = strtod(s, &s) * GEODESIC->TO_METER; + geod_pre(GEODESIC); + geod_for(GEODESIC); } if (!*s && (s > line)) --s; /* assumed we gobbled \n */ if (pos_azi) { - if (al12 < 0.) al12 += TWOPI; - if (al21 < 0.) al21 += TWOPI; + if (GEODESIC->ALPHA12 < 0.) GEODESIC->ALPHA12 += TWOPI; + if (GEODESIC->ALPHA21 < 0.) GEODESIC->ALPHA21 += TWOPI; } if (fullout) { - printLL(phi1, lam1); TAB; - printLL(phi2, lam2); TAB; + printLL(GEODESIC->p1.u, GEODESIC->p1.v); TAB; + printLL(GEODESIC->p2.u, GEODESIC->p2.v); TAB; if (oform) { - (void)printf(oform, al12 * RAD_TO_DEG); TAB; - (void)printf(oform, al21 * RAD_TO_DEG); TAB; - (void)printf(osform, geod_S * fr_meter); + (void)printf(oform, GEODESIC->ALPHA12 * RAD_TO_DEG); TAB; + (void)printf(oform, GEODESIC->ALPHA21 * RAD_TO_DEG); TAB; + (void)printf(osform, GEODESIC->DIST * GEODESIC->FR_METER); } else { - (void)fputs(rtodms(pline, al12, 0, 0), stdout); TAB; - (void)fputs(rtodms(pline, al21, 0, 0), stdout); TAB; - (void)printf(osform, geod_S * fr_meter); + (void)fputs(rtodms(pline, GEODESIC->ALPHA12, 0, 0), stdout); TAB; + (void)fputs(rtodms(pline, GEODESIC->ALPHA21, 0, 0), stdout); TAB; + (void)printf(osform, GEODESIC->DIST * GEODESIC->FR_METER); } } else if (inverse) if (oform) { - (void)printf(oform, al12 * RAD_TO_DEG); TAB; - (void)printf(oform, al21 * RAD_TO_DEG); TAB; - (void)printf(osform, geod_S * fr_meter); + (void)printf(oform, GEODESIC->ALPHA12 * RAD_TO_DEG); TAB; + (void)printf(oform, GEODESIC->ALPHA21 * RAD_TO_DEG); TAB; + (void)printf(osform, GEODESIC->DIST * GEODESIC->FR_METER); } else { - (void)fputs(rtodms(pline, al12, 0, 0), stdout); TAB; - (void)fputs(rtodms(pline, al21, 0, 0), stdout); TAB; - (void)printf(osform, geod_S * fr_meter); + (void)fputs(rtodms(pline, GEODESIC->ALPHA12, 0, 0), stdout); TAB; + (void)fputs(rtodms(pline, GEODESIC->ALPHA21, 0, 0), stdout); TAB; + (void)printf(osform, GEODESIC->DIST * GEODESIC->FR_METER); } else { - printLL(phi2, lam2); TAB; + printLL(GEODESIC->p2.u, GEODESIC->p2.v); TAB; if (oform) - (void)printf(oform, al21 * RAD_TO_DEG); + (void)printf(oform, GEODESIC->ALPHA21 * RAD_TO_DEG); else - (void)fputs(rtodms(pline, al21, 0, 0), stdout); + (void)fputs(rtodms(pline, GEODESIC->ALPHA21, 0, 0), stdout); } (void)fputs(s, stdout); } @@ -209,12 +217,12 @@ eargv[eargc++] = *argv; } /* done with parameter and control input */ - geod_set(pargc, pargv); /* setup projection */ - if ((n_alpha || n_S) && eargc) + GEOD_init(pargc, pargv, GEODESIC); /* setup projection */ + if ((GEODESIC->n_alpha || GEODESIC->n_S) && eargc) emess(1,"files specified for arc/geodesic mode"); - if (n_alpha) + if (GEODESIC->n_alpha) do_arc(); - else if (n_S) + else if (GEODESIC->n_S) do_geod(); else { /* process input file list */ if (eargc == 0) /* if no specific files force sysin */ diff -Naur proj-4.5.0-orig/src/geodesic.h proj-4.5.0/src/geodesic.h --- proj-4.5.0-orig/src/geodesic.h 2006-12-04 11:18:34.000000000 +0100 +++ proj-4.5.0/src/geodesic.h 2006-12-05 12:35:35.000000000 +0100 @@ -1,3 +1,8 @@ +#ifndef __GEODESIC_H__ +#define __GEODESIC_H__ + +#include "projects.h" + #ifndef lint static char GEODESIC_H_ID[] = "@(#)geodesic.h 4.3 95/08/19 GIE REL"; #endif @@ -12,40 +17,37 @@ # define GEOD_EXTERN #endif -GEOD_EXTERN struct geodesic { +typedef struct geodesic { double A; - double LAM1, PHI1, ALPHA12; - double LAM2, PHI2, ALPHA21; + + projUV p1, p2; + + double ALPHA12; + double ALPHA21; + double DIST; double ONEF, FLAT, FLAT2, FLAT4, FLAT64; int ELLIPSE; -} GEODESIC; + double FR_METER, TO_METER, del_alpha; + int n_alpha, n_S; + + + double th1,costh1,sinth1,sina12,cosa12,M,N,c1,c2,D,P,s1; + int merid, signS; +} GEODESIC_T; -# define geod_a GEODESIC.A -# define lam1 GEODESIC.LAM1 -# define phi1 GEODESIC.PHI1 -# define al12 GEODESIC.ALPHA12 -# define lam2 GEODESIC.LAM2 -# define phi2 GEODESIC.PHI2 -# define al21 GEODESIC.ALPHA21 -# define geod_S GEODESIC.DIST -# define geod_f GEODESIC.FLAT -# define onef GEODESIC.ONEF -# define f2 GEODESIC.FLAT2 -# define f4 GEODESIC.FLAT4 -# define ff2 GEODESIC.FLAT4 -# define f64 GEODESIC.FLAT64 -# define ellipse GEODESIC.ELLIPSE - - -GEOD_EXTERN int n_alpha, n_S; -GEOD_EXTERN double to_meter, fr_meter, del_alpha; -void geod_set(int, char **); -void geod_for(void); -void geod_pre(void); -void geod_inv(void); + GEODESIC_T *GEOD_init(int, char **, GEODESIC_T *g); + GEODESIC_T *GEOD_init_plus(const char *args, GEODESIC_T *g); + void geod_for(GEODESIC_T *g); + void geod_pre(GEODESIC_T *g); + int geod_inv(GEODESIC_T *g); + + #ifdef __cplusplus } #endif + +#endif // __GEODESIC_H__ + diff -Naur proj-4.5.0-orig/src/geod_for.c proj-4.5.0/src/geod_for.c --- proj-4.5.0-orig/src/geod_for.c 2006-12-04 11:18:34.000000000 +0100 +++ proj-4.5.0/src/geod_for.c 2006-12-05 12:35:35.000000000 +0100 @@ -4,103 +4,110 @@ # include "projects.h" # include "geodesic.h" # define MERI_TOL 1e-9 - static double -th1,costh1,sinth1,sina12,cosa12,M,N,c1,c2,D,P,s1; - static int -merid, signS; - void -geod_pre(void) { - al12 = adjlon(al12); /* reduce to +- 0-PI */ - signS = fabs(al12) > HALFPI ? 1 : 0; - th1 = ellipse ? atan(onef * tan(phi1)) : phi1; - costh1 = cos(th1); - sinth1 = sin(th1); - if ((merid = fabs(sina12 = sin(al12)) < MERI_TOL)) { - sina12 = 0.; - cosa12 = fabs(al12) < HALFPI ? 1. : -1.; - M = 0.; + + +// input: al12, ELLIPSE, ONEF, phi1, FLAT, FLAT4 +// output: al12 (ajusting) and!!! double s1, D, P, c1, M, N, cosa12, sina12, sinth1, costh1, th1, int signS, merid + +void +geod_pre(GEODESIC_T *GEODESIC) { + GEODESIC->ALPHA12 = adjlon(GEODESIC->ALPHA12); /* reduce to +- 0-PI */ + GEODESIC->signS = fabs(GEODESIC->ALPHA12) > HALFPI ? 1 : 0; + GEODESIC->th1 = GEODESIC->ELLIPSE ? atan(GEODESIC->ONEF * tan(GEODESIC->p1.u)) : GEODESIC->p1.u; + GEODESIC->costh1 = cos(GEODESIC->th1); + GEODESIC->sinth1 = sin(GEODESIC->th1); + if ((GEODESIC->merid = fabs(GEODESIC->sina12 = sin(GEODESIC->ALPHA12)) < MERI_TOL)) { + GEODESIC->sina12 = 0.; + GEODESIC->cosa12 = fabs(GEODESIC->ALPHA12) < HALFPI ? 1. : -1.; + GEODESIC->M = 0.; } else { - cosa12 = cos(al12); - M = costh1 * sina12; + GEODESIC->cosa12 = cos(GEODESIC->ALPHA12); + GEODESIC->M = GEODESIC->costh1 * GEODESIC->sina12; } - N = costh1 * cosa12; - if (ellipse) { - if (merid) { - c1 = 0.; - c2 = f4; - D = 1. - c2; - D *= D; - P = c2 / D; + GEODESIC->N = GEODESIC->costh1 * GEODESIC->cosa12; + if (GEODESIC->ELLIPSE) { + if (GEODESIC->merid) { + GEODESIC->c1 = 0.; + GEODESIC->c2 = GEODESIC->FLAT4; + GEODESIC->D = 1. - GEODESIC->c2; + GEODESIC->D *= GEODESIC->D; + GEODESIC->P = GEODESIC->c2 / GEODESIC->D; } else { - c1 = geod_f * M; - c2 = f4 * (1. - M * M); - D = (1. - c2)*(1. - c2 - c1 * M); - P = (1. + .5 * c1 * M) * c2 / D; + GEODESIC->c1 = GEODESIC->FLAT * GEODESIC->M; + GEODESIC->c2 = GEODESIC->FLAT4 * (1. - GEODESIC->M * GEODESIC->M); + GEODESIC->D = (1. - GEODESIC->c2)*(1. - GEODESIC->c2 - GEODESIC->c1 * GEODESIC->M); + GEODESIC->P = (1. + .5 * GEODESIC->c1 * GEODESIC->M) * GEODESIC->c2 / GEODESIC->D; } } - if (merid) s1 = HALFPI - th1; + if (GEODESIC->merid) GEODESIC->s1 = HALFPI - GEODESIC->th1; else { - s1 = (fabs(M) >= 1.) ? 0. : acos(M); - s1 = sinth1 / sin(s1); - s1 = (fabs(s1) >= 1.) ? 0. : acos(s1); + GEODESIC->s1 = (fabs(GEODESIC->M) >= 1.) ? 0. : acos(GEODESIC->M); + GEODESIC->s1 = GEODESIC->sinth1 / sin(GEODESIC->s1); + GEODESIC->s1 = (fabs(GEODESIC->s1) >= 1.) ? 0. : acos(GEODESIC->s1); } } - void -geod_for(void) { - double d,sind,u,V,X,ds,cosds,sinds,ss,de; - - if (ellipse) { - d = geod_S / (D * geod_a); - if (signS) d = -d; - u = 2. * (s1 - d); + +// input: ELLIPSE, DIST, A and!!! D, signS, s1 +// output: + +void +geod_for(GEODESIC_T *GEODESIC) { + double d,sind,u,V,X,ds,cosds,sinds,ss = 0,de; + + if (GEODESIC->ELLIPSE) { + d = GEODESIC->DIST / (GEODESIC->D * GEODESIC->A); + if (GEODESIC->signS) d = -d; + u = 2. * (GEODESIC->s1 - d); V = cos(u + d); - X = c2 * c2 * (sind = sin(d)) * cos(d) * (2. * V * V - 1.); - ds = d + X - 2. * P * V * (1. - 2. * P * cos(u)) * sind; - ss = s1 + s1 - ds; + X = GEODESIC->c2 * GEODESIC->c2 * (sind = sin(d)) * cos(d) * (2. * V * V - 1.); + ds = d + X - 2. * GEODESIC->P * V * (1. - 2. * GEODESIC->P * cos(u)) * sind; + ss = GEODESIC->s1 + GEODESIC->s1 - ds; } else { - ds = geod_S / geod_a; - if (signS) ds = - ds; + ds = GEODESIC->DIST / GEODESIC->A; + if (GEODESIC->signS) ds = - ds; } cosds = cos(ds); sinds = sin(ds); - if (signS) sinds = - sinds; - al21 = N * cosds - sinth1 * sinds; - if (merid) { - phi2 = atan( tan(HALFPI + s1 - ds) / onef); - if (al21 > 0.) { - al21 = PI; - if (signS) + if (GEODESIC->signS) sinds = - sinds; + GEODESIC->ALPHA21 = GEODESIC->N * cosds - GEODESIC->sinth1 * sinds; + if (GEODESIC->merid) { + GEODESIC->p2.u = atan( tan(HALFPI + GEODESIC->s1 - ds) / GEODESIC->ONEF); + if (GEODESIC->ALPHA21 > 0.) { + GEODESIC->ALPHA21 = PI; + if (GEODESIC->signS) de = PI; else { - phi2 = - phi2; + GEODESIC->p2.u = - GEODESIC->p2.u; de = 0.; } } else { - al21 = 0.; - if (signS) { - phi2 = - phi2; + GEODESIC->ALPHA21 = 0.; + if (GEODESIC->signS) { + GEODESIC->p2.u = - GEODESIC->p2.u; de = 0; } else de = PI; } } else { - al21 = atan(M / al21); - if (al21 > 0) - al21 += PI; - if (al12 < 0.) - al21 -= PI; - al21 = adjlon(al21); - phi2 = atan(-(sinth1 * cosds + N * sinds) * sin(al21) / - (ellipse ? onef * M : M)); - de = atan2(sinds * sina12 , - (costh1 * cosds - sinth1 * sinds * cosa12)); - if (ellipse) - if (signS) - de += c1 * ((1. - c2) * ds + - c2 * sinds * cos(ss)); + GEODESIC->ALPHA21 = atan(GEODESIC->M / GEODESIC->ALPHA21); + if (GEODESIC->ALPHA21 > 0) + GEODESIC->ALPHA21 += PI; + if (GEODESIC->ALPHA12 < 0.) + GEODESIC->ALPHA21 -= PI; + GEODESIC->ALPHA21 = adjlon(GEODESIC->ALPHA21); + GEODESIC->p2.u = atan(-(GEODESIC->sinth1 * cosds + GEODESIC->N * sinds) * sin(GEODESIC->ALPHA21) / + (GEODESIC->ELLIPSE ? GEODESIC->ONEF * GEODESIC->M : GEODESIC->M)); + de = atan2(sinds * GEODESIC->sina12 , + (GEODESIC->costh1 * cosds - GEODESIC->sinth1 * sinds * GEODESIC->cosa12)); + if (GEODESIC->ELLIPSE) + { + if (GEODESIC->signS) + de += GEODESIC->c1 * ((1. - GEODESIC->c2) * ds + + GEODESIC->c2 * sinds * cos(ss)); else - de -= c1 * ((1. - c2) * ds - - c2 * sinds * cos(ss)); + de -= GEODESIC->c1 * ((1. - GEODESIC->c2) * ds - + GEODESIC->c2 * sinds * cos(ss)); + } } - lam2 = adjlon( lam1 + de ); + GEODESIC->p2.v = adjlon( GEODESIC->p1.v + de ); } diff -Naur proj-4.5.0-orig/src/geod_inv.c proj-4.5.0/src/geod_inv.c --- proj-4.5.0-orig/src/geod_inv.c 2006-12-04 11:18:34.000000000 +0100 +++ proj-4.5.0/src/geod_inv.c 2006-12-05 12:35:35.000000000 +0100 @@ -4,24 +4,26 @@ # include "projects.h" # include "geodesic.h" # define DTOL 1e-12 - void -geod_inv(void) { + +int +geod_inv(GEODESIC_T *GEODESIC) +{ double th1,th2,thm,dthm,dlamm,dlam,sindlamm,costhm,sinthm,cosdthm, sindthm,L,E,cosd,d,X,Y,T,sind,tandlammp,u,v,D,A,B; - if (ellipse) { - th1 = atan(onef * tan(phi1)); - th2 = atan(onef * tan(phi2)); + if (GEODESIC->ELLIPSE) { + th1 = atan(GEODESIC->ONEF * tan(GEODESIC->p1.u)); + th2 = atan(GEODESIC->ONEF * tan(GEODESIC->p2.u)); } else { - th1 = phi1; - th2 = phi2; + th1 = GEODESIC->p1.u; + th2 = GEODESIC->p2.u; } thm = .5 * (th1 + th2); dthm = .5 * (th2 - th1); - dlamm = .5 * ( dlam = adjlon(lam2 - lam1) ); + dlamm = .5 * ( dlam = adjlon(GEODESIC->p2.v - GEODESIC->p1.v) ); if (fabs(dlam) < DTOL && fabs(dthm) < DTOL) { - al12 = al21 = geod_S = 0.; - return; + GEODESIC->ALPHA12 = GEODESIC->ALPHA21 = GEODESIC->DIST = 0.; + return -1; } sindlamm = sin(dlamm); costhm = cos(thm); sinthm = sin(thm); @@ -29,7 +31,7 @@ L = sindthm * sindthm + (cosdthm * cosdthm - sinthm * sinthm) * sindlamm * sindlamm; d = acos(cosd = 1 - L - L); - if (ellipse) { + if (GEODESIC->ELLIPSE) { E = cosd + cosd; sind = sin( d ); Y = sinthm * cosdthm; @@ -42,18 +44,19 @@ D = 4. * T * T; A = D * E; B = D + D; - geod_S = geod_a * sind * (T - f4 * (T * X - Y) + - f64 * (X * (A + (T - .5 * (A - E)) * X) - - Y * (B + E * Y) + D * X * Y)); + GEODESIC->DIST = GEODESIC->A * sind * (T - GEODESIC->FLAT4 * (T * X - Y) + + GEODESIC->FLAT64 * (X * (A + (T - .5 * (A - E)) * X) - + Y * (B + E * Y) + D * X * Y)); tandlammp = tan(.5 * (dlam - .25 * (Y + Y - E * (4. - X)) * - (f2 * T + f64 * (32. * T - (20. * T - A) - * X - (B + 4.) * Y)) * tan(dlam))); + (GEODESIC->FLAT2 * T + GEODESIC->FLAT64 * (32. * T - (20. * T - A) + * X - (B + 4.) * Y)) * tan(dlam))); } else { - geod_S = geod_a * d; + GEODESIC->DIST = GEODESIC->A * d; tandlammp = tan(dlamm); } u = atan2(sindthm , (tandlammp * costhm)); v = atan2(cosdthm , (tandlammp * sinthm)); - al12 = adjlon(TWOPI + v - u); - al21 = adjlon(TWOPI - v - u); + GEODESIC->ALPHA12 = adjlon(TWOPI + v - u); + GEODESIC->ALPHA21 = adjlon(TWOPI - v - u); + return 0; } diff -Naur proj-4.5.0-orig/src/geod_set.c proj-4.5.0/src/geod_set.c --- proj-4.5.0-orig/src/geod_set.c 2006-12-04 11:18:34.000000000 +0100 +++ proj-4.5.0/src/geod_set.c 2006-12-05 12:35:35.000000000 +0100 @@ -4,17 +4,27 @@ #define _IN_GEOD_SET +#include <stdlib.h> #include <string.h> #include "projects.h" #include "geodesic.h" #include "emess.h" - void -geod_set(int argc, char **argv) { - paralist *start = 0, *curr; + +GEODESIC_T * +GEOD_init(int argc, char **argv, GEODESIC_T *GEODESIC) +{ + paralist *start = 0, *curr = 0; double es; char *name; int i; + + if(0 == GEODESIC) + { + GEODESIC = malloc(sizeof(GEODESIC_T)); + } + memset(GEODESIC, 0, sizeof(GEODESIC_T)); + /* put arguments into internal linked list */ if (argc <= 0) emess(1, "no arguments in initialization list"); @@ -24,49 +34,50 @@ else start = curr = pj_mkparam(argv[i]); /* set elliptical parameters */ - if (pj_ell_set(start, &geod_a, &es)) emess(1,"ellipse setup failure"); + if (pj_ell_set(start, &GEODESIC->A, &es)) emess(1,"ellipse setup failure"); /* set units */ - if (name = pj_param(start, "sunits").s) { + if ((name = pj_param(start, "sunits").s)) { char *s; struct PJ_UNITS *unit_list = pj_get_units_ref(); for (i = 0; (s = unit_list[i].id) && strcmp(name, s) ; ++i) ; if (!s) emess(1,"%s unknown unit conversion id", name); - fr_meter = 1. / (to_meter = atof(unit_list[i].to_meter)); + GEODESIC->FR_METER = 1. / (GEODESIC->TO_METER = atof(unit_list[i].to_meter)); } else - to_meter = fr_meter = 1.; - if (ellipse = es != 0.) { - onef = sqrt(1. - es); - geod_f = 1 - onef; - f2 = geod_f/2; - f4 = geod_f/4; - f64 = geod_f*geod_f/64; + GEODESIC->TO_METER = GEODESIC->FR_METER = 1.; + if ((GEODESIC->ELLIPSE = (es != 0.))) { + GEODESIC->ONEF = sqrt(1. - es); + GEODESIC->FLAT = 1 - GEODESIC->ONEF; + GEODESIC->FLAT2 = GEODESIC->FLAT/2; + GEODESIC->FLAT4 = GEODESIC->FLAT/4; + GEODESIC->FLAT64 = GEODESIC->FLAT*GEODESIC->FLAT/64; } else { - onef = 1.; - geod_f = f2 = f4 = f64 = 0.; + GEODESIC->ONEF = 1.; + GEODESIC->FLAT = GEODESIC->FLAT2 = GEODESIC->FLAT4 = GEODESIC->FLAT64 = 0.; } /* check if line or arc mode */ if (pj_param(start, "tlat_1").i) { double del_S; #undef f - phi1 = pj_param(start, "rlat_1").f; - lam1 = pj_param(start, "rlon_1").f; + + GEODESIC->p1.u = pj_param(start, "rlat_1").f; + GEODESIC->p1.v = pj_param(start, "rlon_1").f; if (pj_param(start, "tlat_2").i) { - phi2 = pj_param(start, "rlat_2").f; - lam2 = pj_param(start, "rlon_2").f; - geod_inv(); - geod_pre(); - } else if (geod_S = pj_param(start, "dS").f) { - al12 = pj_param(start, "rA").f; - geod_pre(); - geod_for(); + GEODESIC->p2.u = pj_param(start, "rlat_2").f; + GEODESIC->p2.v = pj_param(start, "rlon_2").f; + geod_inv(GEODESIC); + geod_pre(GEODESIC); + } else if ((GEODESIC->DIST = pj_param(start, "dS").f)) { + GEODESIC->ALPHA12 = pj_param(start, "rA").f; + geod_pre(GEODESIC); + geod_for(GEODESIC); } else emess(1,"incomplete geodesic/arc info"); - if ((n_alpha = pj_param(start, "in_A").i) > 0) { - if (!(del_alpha = pj_param(start, "rdel_A").f)) + if ((GEODESIC->n_alpha = pj_param(start, "in_A").i) > 0) { + if (!(GEODESIC->del_alpha = pj_param(start, "rdel_A").f)) emess(1,"del azimuth == 0"); - } else if (del_S = fabs(pj_param(start, "ddel_S").f)) { - n_S = geod_S / del_S + .5; - } else if ((n_S = pj_param(start, "in_S").i) <= 0) + } else if ((del_S = fabs(pj_param(start, "ddel_S").f))) { + GEODESIC->n_S = GEODESIC->DIST / del_S + .5; + } else if ((GEODESIC->n_S = pj_param(start, "in_S").i) <= 0) emess(1,"no interval divisor selected"); } /* free up linked list */ @@ -74,4 +85,53 @@ curr = start->next; pj_dalloc(start); } + return GEODESIC; } + +GEODESIC_T *GEOD_init_plus(const char *definition, GEODESIC_T *geod) +{ +#define MAX_ARG 200 + char *argv[MAX_ARG]; + char *defn_copy; + int argc = 0, i; + + /* make a copy that we can manipulate */ + defn_copy = strdup(definition); + + /* split into arguments based on '+' and trim white space */ + + for( i = 0; defn_copy[i] != '\0'; i++ ) + { + switch( defn_copy[i] ) + { + case '+': + if( i == 0 || defn_copy[i-1] == '\0' ) + { + if( argc+1 == MAX_ARG ) + { + //pj_errno = -44; + return NULL; + } + + argv[argc++] = defn_copy + i + 1; + } + break; + + case ' ': + case '\t': + case '\n': + defn_copy[i] = '\0'; + break; + + default: + /* do nothing */; + } + } + + /* perform actual initialization */ + GEODESIC_T *ret_geod = GEOD_init(argc, argv, geod); + + free( defn_copy ); + return ret_geod; +} + diff -Naur proj-4.5.0-orig/src/Makefile.am proj-4.5.0/src/Makefile.am --- proj-4.5.0-orig/src/Makefile.am 2006-12-04 11:18:34.000000000 +0100 +++ proj-4.5.0/src/Makefile.am 2006-12-05 12:35:35.000000000 +0100 @@ -2,7 +2,7 @@ INCLUDES = -DPROJ_LIB=\"$(pkgdatadir)\" @JNI_INCLUDE@ -include_HEADERS = projects.h nad_list.h proj_api.h org_proj4_Projections.h +include_HEADERS = projects.h nad_list.h proj_api.h org_proj4_Projections.h geodesic.h EXTRA_DIST = makefile.vc proj.def @@ -10,7 +10,7 @@ cs2cs_SOURCES = cs2cs.c gen_cheb.c p_series.c nad2nad_SOURCES = nad2nad.c nad2bin_SOURCES = nad2bin.c -geod_SOURCES = geod.c geod_set.c geod_for.c geod_inv.c geodesic.h +geod_SOURCES = geod.c proj_LDADD = libproj.la cs2cs_LDADD = libproj.la @@ -59,7 +59,8 @@ nad_cvt.c nad_init.c nad_intr.c emess.c emess.h \ pj_apply_gridshift.c pj_datums.c pj_datum_set.c pj_transform.c \ geocent.c geocent.h pj_utils.c pj_gridinfo.c pj_gridlist.c \ - jniproj.c + jniproj.c \ + geod_set.c geod_for.c geod_inv.c geodesic.h install-exec-local: diff -Naur proj-4.5.0-orig/src/Makefile.in proj-4.5.0/src/Makefile.in --- proj-4.5.0-orig/src/Makefile.in 2006-12-04 11:18:34.000000000 +0100 +++ proj-4.5.0/src/Makefile.in 2006-12-05 12:35:35.000000000 +0100 @@ -90,7 +90,7 @@ nad_cvt.lo nad_init.lo nad_intr.lo emess.lo \ pj_apply_gridshift.lo pj_datums.lo pj_datum_set.lo \ pj_transform.lo geocent.lo pj_utils.lo pj_gridinfo.lo \ - pj_gridlist.lo jniproj.lo + pj_gridlist.lo jniproj.lo geod_set.lo geod_for.lo geod_inv.lo libproj_la_OBJECTS = $(am_libproj_la_OBJECTS) binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) @@ -98,8 +98,7 @@ p_series.$(OBJEXT) cs2cs_OBJECTS = $(am_cs2cs_OBJECTS) cs2cs_DEPENDENCIES = libproj.la -am_geod_OBJECTS = geod.$(OBJEXT) geod_set.$(OBJEXT) geod_for.$(OBJEXT) \ - geod_inv.$(OBJEXT) +am_geod_OBJECTS = geod.$(OBJEXT) geod_OBJECTS = $(am_geod_OBJECTS) geod_DEPENDENCIES = libproj.la am_nad2bin_OBJECTS = nad2bin.$(OBJEXT) @@ -160,6 +159,7 @@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ +GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -188,12 +188,9 @@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ @@ -210,35 +207,42 @@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ INCLUDES = -DPROJ_LIB=\"$(pkgdatadir)\" @JNI_INCLUDE@ -include_HEADERS = projects.h nad_list.h proj_api.h org_proj4_Projections.h +include_HEADERS = projects.h nad_list.h proj_api.h org_proj4_Projections.h geodesic.h EXTRA_DIST = makefile.vc proj.def proj_SOURCES = proj.c gen_cheb.c p_series.c cs2cs_SOURCES = cs2cs.c gen_cheb.c p_series.c nad2nad_SOURCES = nad2nad.c nad2bin_SOURCES = nad2bin.c -geod_SOURCES = geod.c geod_set.c geod_for.c geod_inv.c geodesic.h +geod_SOURCES = geod.c proj_LDADD = libproj.la cs2cs_LDADD = libproj.la nad2nad_LDADD = libproj.la @@ -283,7 +287,8 @@ nad_cvt.c nad_init.c nad_intr.c emess.c emess.h \ pj_apply_gridshift.c pj_datums.c pj_datum_set.c pj_transform.c \ geocent.c geocent.h pj_utils.c pj_gridinfo.c pj_gridlist.c \ - jniproj.c + jniproj.c \ + geod_set.c geod_for.c geod_inv.c geodesic.h all: proj_config.h $(MAKE) $(AM_MAKEFLAGS) all-am @@ -515,9 +520,9 @@ @AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@ @AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@ @AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@ [EMAIL PROTECTED]@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@ [EMAIL PROTECTED]@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@ [EMAIL PROTECTED]@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@ [EMAIL PROTECTED]@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@ [EMAIL PROTECTED]@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@ [EMAIL PROTECTED]@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@ @AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@ @AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@ @AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@