From 67dc958368833fa125415a5e1f64ad33759fbf9e Mon Sep 17 00:00:00 2001 From: Frank Warmerdam Date: Tue, 10 May 2011 17:06:33 +0000 Subject: add support for vunits/vto_meter parameters to specify vertical units git-svn-id: http://svn.osgeo.org/metacrs/proj/trunk@2000 4e78687f-474d-0410-85f9-8d5e500ac6b2 --- src/pj_init.c | 15 +++++++++++++++ src/pj_transform.c | 18 ++++++++++++++++++ src/projects.h | 1 + 3 files changed, 34 insertions(+) (limited to 'src') diff --git a/src/pj_init.c b/src/pj_init.c index 26f32d1a..9e304a51 100644 --- a/src/pj_init.c +++ b/src/pj_init.c @@ -396,6 +396,21 @@ pj_init_ctx(projCtx ctx, int argc, char **argv) { } else PIN->to_meter = PIN->fr_meter = 1.; + /* set vertical units */ + s = 0; + if ((name = pj_param(ctx, start, "svunits").s) != NULL) { + for (i = 0; (s = pj_units[i].id) && strcmp(name, s) ; ++i) ; + if (!s) { pj_ctx_set_errno( ctx, -7 ); goto bum_call; } + s = pj_units[i].to_meter; + } + if (s || (s = pj_param(ctx, start, "svto_meter").s)) { + PIN->vto_meter = strtod(s, &s); + if (*s == '/') /* ratio number */ + PIN->vto_meter /= strtod(++s, 0); + PIN->vfr_meter = 1. / PIN->vto_meter; + } else + PIN->vto_meter = PIN->vfr_meter = 1.; + /* prime meridian */ s = 0; if ((name = pj_param(ctx, start, "spm").s) != NULL) { diff --git a/src/pj_transform.c b/src/pj_transform.c index 2d0d06ef..2545db16 100644 --- a/src/pj_transform.c +++ b/src/pj_transform.c @@ -111,6 +111,15 @@ int pj_transform( PJ *srcdefn, PJ *dstdefn, long point_count, int point_offset, return err; } +/* -------------------------------------------------------------------- */ +/* Transform Z to meters if it isn't already. */ +/* -------------------------------------------------------------------- */ + if( srcdefn->vto_meter != 1.0 && z != NULL ) + { + for( i = 0; i < point_count; i++ ) + z[point_offset*i] *= srcdefn->vto_meter; + } + /* -------------------------------------------------------------------- */ /* Transform geocentric source coordinates to lat/long. */ /* -------------------------------------------------------------------- */ @@ -334,6 +343,15 @@ int pj_transform( PJ *srcdefn, PJ *dstdefn, long point_count, int point_offset, } } +/* -------------------------------------------------------------------- */ +/* Transform Z from meters if needed. */ +/* -------------------------------------------------------------------- */ + if( dstdefn->vto_meter != 1.0 && z != NULL ) + { + for( i = 0; i < point_count; i++ ) + z[point_offset*i] *= dstdefn->vfr_meter; + } + /* -------------------------------------------------------------------- */ /* Transform normalized axes into unusual output coordinate axis */ /* orientation if needed. */ diff --git a/src/projects.h b/src/projects.h index 38377697..ddc1e435 100644 --- a/src/projects.h +++ b/src/projects.h @@ -249,6 +249,7 @@ typedef struct PJconsts { int has_geoid_vgrids; struct _pj_gi **vgridlist_geoid; int vgridlist_geoid_count; + double vto_meter, vfr_meter; double from_greenwich; /* prime meridian offset (in radians) */ double long_wrap_center; /* 0.0 for -180 to 180, actually in radians*/ -- cgit v1.2.3