aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cs2cs.c9
-rw-r--r--src/pj_datums.c25
-rw-r--r--src/pj_init.c26
-rw-r--r--src/pj_transform.c22
-rw-r--r--src/projects.h12
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 *);