diff options
| -rw-r--r-- | ChangeLog | 8 | ||||
| -rw-r--r-- | html/gen_parms.html | 43 | ||||
| -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 |
7 files changed, 144 insertions, 1 deletions
@@ -1,3 +1,11 @@ +2002-12-08 Frank Warmerdam <warmerdam@pobox.com> + + * src/cs2cs.c: added support for the -lm switch to report all + prime meridians. + + * src/pj_init.c, pj_transform.c, pj_datum.c: added preliminary + support for the +pm switch to set the prime meridian. + 2002-12-01 Frank Warmerdam <warmerdam@pobox.com> * src/pj_transform.c: Applied fix for 7 parameter shifts in diff --git a/html/gen_parms.html b/html/gen_parms.html index 045eecf6..bc59b116 100644 --- a/html/gen_parms.html +++ b/html/gen_parms.html @@ -1,4 +1,4 @@ -<html> +w<html> <head> <title>PROJ.4 - General Parameters</title> </head> @@ -20,6 +20,47 @@ Virtually all coordinate systems allow for the presence of a false easting meters even if the coordinate system is some other units. Some coordinate systems (such as UTM) have implicit false easting and northing values.<p> +<h2><a name="pm">pm - Prime Meridian</a></h2> + +A prime meridian may be declared indicating the offset between the prime +meridian of the declared coordinate system and that of greenwich. A prime +meridian is clared using the "pm" parameter, and may be assigned a symbolic +name, or the longitude of the alternative prime meridian relative to +greenwich. <p> + +Currently prime meridian declarations are only utilized by the +pj_transform() API call, not the pj_inv() and pj_fwd() calls. Consequently +the user utility <b>cs2cs</b> does honour prime meridians but the <b>proj</b> +user utility ignores them. <p> + +The following predeclared prime meridian names are supported. These +can be listed using the cs2cs argument <b>-lm</b>.<p> +<pre> + 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 +</pre> + +Example of use. The location long=0, lat=0 in the greenwich based +lat/long coordinates is translated to lat/long coordinates with Madrid +as the prime meridian. <p> + +<pre> + cs2cs +proj=latlong +datum=WGS84 +to +proj=latlong +datum=WGS84 +pm=madrid +0 0 <i>(input)</i> +3d41'16.48"E 0dN 0.000 <i>(output)</i> +</pre> + <h2><a name="towgs84">towgs84 - Datum transformation to WGS84</a></h2> Datum shifts can be approximated by 3 parameter spatial translations (in 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 *); |
