/Proj4/pj_datum_set.c
http://github.com/route-me/route-me · C · 161 lines · 67 code · 22 blank · 72 comment · 36 complexity · 9c2b9a913d70034e3c20e30cd9fca7e0 MD5 · raw file
- /******************************************************************************
- * $Id: pj_datum_set.c,v 1.4 2007/11/29 21:06:50 fwarmerdam Exp $
- *
- * Project: PROJ.4
- * Purpose: Apply datum definition to PJ structure from initialization string.
- * Author: Frank Warmerdam, warmerda@home.com
- *
- ******************************************************************************
- * Copyright (c) 2000, Frank Warmerdam
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- ******************************************************************************
- *
- * $Log: pj_datum_set.c,v $
- * Revision 1.4 2007/11/29 21:06:50 fwarmerdam
- * make sure we only look for 7 parameters
- *
- * Revision 1.3 2007/01/31 06:41:01 fwarmerdam
- * dont parse more datum parameters than we have room for in datum_params[]
- *
- * Revision 1.2 2001/04/04 21:13:21 warmerda
- * do arcsecond/radian and ppm datum parm transformation in pj_set_datum()
- *
- * Revision 1.1 2000/07/06 23:32:27 warmerda
- * New
- *
- */
- #include "projects.h"
- #include <string.h>
- /* SEC_TO_RAD = Pi/180/3600 */
- #define SEC_TO_RAD 4.84813681109535993589914102357e-6
- /************************************************************************/
- /* pj_datum_set() */
- /************************************************************************/
- int pj_datum_set(paralist *pl, PJ *projdef)
- {
- const char *name, *towgs84;
- projdef->datum_type = PJD_UNKNOWN;
- /* -------------------------------------------------------------------- */
- /* Is there a datum definition in the parameters list? If so, */
- /* add the defining values to the parameter list. Note that */
- /* this will append the ellipse definition as well as the */
- /* towgs84= and related parameters. It should also be pointed */
- /* out that the addition is permanent rather than temporary */
- /* like most other keyword expansion so that the ellipse */
- /* definition will last into the pj_ell_set() function called */
- /* after this one. */
- /* -------------------------------------------------------------------- */
- name = pj_param(pl,"sdatum").s;
- if( name != NULL )
- {
- paralist *curr;
- const char *s;
- int i;
- /* find the end of the list, so we can add to it */
- for (curr = pl; curr && curr->next ; curr = curr->next) {}
-
- /* find the datum definition */
- for (i = 0; (s = pj_datums[i].id) && strcmp(name, s) ; ++i) {}
- if (!s) { pj_errno = -9; return 1; }
- if( pj_datums[i].ellipse_id && strlen(pj_datums[i].ellipse_id) > 0 )
- {
- char entry[100];
-
- strcpy( entry, "ellps=" );
- strncat( entry, pj_datums[i].ellipse_id, 80 );
- if (curr)
- {
- curr->next = pj_mkparam(entry);
- curr = curr->next;
- }
- }
-
- if( pj_datums[i].defn && strlen(pj_datums[i].defn) > 0 )
- {
- if (curr)
- curr->next = pj_mkparam(pj_datums[i].defn);
- }
- }
- /* -------------------------------------------------------------------- */
- /* Check for nadgrids parameter. */
- /* -------------------------------------------------------------------- */
- if( pj_param(pl,"snadgrids").s != NULL )
- {
- /* We don't actually save the value separately. It will continue
- to exist int he param list for use in pj_apply_gridshift.c */
- projdef->datum_type = PJD_GRIDSHIFT;
- }
- /* -------------------------------------------------------------------- */
- /* Check for towgs84 parameter. */
- /* -------------------------------------------------------------------- */
- else if( (towgs84 = pj_param(pl,"stowgs84").s) != NULL )
- {
- int parm_count = 0;
- const char *s;
- memset( projdef->datum_params, 0, sizeof(double) * 7);
- /* parse out the parameters */
- for( s = towgs84; *s != '\0' && parm_count < 7; )
- {
- projdef->datum_params[parm_count++] = atof(s);
- while( *s != '\0' && *s != ',' )
- s++;
- if( *s == ',' )
- s++;
- }
- if( projdef->datum_params[3] != 0.0
- || projdef->datum_params[4] != 0.0
- || projdef->datum_params[5] != 0.0
- || projdef->datum_params[6] != 0.0 )
- {
- projdef->datum_type = PJD_7PARAM;
- /* transform from arc seconds to radians */
- projdef->datum_params[3] *= SEC_TO_RAD;
- projdef->datum_params[4] *= SEC_TO_RAD;
- projdef->datum_params[5] *= SEC_TO_RAD;
- /* transform from parts per million to scaling factor */
- projdef->datum_params[6] =
- (projdef->datum_params[6]/1000000.0) + 1;
- }
- else
- projdef->datum_type = PJD_3PARAM;
- /* Note that pj_init() will later switch datum_type to
- PJD_WGS84 if shifts are all zero, and ellipsoid is WGS84 or GRS80 */
- }
- return 0;
- }