diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/cs2cs.c | 9 | ||||
| -rw-r--r-- | src/pj_datums.c | 25 | ||||
| -rw-r--r-- | src/pj_init.c | 26 | ||||
| -rw-r--r-- | src/pj_transform.c | 22 | ||||
| -rw-r--r-- | src/projects.h | 12 |
5 files changed, 94 insertions, 0 deletions
diff --git a/src/cs2cs.c b/src/cs2cs.c index a42d44f9..6217e236 100644 --- a/src/cs2cs.c +++ b/src/cs2cs.c @@ -29,6 +29,9 @@ ****************************************************************************** * * $Log$ + * Revision 1.6 2002/12/09 16:01:02 warmerda + * added prime meridian support + * * Revision 1.5 2002/11/19 20:33:42 warmerda * cleanup before exit to facilitate memory leak testing * @@ -261,6 +264,12 @@ int main(int argc, char **argv) if( ld->comments != NULL && strlen(ld->comments) > 0 ) printf( "%25s %s\n", " ", ld->comments ); } + } else if( arg[1] == 'm') { /* list prime meridians */ + struct PJ_PRIME_MERIDIANS *lpm; + + for (lpm = pj_prime_meridians; lpm->id ; ++lpm) + (void)printf("%12s %-30s\n", + lpm->id, lpm->defn); } else emess(1,"invalid list option: l%c",arg[1]); exit(0); diff --git a/src/pj_datums.c b/src/pj_datums.c index 9a8aa302..263d4497 100644 --- a/src/pj_datums.c +++ b/src/pj_datums.c @@ -28,6 +28,9 @@ ****************************************************************************** * * $Log$ + * Revision 1.4 2002/12/09 16:01:02 warmerda + * added prime meridian support + * * Revision 1.3 2002/07/08 02:32:05 warmerda * ensure clean C++ builds * @@ -61,3 +64,25 @@ C_NAMESPACE struct PJ_DATUMS pj_datums[] = { "North_American_Datum_1927", NULL, NULL, NULL, NULL }; + +C_NAMESPACE struct PJ_PRIME_MERIDIANS pj_prime_meridians[] = { + /* id definition */ + /* -- ---------- */ + "greenwich", "0dE", + "lisbon", "9d07'54.862\"W", + "paris", "2d20'14.025\"E", + "bogota", "74d04'51.3\"E", + "madrid", "3d41'16.48\"W", + "rome", "12d27'8.4\"E", + "bern", "7d26'22.5\"E", + "jakarta", "106d48'27.79\"E", + "ferro", "17d40'W", + "brussels", "4d22'4.71\"E", + "stockholm", "18d3'29.8\"E", + "athens", "23d42'58.815\"E", + "oslo", "10d43'22.5\"E", + NULL, NULL +}; + + + diff --git a/src/pj_init.c b/src/pj_init.c index 39cb7c81..0078ea13 100644 --- a/src/pj_init.c +++ b/src/pj_init.c @@ -248,6 +248,32 @@ pj_init(int argc, char **argv) { } else PIN->to_meter = PIN->fr_meter = 1.; + /* prime meridian */ + s = 0; + if (name = pj_param(start, "spm").s) { + const char *value = NULL; + char *next_str = NULL; + + for (i = 0; pj_prime_meridians[i].id != NULL; ++i ) + { + if( strcmp(name,pj_prime_meridians[i].id) == 0 ) + { + value = pj_prime_meridians[i].defn; + break; + } + } + + if( value == NULL + && dmstor(name,&next_str) != 0.0 + && *next_str == '\0' ) + value = name; + + if (!value) { pj_errno = -7; goto bum_call; } + PIN->from_greenwich = dmstor(value,NULL); + } + else + PIN->from_greenwich = 0.0; + /* projection specific initialization */ if (!(PIN = (*proj)(PIN)) || errno || pj_errno) { bum_call: /* cleanup error return */ diff --git a/src/pj_transform.c b/src/pj_transform.c index ba136d20..a6c9aee3 100644 --- a/src/pj_transform.c +++ b/src/pj_transform.c @@ -30,6 +30,9 @@ ****************************************************************************** * * $Log$ + * Revision 1.6 2002/12/09 16:01:02 warmerda + * added prime meridian support + * * Revision 1.5 2002/12/01 19:25:26 warmerda * applied fix for 7 param shift in pj_geocentric_from_wgs84, see bug 194 * @@ -111,6 +114,15 @@ int pj_transform( PJ *srcdefn, PJ *dstdefn, long point_count, int point_offset, y[point_offset*i] = geodetic_loc.v; } } +/* -------------------------------------------------------------------- */ +/* But if they are already lat long, adjust for the prime */ +/* meridian if there is one in effect. */ +/* -------------------------------------------------------------------- */ + else if( srcdefn->from_greenwich != 0.0 ) + { + for( i = 0; i < point_count; i++ ) + x[point_offset*i] += srcdefn->from_greenwich; + } /* -------------------------------------------------------------------- */ /* Convert datums if needed, and possible. */ @@ -141,6 +153,16 @@ int pj_transform( PJ *srcdefn, PJ *dstdefn, long point_count, int point_offset, y[point_offset*i] = projected_loc.v; } } +/* -------------------------------------------------------------------- */ +/* But if they are staying lat long, adjust for the prime */ +/* meridian if there is one in effect. */ +/* -------------------------------------------------------------------- */ + else if( dstdefn->from_greenwich != 0.0 ) + { + for( i = 0; i < point_count; i++ ) + x[point_offset*i] -= dstdefn->from_greenwich; + } + return 0; } diff --git a/src/projects.h b/src/projects.h index 4091fc9a..eb580a4c 100644 --- a/src/projects.h +++ b/src/projects.h @@ -28,6 +28,9 @@ ****************************************************************************** * * $Log$ + * Revision 1.13 2002/12/09 16:01:02 warmerda + * added prime meridian support + * * Revision 1.12 2002/07/08 02:32:05 warmerda * ensure clean C++ builds * @@ -169,6 +172,11 @@ struct PJ_DATUMS { char *comments; /* EPSG code, etc */ }; +struct PJ_PRIME_MERIDIANS { + char *id; /* prime meridian keyword */ + char *defn; /* offset from greenwich in DMS format. */ +}; + struct DERIVS { double x_l, x_p; /* derivatives of x for lambda-phi */ double y_l, y_p; /* derivatives of y for lambda-phi */ @@ -219,6 +227,7 @@ typedef struct PJconsts { int datum_type; /* PJD_UNKNOWN/3PARAM/7PARAM/GRIDSHIFT/WGS84 */ double datum_params[7]; + double from_greenwich; /* prime meridian offset (in radians) */ #ifdef PROJ_PARMS__ PROJ_PARMS__ @@ -262,6 +271,7 @@ extern struct PJ_UNITS pj_units[]; #ifndef PJ_DATUMS__ extern struct PJ_DATUMS pj_datums[]; +extern struct PJ_PRIME_MERIDIANS pj_prime_meridians[]; #endif #ifdef PJ_LIB__ @@ -306,6 +316,8 @@ PVALUE pj_param(paralist *, char *); paralist *pj_mkparam(char *); int pj_ell_set(paralist *, double *, double *); int pj_datum_set(paralist *, PJ *); +int pj_prime_meridian_set(paralist *, PJ *); +int pj_angular_units_set(paralist *, PJ *); double *pj_enfn(double); double pj_mlfn(double, double, double, double *); double pj_inv_mlfn(double, double, double *); |
