Beispiel #1
0
int EXP_LVL1 CS_isHlpAvailable ()
{
	if (csHlpIsAvail == 0)
	{
		if (csHelpFile [0] == '\0')
		{
			if (cs_DirP != NULL)
			{
				CS_stcpy (cs_DirP,"CS-MAP.hlp");
				if (CS_access (cs_Dir,4) == 0)
				{
					csHlpIsAvail = 1;
					CS_stcpy (csHelpFile,cs_Dir);
				}
			}
			else
			{
				csHlpIsAvail = -1;
			}
		}
		else if (CS_access (csHelpFile,4) == 0)
		{
			csHlpIsAvail = 1;
		}
		else
		{
			csHlpIsAvail = -1;
		}
	}
	return (csHlpIsAvail > 0);
}
Beispiel #2
0
int CS_ftw (const char *path,int (*fn)(const char*,const struct stat*,int),int depth)
{
		/* Apple doesn't include an "ftw" implementation, and the
		 * only one I could find is subject to the GNU license,
		 * so we'll go for a different implementation. [GEH 2000/11/30]
		 * 
		 * This is a bit of a farce, really; the "depth" parameter is completely
		 * ignored.  It would take very little work to make it call CS_ftw()
		 * recursively.
		 */
	extern char cs_DirsepC;
	extern char *cs_DirP;
	extern char cs_ExtsepC;

	char *cp;
	char ctemp[MAXPATH];
	DIR *directory = NULL;
	int st = 0;

	cp = CS_stcpy(ctemp,path);

	directory = opendir(ctemp);
	if ( directory )
	{
		struct dirent *entry;
		*(cp - 1) = cs_DirsepC;
		while ( entry = readdir(directory) )
		{
			struct stat stat_buf; 
			CS_stcpy(cp,entry->d_name);

			st = stat (ctemp,&stat_buf);
			if (st == 0)
			{
				if ( S_ISDIR(stat_buf.st_mode) )  /* Should really be smarter here */
				{
					st = (*fn) (ctemp,&stat_buf,FTW_D);
				}
				else
				{
					st = (*fn) (ctemp,&stat_buf,FTW_F);
				}
				if (st != 0)
				{
					break;
				}
			}
		}
		closedir(directory);
	}
	return st;
}
Beispiel #3
0
/******************************************************************************
	Initialize the NZGD49 <--> NZGD2K conversion system.  The catalog file is
	expected to	reside in the basic data directory.  The name of the file is
	taken from the cs_Nzgd49Name global variable.
*/
int EXP_LVL7 CSnzgd49Init (void)
{
	extern char cs_Dir [];
	extern char* cs_DirP;
	extern char cs_Nzgd49Name [];

	char catalog [MAXPATH];

	if (csNzgd49ToNzgd2K == NULL)
	{
		/* Set up the catalog file name. */
		CS_stcpy (cs_DirP,cs_Nzgd49Name);
		CS_stncp (catalog,cs_Dir,sizeof (catalog));

		/* Use it to build the Nzgd49ToNzgd2K object. */
		csNzgd49ToNzgd2K = CSnewNzgd49ToNzgd2K (catalog);
		if (csNzgd49ToNzgd2K == NULL) goto error;
	}
	csNzgd49ToNzgd2KCnt += 1;
	return 0;

error:
	if (csNzgd49ToNzgd2K != NULL)
	{
		CSdeleteNzgd49ToNzgd2K (csNzgd49ToNzgd2K);
		csNzgd49ToNzgd2K = NULL;
		csNzgd49ToNzgd2KCnt = 0;
	}
	return -1;
}
Beispiel #4
0
/**********************************************************************
**	st = CSvrtconInit ();
**
**	int st;						returns 0 if the initialization proceeded to
**								completion successfully.  Otherwise,
**								returns -1.
**********************************************************************/
int EXP_LVL7 CSvrtconInit (void)
{
	extern char *cs_DirP;
	extern char cs_Dir [];
	extern char cs_VertconName [];

	/* See if we already have a csVertconUS object.
	   Note, we can have such even if the count is zero. */
	if (csVertconUS == NULL)
	{
		/* Nope, we best create one. */
		CS_stcpy (cs_DirP,cs_VertconName);
		csVertconUS = CSnewVertconUS (cs_Dir);
		if (csVertconUS == NULL)
		{
			goto error;
		}
		csVertconUSCnt = 0;
	}
	csVertconUSCnt += 1;
	return 0;

error:
	if (csVertconUS != NULL)
	{
		CSdeleteVertconUS (csVertconUS);
		csVertconUS = NULL;
	}
	csVertconUSCnt = 0;
	return -1;
}
Beispiel #5
0
/******************************************************************************
	Initialize the DHDN <--> ETRF conversion system.  The catalog file is
	expected to	reside in the basic data directory.
*/
int EXP_LVL7 CSdhdnInit (void)
{
	extern char cs_Dir [];
	extern char* cs_DirP;
	extern char cs_DhdnName [];

	char catalog [MAXPATH];

	if (csDhdnToEtrf89 == NULL)
	{
		/* Set up the catalog file name.  Need a copy of it as the
		   new function will access CS_dtloc. */
		CS_stcpy (cs_DirP,cs_DhdnName);
		CS_stncp (catalog,cs_Dir,sizeof (catalog));

		/* Use it to build the DhdnToEtrf89 object. */
		csDhdnToEtrf89 = CSnewDhdnToEtrf89 (catalog);
		if (csDhdnToEtrf89 == NULL) goto error;
	}
	csDhdnToEtrf89Cnt += 1;
	return 0;

error:
	if (csDhdnToEtrf89 != NULL)
	{
		CSdeleteDhdnToEtrf89 (csDhdnToEtrf89);
		csDhdnToEtrf89 = NULL;
		csDhdnToEtrf89Cnt = 0;
	}
	return -1;
}
Beispiel #6
0
/**********************************************************************
**	st = CSn27a77Init ();
**********************************************************************/
int EXP_LVL7 CSn27a77Init (void)
{
	extern char *cs_DirP;
	extern char cs_Dir [];
	extern char cs_N27A77Name [];

	char catalog [MAXPATH];

	/* See if we already have a csNad27ToNad83 object.
	   Note, we can have such even if the count is zero. */
	if (csNad27ToAts77 == NULL)
	{
		/* Nope, we best create one. */
		CS_stcpy (cs_DirP,cs_N27A77Name);
		CS_stncp (catalog,cs_Dir,sizeof (catalog));

		csNad27ToAts77 = CSnewNad27ToAts77 (catalog);
		if (csNad27ToAts77 == NULL)
		{
			goto error;
		}
		csNad27ToAts77Cnt = 0;
	}
	csNad27ToAts77Cnt += 1;
	return 0;

error:
	if (csNad27ToAts77 != NULL)
	{
		CSdeleteNad27ToAts77 (csNad27ToAts77);
		csNad27ToAts77 = NULL;
	}
	csNad27ToAts77Cnt = 0;
	return -1;
}
Beispiel #7
0
/**********************************************************************
  The following function returns a list of the coordinate systems
  in the cache.
**********************************************************************/
void EXP_LVL1 CSbccDbg (char *results,int rsltSz)
{
	extern csThread struct csCscach_ *csCscachP;

	int need;
	char *cp;
	char *rsltPtr = results;
	cs_Register struct csCscach_ *ch_ptr;
	char myName [32];

	*results = '\0';
	if (csCscachP == NULL)
	{
		CS_stncp (results,"<none>",rsltSz);
	}
	else
	{
		rsltSz -= 1;
		for (ch_ptr = csCscachP;ch_ptr != NULL;ch_ptr = ch_ptr->next)
		{
			if (rsltSz > 0)
			{
				cp = myName;
				if (*results != '\0') *cp++ = ',';

				if (ch_ptr->cs_nam [0] == '\0')
				{
					cp = CS_stcpy (cp,"<none>");
				}
				else if (ch_ptr->cs_ptr != NULL)
				{
					cp = CS_stncp (cp,ch_ptr->cs_nam,sizeof (myName) - 1);
				}
				else
				{
					cp = CS_stcpy (cp,"<none>");
				}
				need = (int)strlen (myName);
				if (need > rsltSz) need = rsltSz;
				rsltPtr = CS_stncp (rsltPtr,myName,need + 1);
				rsltSz -= need;
			}
		}
	}
	return;
}
Beispiel #8
0
void EXP_LVL5 CSasciiToXml (char *xml,const char *ascii)
{
	const char *srcPtr;
	char *trgPtr;

	char cc;

	srcPtr = ascii;
	trgPtr = xml;
	while ((cc = *srcPtr++) != '\0')
	{
		if      (cc == '&' ) trgPtr = CS_stcpy (trgPtr,"&amp;");
		else if (cc == '<' ) trgPtr = CS_stcpy (trgPtr,"&lt;");
		else if (cc == '>' ) trgPtr = CS_stcpy (trgPtr,"&gt;");
		else if (cc == '"' ) trgPtr = CS_stcpy (trgPtr,"&quot;");
		else if (cc == '\'') trgPtr = CS_stcpy (trgPtr,"&apos;");
		else                 *trgPtr++ = cc;
	}
	*trgPtr = '\0';
	return;
}
Beispiel #9
0
/**********************************************************************
  The following function returns a list of the coordinate systems
  in the cache.
**********************************************************************/
void EXP_LVL1 CSbdcDbg (char *results,int rsltSz)
{
	extern csThread struct csDtcach_ *csDtcachP;

	int need;
	char *cp;
	char *rsltPtr = results;
	cs_Register struct csDtcach_ *ch_ptr;
	char myName [64];

	*results = '\0';
	if (csDtcachP == NULL)
	{
		CS_stncp (results,"<none>",rsltSz);
	}
	else
	{
		rsltSz -= 1;
		for (ch_ptr = csDtcachP;ch_ptr != NULL;ch_ptr = ch_ptr->next)
		{
			if (rsltSz > 0)
			{
				cp = myName;
				if (*results != '\0') *cp++ = ';';
				if (ch_ptr->dtc_ptr == NULL)
				{
					cp = CS_stcpy (cp,"<none>");
				}
				else
				{
					*cp++ = '<';
					cp = CS_stncp (cp,ch_ptr->dtc_ptr->srcKeyName,28);
					*cp++ = ':';
					*cp++ = ':';
					cp = CS_stncp (cp,ch_ptr->dtc_ptr->trgKeyName,28);
					*cp++ = '>';
					*cp = '\0';
				}
				need = (int)strlen (myName);
				if (need > rsltSz) need = rsltSz;
				rsltPtr = CS_stncp (rsltPtr,myName,need + 1);
				rsltSz -= need;
			}
		}
	}
	return;
}
Beispiel #10
0
/////////////////////////////////////////////////////////////////////////////
// CcsDataDir message handlers
void CcsDataDir::OnBtnDirbrwse() 
{
	int ii;
	CString newPath;
	DWORD options = OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR | OFN_SHAREAWARE;

	CS_stcpy (cs_DirP,cs_Csname);
	CFileDialog dataDir (TRUE,NULL,cs_Dir,options,"All Files (*.*)|*.*||",NULL);

	AfxMessageBox ("Windows does not provide a 'directory browser' as a 'common dialog'!  A 'file browser' dialog will next appear.  Use it to specify a directory by choosing a file (any file) in the desired directory.");
	INT_PTR st = dataDir.DoModal ();
	if (st == IDOK)
	{
		newPath = dataDir.GetPathName ();
		ii = newPath.ReverseFind (cs_DirsepC);
		if (ii >= 0)
		{
			m_DataDirectory = newPath.Left (ii);
			UpdateData (FALSE);
		}
	}
}
Beispiel #11
0
/******************************************************************************
	High Level Interface access functions.
*/
int EXP_LVL1 CS_geoidHgt (Const double ll84 [2],double *height)
{
	extern double cs_Mhuge;				/* -1.0E+32  */
	extern char cs_Dir [];
	extern char *cs_DirP;
	extern struct csGeoidHeight_ *csGeoidHeight;

	int status = -1;


	*height = cs_Mhuge;
	if (csGeoidHeight == NULL)
	{
		CS_stcpy (cs_DirP,cs_GEOID_NAME);
		csGeoidHeight = CSnewGeoidHeight (cs_Dir);
	}
	if (csGeoidHeight != NULL)
	{
		status = CScalcGeoidHeight (csGeoidHeight,height,ll84);
	}
	return status;
}
Beispiel #12
0
int EXP_LVL3 CSel2WktEx (char *bufr,size_t bufrSize,enum ErcWktFlavor flavor,const struct cs_Eldef_ *el_def,unsigned short flags)
{ 
	short mapWktNames;
	EcsMapSt csMapSt;
    EcsNameFlavor nmFlavor;
	Const char* kCp;
	double rcpFlattening = 0.0;

	char wktEllipsoidName [96];
	char cTemp [1024];

   	CS_stcpy (csErrnam,"CSel2WktEx");
	if (bufr == 0)
	{
	    CS_erpt (cs_INV_ARG1);
	    return -(cs_Error);
	}
	if (bufrSize < 1)
	{
	    CS_erpt (cs_INV_ARG2);
	    return -(cs_Error);
	}

    *bufr = '\0';
    nmFlavor = csWktFlvrToCsMapFlvr (flavor);
    mapWktNames = ((flags & cs_WKTFLG_MAPNAMES) != 0);

	if (el_def->flat != 0.0)
	{
		rcpFlattening = cs_One / el_def->flat;
	}
	else
	{
		/* The real value is infinity, but that this a rather awkward number
		   to deal with.  So, we use zero to indicate a sphere.  Quite frankly,
		   the specification (if there really is one) for WKT does not handle
		   spheres at all.  We should probably just bag anything references to
		   a spehere. */
        rcpFlattening = cs_Zero;
	}

    if (!mapWktNames)
    {
        kCp = el_def->key_nm;
        if (flavor == wktFlvrEsri || flavor == wktFlvrOracle)
        {
            kCp = el_def->name;
        }
        CS_stncp (wktEllipsoidName,kCp,sizeof (wktEllipsoidName));
    }
    else
    {
	    csMapSt = csMapNameToNameC (csMapEllipsoidKeyName,wktEllipsoidName,
	                                                      sizeof (wktEllipsoidName),
	                                                      nmFlavor,
	                                                      csMapFlvrAutodesk,
	                                                      el_def->key_nm);
	    if (csMapSt != csMapOk)
	    {
		    CS_stncp (wktEllipsoidName,el_def->key_nm,sizeof (wktEllipsoidName));
	    }
	}
	sprintf (cTemp,"SPHEROID[\"%s\",%.3f,%.8f]",wktEllipsoidName,el_def->e_rad,rcpFlattening);
	CS_stncp (bufr,cTemp,(int)bufrSize);
	return 0;
}
Beispiel #13
0
int EXP_LVL7 CS_tmpfn (char *tmp_fnm)

{
	extern char cs_Dir [];
	extern char *cs_DirP;

	char cc_save;

	int count;

	char *cp;

	/* Establish the drive and the directory. */

	cc_save = *cs_DirP;
	*cs_DirP = '\0';
	cp = CS_stcpy (tmp_fnm,cs_Dir);
	*cs_DirP = cc_save;

	/* Add a file name. */

	cp = CS_stcpy (cp,"DEL_ME.$");

	/* Add an extension which will make this file unique in the
	   directory.  Hopefully, we will never need to iterate
	   more than once since tempoary files should always be
	   deleted after their use. */

	count = 0;
	strcpy (unique,"ZZ");
	do
	{
		count++;
		if (count >= 676)
		{
			CS_erpt (cs_TMPFN_MAXED);
			return (-1);
		}

		/* Bump the unique portion of the name by one, wrapping
		   arround if necessary. */

		if (unique [1] >= 'Z')
		{
			unique [1] = 'A';
			if (unique [0] >= 'Z')
			{
				unique [0] = 'A';
			}
			else unique [0]++;
		} else unique [1]++;

		/* Add the unique two character name generated above
		   to the result. */
		
		(void) CS_stcpy (cp,unique);

		/* We continue generating names until we find one
		   that doesn't exist.  In this case, access
		   does just what we need it to. */

	} while (CS_access (tmp_fnm,0) == 0);

	/* If we get here, we have made a unique name. */

	return (0);
}
Beispiel #14
0
int main (int argc,char *argv [])
{
	extern char cs_Dir [];
	extern char* cs_DirP;
	extern char cs_Csname [];
	extern char cs_Dtname [];
	extern char cs_Elname [];

	int cmpVal, iTmp;
	int csDiffCnt, dtDiffCnt, elDiffCnt;
	int dummy;
	int nlFlag;

	csFILE *wasStrm, *isStrm;

	char wasDir [MAXPATH];
	char isDir [MAXPATH];
	char errorText [260];

	struct cs_Csdef_ wasCsDef, isCsDef;
	struct cs_Dtdef_ wasDtDef, isDtDef;
	struct cs_Eldef_ wasElDef, isElDef;

	csDiffCnt = 0;
	dtDiffCnt = 0;
	elDiffCnt = 0;

	if (argc != 3) Usage ();

	strncpy (wasDir,argv [1],sizeof (wasDir));
	wasDir [sizeof (wasDir) - 1] = '\0';

	strncpy (isDir,argv [2],sizeof (isDir));
	isDir [sizeof (isDir) - 1] = '\0';

	if (CS_altdr (wasDir) != 0)
	{
		printf ("%s file not found in %s directory.\n",cs_Csname,wasDir);
		Usage ();
	}
	CS_stcpy (cs_DirP,cs_Dtname);
	if (CS_access (cs_Dir,4) != 0)
	{
		printf ("%s file not found in %s directory.\n",cs_Dtname,wasDir);
		Usage ();
	}
	CS_stcpy (cs_DirP,cs_Elname);
	if (CS_access (cs_Dir,4) != 0)
	{
		printf ("%s file not found in %s directory.\n",cs_Elname,wasDir);
		Usage ();
	}

	if (CS_altdr (isDir) != 0)
	{
		printf ("%s file not found in %s directory.\n",cs_Csname,isDir);
		Usage ();
	}
	CS_stcpy (cs_DirP,cs_Dtname);
	if (CS_access (cs_Dir,4) != 0)
	{
		printf ("%s file not found in %s directory.\n",cs_Dtname,isDir);
		Usage ();
	}
	CS_stcpy (cs_DirP,cs_Elname);
	if (CS_access (cs_Dir,4) != 0)
	{
		printf ("%s file not found in %s directory.\n",cs_Elname,isDir);
		Usage ();
	}

	/* Ok, we're ready to do our thing.  Do coordinate systems first. */
	CS_altdr (wasDir);											/*lint !e534 */
	wasStrm = CS_csopn (_STRM_BINRD);
	if (wasStrm == NULL)
	{
		printf ("Open of %s in the 'WAS' directory failed.\n",cs_Csname);
		Usage ();
	}

	CS_altdr (isDir);											/*lint !e534 */
	isStrm = CS_csopn (_STRM_BINRD);
	if (isStrm == NULL)
	{
		printf ("Open of %s in the 'IS' directory failed.\n",cs_Csname);
		Usage ();
	}

	/* Now, we loop through the dictionaries.  In this module, we simply
	   compare key names, looking for new definitions, or deleted
	   definitions.  When we have definitions with the same name, we call
	   CS_csDiff to report any differences.

	   First, we prime the pump. */
	iTmp = CS_csrd (wasStrm,&wasCsDef,&dummy);
	if (iTmp < 0)
	{
		CS_errmsg (errorText,sizeof (errorText));
		printf ("%s\n",errorText);
		Usage ();
	}
	if (iTmp == 0)
	{
		printf ("'WAS' coordinate system dictionary is empty.\n");
		Usage ();
	}

	iTmp = CS_csrd (isStrm,&isCsDef,&dummy);
	if (iTmp < 0)
	{
		CS_errmsg (errorText,sizeof (errorText));
		printf ("%s\n",errorText);
		Usage ();
	}
	if (iTmp == 0)
	{
		printf ("'IS' coordinate system dictionary is empty.\n");
		Usage ();
	}

	nlFlag = FALSE;
	while (TRUE)
	{
		cmpVal = CS_stricmp (wasCsDef.key_nm,isCsDef.key_nm);
		if (cmpVal < 0)
		{
			if (nlFlag)
			{
				printf ("\n");
				nlFlag = FALSE;
			}
			printf ("%s deleted from coordinate system dictionary!!!\n",wasCsDef.key_nm);
			csDiffCnt += 1;
		}
		else if (cmpVal > 0)
		{
			if (nlFlag)
			{
				printf ("\n");
				nlFlag = FALSE;
			}
			printf ("%s added to coordinate system dictionary!!!\n",isCsDef.key_nm);
			csDiffCnt += 1;
		}
		else
		{
			/* Normal case, we have two definitions with the same name, */
			iTmp = CS_csDiff (stdout,&wasCsDef,&isCsDef);
			if (iTmp != 0)
			{
				csDiffCnt += 1;
				nlFlag = TRUE;
			}
		}
		if (cmpVal >= 0)
		{
			iTmp = CS_csrd (isStrm,&isCsDef,&dummy);
			if (iTmp < 0)
			{
				CS_errmsg (errorText,sizeof (errorText));
				printf ("%s\n",errorText);
				Usage ();
			}
			if (iTmp == 0)
			{
				CS_fclose (isStrm);
				isStrm = NULL;
				break;
			}
		}
		if (cmpVal <= 0)
		{
			iTmp = CS_csrd (wasStrm,&wasCsDef,&dummy);
			if (iTmp < 0)
			{
				CS_errmsg (errorText,sizeof (errorText));
				printf ("%s\n",errorText);
				Usage ();
			}
			if (iTmp == 0)
			{
				CS_fclose (wasStrm);
				wasStrm = NULL;
				break;
			}
		}
	}

	/* Finish up properly. */
	nlFlag = TRUE;
	while (wasStrm != NULL)
	{
		iTmp = CS_csrd (wasStrm,&wasCsDef,&dummy);
		if (iTmp > 0)
		{
			if (nlFlag)
			{
				printf ("\n");
				nlFlag = FALSE;
			}
			printf ("%s deleted from coordinate system dictionary!!!\n",wasCsDef.key_nm);
			csDiffCnt += 1;
		}
		else if (iTmp == 0)
		{
			CS_fclose (wasStrm);
			wasStrm = NULL;
		}
		else
		{
			CS_errmsg (errorText,sizeof (errorText));
			printf ("%s\n",errorText);
			Usage ();
		}
	}
	while (isStrm != NULL)
	{
		iTmp = CS_csrd (isStrm,&wasCsDef,&dummy);
		if (iTmp > 0)
		{
			if (nlFlag)
			{
				printf ("\n");
				nlFlag = FALSE;
			}
			printf ("%s added to coordinate system dictionary!!!\n",isCsDef.key_nm);
			csDiffCnt += 1;
		}
		else if (iTmp == 0)
		{
			CS_fclose (isStrm);
			isStrm = NULL;
		}
		else
		{
			CS_errmsg (errorText,sizeof (errorText));
			printf ("%s\n",errorText);
			Usage ();
		}
	}
	if (csDiffCnt == 0)
	{
		printf ("\nCoordinate system dictionaries are the same.\n\n");
	}
	else
	{
		printf ("\n%d coordinate systems are different.\n\n",csDiffCnt);
	}

	/* Done with the coordinate system dictionary. Same as above, but with the
	   Datum Dictionary this time. */
	CS_altdr (wasDir);											/*lint !e534 */
	wasStrm = CS_dtopn (_STRM_BINRD);
	if (wasStrm == NULL)
	{
		printf ("Open of %s in the 'WAS' directory failed.\n",cs_Dtname);
		Usage ();
	}

	CS_altdr (isDir);											/*lint !e534 */
	isStrm = CS_dtopn (_STRM_BINRD);
	if (isStrm == NULL)
	{
		printf ("Open of %s in the 'IS' directory failed.\n",cs_Dtname);
		Usage ();
	}

	iTmp = CS_dtrd (wasStrm,&wasDtDef,&dummy);
	if (iTmp < 0)
	{
		CS_errmsg (errorText,sizeof (errorText));
		printf ("%s\n",errorText);
		Usage ();
	}
	if (iTmp == 0)
	{
		printf ("'WAS' datum dictionary is empty.\n");
		Usage ();
	}

	iTmp = CS_dtrd (isStrm,&isDtDef,&dummy);
	if (iTmp < 0)
	{
		CS_errmsg (errorText,sizeof (errorText));
		printf ("%s\n",errorText);
		Usage ();
	}
	if (iTmp == 0)
	{
		printf ("'IS' datum dictionary is empty.\n");
		Usage ();
	}

	nlFlag = FALSE;
	while (TRUE)
	{
		cmpVal = CS_stricmp (wasDtDef.key_nm,isDtDef.key_nm);
		if (cmpVal < 0)
		{
			if (nlFlag)
			{
				printf ("\n");
				nlFlag = FALSE;
			}
			printf ("%s deleted from datum dictionary!!!\n",wasDtDef.key_nm);
			dtDiffCnt += 1;
		}
		else if (cmpVal > 0)
		{
			if (nlFlag)
			{
				printf ("\n");
				nlFlag = FALSE;
			}
			printf ("%s added to datum dictionary!!!\n",isDtDef.key_nm);
			dtDiffCnt += 1;
		}
		else
		{
			/* Normal case, we have two definitions with the same name, */
			iTmp = CS_dtDiff (stdout,&wasDtDef,&isDtDef);
			if (iTmp != 0)
			{
				dtDiffCnt += 1;
				nlFlag = TRUE;
			}
		}
		if (cmpVal >= 0)
		{
			iTmp = CS_dtrd (isStrm,&isDtDef,&dummy);
			if (iTmp < 0)
			{
				CS_errmsg (errorText,sizeof (errorText));
				printf ("%s\n",errorText);
				Usage ();
			}
			if (iTmp == 0)
			{
				CS_fclose (isStrm);
				isStrm = NULL;
				break;
			}
		}
		if (cmpVal <= 0)
		{
			iTmp = CS_dtrd (wasStrm,&wasDtDef,&dummy);
			if (iTmp < 0)
			{
				CS_errmsg (errorText,sizeof (errorText));
				printf ("%s\n",errorText);
				Usage ();
			}
			if (iTmp == 0)
			{
				CS_fclose (wasStrm);
				wasStrm = NULL;
				break;
			}
		}
	}

	nlFlag = TRUE;
	while (wasStrm != NULL)
	{
		iTmp = CS_dtrd (wasStrm,&wasDtDef,&dummy);
		if (iTmp > 0)
		{
			if (nlFlag)
			{
				printf ("\n");
				nlFlag = FALSE;
			}
			printf ("%s deleted from datum dictionary!!!\n",wasDtDef.key_nm);
			dtDiffCnt += 1;
		}
		else if (iTmp == 0)
		{
			CS_fclose (wasStrm);
			wasStrm = NULL;
		}
		else
		{
			CS_errmsg (errorText,sizeof (errorText));
			printf ("%s\n",errorText);
			Usage ();
		}
	}
	while (isStrm != NULL)
	{
		iTmp = CS_dtrd (isStrm,&wasDtDef,&dummy);
		if (iTmp > 0)
		{
			if (nlFlag)
			{
				printf ("\n");
				nlFlag = FALSE;
			}
			printf ("%s added to datum dictionary!!!\n",isDtDef.key_nm);
			dtDiffCnt += 1;
		}
		else if (iTmp == 0)
		{
			CS_fclose (isStrm);
			isStrm = NULL;
		}
		else
		{
			CS_errmsg (errorText,sizeof (errorText));
			printf ("%s\n",errorText);
			Usage ();
		}
	}
	if (dtDiffCnt == 0)
	{
		printf ("\nDatum dictionaries are the same.\n\n");
	}
	else
	{
		printf ("\n%d datum definitions are different.\n\n",dtDiffCnt);
	}

	/* Ellipsoid Dictionary */
	CS_altdr (wasDir);											/*lint !e534 */
	wasStrm = CS_elopn (_STRM_BINRD);
	if (wasStrm == NULL)
	{
		printf ("Open of %s in the 'WAS' directory failed.\n",cs_Elname);
		Usage ();
	}

	CS_altdr (isDir);											/*lint !e534 */
	isStrm = CS_elopn (_STRM_BINRD);
	if (isStrm == NULL)
	{
		printf ("Open of %s in the 'IS' directory failed.\n",cs_Elname);
		Usage ();
	}

	iTmp = CS_elrd (wasStrm,&wasElDef,&dummy);
	if (iTmp < 0)
	{
		CS_errmsg (errorText,sizeof (errorText));
		printf ("%s\n",errorText);
		Usage ();
	}
	if (iTmp == 0)
	{
		printf ("'WAS' ellipsoid dictionary is empty.\n");
		Usage ();
	}

	iTmp = CS_elrd (isStrm,&isElDef,&dummy);
	if (iTmp < 0)
	{
		CS_errmsg (errorText,sizeof (errorText));
		printf ("%s\n",errorText);
		Usage ();
	}
	if (iTmp == 0)
	{
		printf ("'IS' ellipsoid dictionary is empty.\n");
		Usage ();
	}

	nlFlag = FALSE;
	while (TRUE)
	{
		cmpVal = CS_stricmp (wasElDef.key_nm,isElDef.key_nm);
		if (cmpVal < 0)
		{
			if (nlFlag)
			{
				printf ("\n");
				nlFlag = FALSE;
			}
			printf ("%s deleted from ellipsoid dictionary!!!\n",wasElDef.key_nm);
			elDiffCnt += 1;
		}
		else if (cmpVal > 0)
		{
			if (nlFlag)
			{
				printf ("\n");
				nlFlag = FALSE;
			}
			printf ("%s added to ellipsoid dictionary!!!\n",isElDef.key_nm);
			elDiffCnt += 1;
		}
		else
		{
			/* Normal case, we have two definitions with the same name, */
			iTmp = CS_elDiff (stdout,&wasElDef,&isElDef);
			if (iTmp != 0)
			{
				elDiffCnt += 1;
				nlFlag = TRUE;
			}
		}
		if (cmpVal >= 0)
		{
			iTmp = CS_elrd (isStrm,&isElDef,&dummy);
			if (iTmp < 0)
			{
				CS_errmsg (errorText,sizeof (errorText));
				printf ("%s\n",errorText);
				Usage ();
			}
			if (iTmp == 0)
			{
				CS_fclose (isStrm);
				isStrm = NULL;
				break;
			}
		}
		if (cmpVal <= 0)
		{
			iTmp = CS_elrd (wasStrm,&wasElDef,&dummy);
			if (iTmp < 0)
			{
				CS_errmsg (errorText,sizeof (errorText));
				printf ("%s\n",errorText);
				Usage ();
			}
			if (iTmp == 0)
			{
				CS_fclose (wasStrm);
				wasStrm = NULL;
				break;
			}
		}
	}

	nlFlag = TRUE;
	while (wasStrm != NULL)
	{
		iTmp = CS_elrd (wasStrm,&wasElDef,&dummy);
		if (iTmp > 0)
		{
			if (nlFlag)
			{
				printf ("\n");
				nlFlag = FALSE;
			}
			printf ("%s deleted from ellipsoid dictionary!!!\n",wasElDef.key_nm);
			elDiffCnt += 1;
		}
		else if (iTmp == 0)
		{
			CS_fclose (wasStrm);
			wasStrm = NULL;
		}
		else
		{
			CS_errmsg (errorText,sizeof (errorText));
			printf ("%s\n",errorText);
			Usage ();
		}
	}
	while (isStrm != NULL)
	{
		iTmp = CS_elrd (isStrm,&wasElDef,&dummy);
		if (iTmp > 0)
		{
			if (nlFlag)
			{
				printf ("\n");
				nlFlag = FALSE;
			}
			printf ("%s added to ellipsoid dictionary!!!\n",isElDef.key_nm);
			dtDiffCnt += 1;
		}
		else if (iTmp == 0)
		{
			CS_fclose (isStrm);
			isStrm = NULL;
		}
		else
		{
			CS_errmsg (errorText,sizeof (errorText));
			printf ("%s\n",errorText);
			Usage ();
		}
	}
	if (elDiffCnt == 0)
	{
		printf ("\nEllipsoid dictionaries are the same.\n\n");
	}
	else
	{
		printf ("\n%d ellipsoid definitions are different.\n\n",elDiffCnt);
	}

	return 0;
}
Beispiel #15
0
int CSjapanQ  (struct csGeodeticXfromParmsFile_* fileParms,Const char* dictDir,int err_list [],int list_sz)
{
	extern char cs_DirsepC;
	extern char cs_ExtsepC;

	int err_cnt;

	char *cp;
	csFILE* strm;

	char meshCode [] = "Meshcode";
	char line1Buffer [256];
	char line2Buffer [256];
	char line3Buffer [256];
	char pathBuffer [MAXPATH];

	cp = fileParms->fileName;
	if (*cp == '.' && *(cp + 1) == cs_DirsepC)
	{
		CS_stncp (pathBuffer,dictDir,sizeof (pathBuffer));
		CS_stncat (pathBuffer,cp,MAXPATH);
	}
	else
	{
		CS_stncp (pathBuffer,cp,MAXPATH);
	}

	/* We will return (err_cnt + 1) below. */
	err_cnt = -1;
	if (err_list == NULL) list_sz = 0;

	/* Verify that the file exists and that the format appears to be correct. */
	strm = CS_fopen (pathBuffer,_STRM_TXTRD);
	if (strm != NULL)
	{
		CS_fgets (line1Buffer,sizeof (line1Buffer),strm);	
		CS_fgets (line2Buffer,sizeof (line2Buffer),strm);	
		CS_fgets (line3Buffer,sizeof (line3Buffer),strm);	
		CS_fclose (strm);
		strm = NULL;

		if (!CS_stristr (line1Buffer,meshCode) &&
			!CS_stristr (line2Buffer,meshCode) &&
			!CS_stristr (line3Buffer,meshCode))
		{
			/* The pohrase meshcode was not found anywhere on the first three
			   lines, we assume this is not a ".par" file. */
			if (++err_cnt < list_sz) err_list [err_cnt] = cs_DTQ_FORMAT;
		}
	}
	else
	{
		//the txt file didn't exist - so, check whether at least the binary file does
		cp = strrchr (pathBuffer,cs_ExtsepC);
		if (cp == NULL) 
		{
			if (++err_cnt < list_sz) err_list [err_cnt] = cs_DTQ_FILE;
		}
		else
		{
			CS_stcpy ((cp + 1),"_par");
			if (0 != CS_access(pathBuffer, 4))
			{
				if (++err_cnt < list_sz) err_list [err_cnt] = cs_DTQ_FILE;
			}
		}
	}

	return (err_cnt + 1);
}
Beispiel #16
0
/* This function creates a binary version of the Jgd2k file if it doesn't
   exist, or if the date on the binary file is older than or equal to
   that of the primary text file.  Note, that this function uses the path name
   in the provided object, and modifies it to point to the binary file which
   is then created if necessary.

   This function is implemented as records in the ASCII text file may not be
   of fixed length, there can be a million of them, and there is no guarantee
   that the records in the text file will be properly sorted.  The binary
   file enables random access to the data file for decent performance without
   eating up 12MB of RAM. */
int CSmakeBinaryJgd2kFile (struct cs_Japan_* thisPtr)
{
	extern char cs_ExtsepC;
	extern char csErrnam [];
	extern double cs_Zero;

	int st;
	cs_Time_ aTime, bTime;

	size_t wrCnt;

	char *cp1, *cp2;
	csFILE *aStrm, *bStrm;

	long32_t tempL;
	long32_t dblFrmt;
	ulong32_t meshCode;

	double lngTmp, latTmp;
	double mesh_ll [2];

	char lineBufr [128];
	char binaryPath [MAXPATH];

	struct csJgd2kGridRecord_ gridRec;
	struct csJgd2kGridRecord_ minRec;
	struct csJgd2kGridRecord_ maxRec;

	/* We will write two records to the file with bogus mesh codes.  These
	   records will carry the minimum (i.e. southwest) longitude and latitude
	   and the maximum (i.e. northeast) longitude and latitude of the data in
	   the file.  This is an attempt to make the file format something which
	   does not inherently imply applicability to Japanese geography.
	   
	   The bogus mesh codes were devised such that the min/max will be the
	   first two records in the file, thus easily accessible.  For these two
	   special records, the deltaLng and DeltaLat fields carry absolute 
	   longitude and latitude in seconds. */
	minRec.meshCode = 1UL;
	minRec.deltaLat = (long32_t)( 90 * 3600);
	minRec.deltaLng = (long32_t)(180 * 3600);
	maxRec.meshCode = 2UL;
	maxRec.deltaLat = (long32_t)( -90 * 3600);
	maxRec.deltaLng = (long32_t)(-180 * 3600);

	/* Prepare for an error of some sort. */
	aStrm = bStrm = NULL;
	lngTmp = latTmp = cs_Zero;

	/* Manufacture the name of the binary file. */
	CS_stncp (binaryPath,thisPtr->filePath,sizeof (binaryPath));
	cp1 = strrchr (binaryPath,cs_ExtsepC);
	if (cp1 == NULL) 
	{
		CS_stncp (csErrnam,thisPtr->filePath,MAXPATH);
		CS_erpt (cs_DTC_FILE);
		goto error;
	}
	CS_stcpy ((cp1 + 1),"_par");

	bTime = CS_fileModTime (binaryPath);
	/* Build a new binary file only if it doesn't exist yet. */
	if (0 == bTime)
	{
		/* Determine the last modification time for the two files.  Zero time value
		   means the file does not exist. */
		aTime = CS_fileModTime (thisPtr->filePath);
		if (aTime == 0)
		{
			/* The indicated source file does not exist, not uncommon among the
			   error conditions possible. */
			CS_stncp (csErrnam,thisPtr->filePath,MAXPATH);
			CS_erpt (cs_DTC_FILE);
			goto error;
		}

		/* Here to create a, possibly new, binary version of the Jgd2k file,
		   typically named "TKY2JGD.par".  To follow the general design
		   theme, we assume there can be several files, and there is no fixed
		   name for any of the files.  At this particular point, of course,
		   we're only dealing with one file, the file whose name was provided.
		   
		   We write one csJgd2kGridRecord structure	for each line of text that
		   we read.   Of course, we need to skip the first two lines (usually)
		   in the file as they are of the mets-data variety. */
		aStrm = CS_fopen (thisPtr->filePath,_STRM_TXTRD);
		if (aStrm == NULL)
		{
			/* This could happen if the file exists, but for some reason we
			   are denied permission to read the file.*/
			CS_stncp (csErrnam,thisPtr->filePath,MAXPATH);
			CS_erpt (cs_DTC_FILE);
			goto error;
		}

		/* The mode of the following open will truncate any existing file, and
		   create a new binary file if necessary. */
		bStrm = CS_fopen (binaryPath,_STRM_BINWR);
		if (bStrm == NULL)
		{
			CS_stncp (csErrnam,thisPtr->filePath,MAXPATH);
			CS_erpt (cs_FL_OPEN);
			goto error;
		}

		/* If we're still here, we can copy the file, converting it to binary
		   form as we do.  While doing so, we'll convert each mesh code to
		   latitude and longitude form and accumulate an estimate of the
		   coverage of the file. */
		while (CS_fgets (lineBufr,sizeof (lineBufr),aStrm) != NULL)
		{
			/* Parse the information is in a record. */
			meshCode = CS_strtoul (lineBufr,&cp1,10);
			
			/* The first two lines of the files we've seen contain labels and
			   other data.  We use the following to filter these out.  This may
			   need to be improved should new versions of the file include some
			   other form of header. */
			if (meshCode == 0 || meshCode == 0xffffffffUL) continue;
			
			/* Accumulate a bounding box (or minimum and maximum as us old
			   farts used to call it) so we have a rough estimate of the
			   coverage of the file. */
			CSjpnMeshCodeToLl (mesh_ll,meshCode);			
			if (mesh_ll [LNG] < -180.0 || mesh_ll [LNG] > 180.0 ||
				mesh_ll [LAT] <  -90.0 || mesh_ll [LAT] > 90.0)
			{
				/* Bogus mesh code.  We could consider this to be meta-data
				   that slipped through the code immediately above, or that
				   the file is invalid.  For now, we consider it to be the
				   latter:  The file is not a validly formatted data file. */
				CS_erpt (cs_INV_FILE);
				goto error;
			}
			tempL = (long32_t)(mesh_ll [LNG] * 3600 + 0.01);
			if (tempL < minRec.deltaLng) minRec.deltaLng = tempL; 
			if (tempL > maxRec.deltaLng) maxRec.deltaLng = tempL; 
			tempL = (long32_t)(mesh_ll [LAT] * 3600 + 0.01);
			if (tempL < minRec.deltaLat) minRec.deltaLat = tempL; 
			if (tempL > maxRec.deltaLat) maxRec.deltaLat = tempL; 

			/* Separate the two data values.  We avoid strtod as it is
			   locale dependent and the data file is not. */			
			while (*cp1 == ' ') cp1++;
			cp2 = strchr (cp1,' ');
			*cp2++ = '\0';
			while (*cp2 == ' ') cp2++;

			dblFrmt = CSatof (&latTmp,cp1,'.',',',':');
			if (dblFrmt >= 0)
			{
				dblFrmt = CSatof (&lngTmp,cp2,'.',',',':');
			}
			if (dblFrmt < 0)
			{
				CS_erpt (cs_INV_FILE);
				goto error;
			}

			/* Build a new record in the array. */
			gridRec.meshCode = meshCode;
			
			/* NTO 30 Oct 2008, Trac # 13
			   The following was necessiatated by Linux.  It appears that on the
			   Linux platform (or some of them, anyway), the rounding of doubles
			   (especially negative ones) is different than what you will see on
			   WIN32 platforms.  Which one is correct is of no concern to me,
			   only that they are different. */
			latTmp *= 100000.0;
			latTmp += (latTmp >= 0.0) ? 0.1 : -0.1;
			lngTmp *= 100000.0;
			lngTmp += (lngTmp >= 0.0) ? 0.1 : -0.1;
			/* End Linux fix, Trac #13 */

			gridRec.deltaLat = (long32_t)(latTmp);
			gridRec.deltaLng = (long32_t)(lngTmp);
			wrCnt = CS_fwrite (&gridRec,sizeof (gridRec),1,bStrm);
			if (wrCnt != 1)
			{
				CS_erpt (cs_IOERR);
				goto error;
			}
		}

		/* If we're still here, we write minRec and maxRec to the file so we
		   have a record of the coverage of the file. */
		wrCnt =	CS_fwrite (&minRec,sizeof (minRec),1,bStrm);
		if (wrCnt != 1)
		{
			CS_erpt (cs_IOERR);
			goto error;
		}
		wrCnt = CS_fwrite (&maxRec,sizeof (maxRec),1,bStrm);
		if (wrCnt != 1)
		{
			CS_erpt (cs_IOERR);
			goto error;
		}

		/* Close the file streams.  We're going to open the binary file back
		   up immediately, but have found this redundant close and open to
		   produce more reliable operation cross platforms. */
		CS_fclose (aStrm);
		aStrm = NULL;
		st = CS_fclose (bStrm);
		bStrm = NULL;

		/* OK, we need to sort the file by mesh codes so we can use a binary
		   search algorithm on it.  This should also cause the min/max records
		   to end up being the first two records in the file. This is very
		   convenient.

		   Note that the position of any one record in the file with respect
		   to any other record in the file is immaterial in this file format.
		   Thus, we can reorder the file any way we want to.  The original
		   code was written in the Windows 95 era, so the current scheme may
		   look rather dumb.  Nevertheless, it works and I have no motivation
		   to fix it. */
		bStrm = CS_fopen (binaryPath,_STRM_BINUP);
		if (bStrm == NULL)
		{
			CS_stncp (csErrnam,binaryPath,MAXPATH);
			CS_erpt (cs_FL_OPEN);
			goto error;
		}
		st = CS_ips (bStrm,sizeof (gridRec),0L,(CMPFUNC_CAST)CScompareJgd2kGridRecord);
		CS_fclose (bStrm);
		bStrm = NULL;
		if (st < 0) goto error;
		if (st == 1) st = csGRIDI_ST_OK;	/* CS_ips returns 1 for success, for historical reasons. */

		/* OK, now we're really done. */
	}

	/* If all that was done successfully, we change the name of
	   the file and return success. */
	CS_stncp (thisPtr->filePath,binaryPath,sizeof (thisPtr->filePath));
	return csGRIDI_ST_OK;
error:
	if (aStrm != NULL)
	{
		CS_fclose (aStrm);
		aStrm = NULL;
	}
	if (bStrm != NULL)
	{
		CS_fclose (bStrm);
		bStrm = NULL;
	}
	return csGRIDI_ST_SYSTEM;
}
Beispiel #17
0
int EXP_LVL3 CScs2WktEx (char *csWktBufr,size_t bufrSize,enum ErcWktFlavor flavor,const struct cs_Csdef_ *cs_def,const struct cs_Dtdef_ *dt_def,const struct cs_Eldef_ *el_def,unsigned short flags)
{
	extern double cs_One;
	extern double cs_K90;
	extern double cs_Degree;
	extern char csErrnam [];
	extern struct cs_Prjtab_ cs_Prjtab [];

	int status;
	short prjCode;

	double tmpDbl;
	double primeMer;
	double unitFactor;

	const char *kCp;
	const char *prjNmPtr;

	const char *prmNmFalseEasting;
	const char *prmNmFalseNorthing;
	const char *prmNmScaleFactor;
	const char *prmNmCentralMeridian;
	const char *prmNmLatitudeOfOrigin;
	const char *prmNmStandardParallel1;
	const char *prmNmStandardParallel2;
	const char *prmNmYAxisAzimuth;
	const char *prmNmAzimuth;
	const char *prmNmLongitudeOfCenter;
	const char *prmNmLatitudeOfCenter;
	const char *prmNmLongitudeOf1stPoint;
	const char *prmNmLatitudeOf1stPoint;
	const char *prmNmLongitudeOf2ndPoint;
	const char *prmNmLatitudeOf2ndPoint;
	const char *prmNmLatitudeOfStdParall;

	struct cs_Dtdef_ *dtDefPtr;
	struct cs_Prjtab_ *prjPtr;

	char refDtmName [24];
	char baseName [24];
	char cTemp [64];

	char datmWkt [512];
	char pmerWkt [512];
	char geogWkt [512];
	char parmWkt [512];
	char unitWkt [128];
	char projWkt [1024];
	char geoAxis [1024];
	char prjAxis [1024];
	char geoTranWkt [1024];
	char projection [64];
	char gcsName [128];
	char dtmName [128];
	char csysWktName [96];
	
	status = 0;
	refDtmName [0] = '\0';
	dtDefPtr = 0;

	if (cs_def == 0)
	{
		CS_stncp (csErrnam,"CS_cs2Wkt:1",MAXPATH);
		CS_erpt (cs_ISER);
		goto error;
	}

	/* Make sure we have a datum pointer. */
	if (dt_def == NULL)
	{
		/* The calling application did not provide a specific datum definition.
		   We use the datum name in the Coordinate System definition to obtain
		   a definition fomr the dictionary. */
		if (cs_def->dat_knm [0] == '\0')
		{
			/* Oops!!! No datum definition in the coordinate system definition.
			   If we were to output something special for a cartographic definition,
			   i.e. a coordinate system referenced directly to an ellipsoid, we
			   would do that here. */
			CS_erpt (cs_NO_REFERNCE);
			goto error;
		}
		
		/* We need to free this definition, we stash it in a new pointer variable. */
		dtDefPtr = CS_dtdef (cs_def->dat_knm);
		if (dtDefPtr == NULL)
		{
			/* If the coordinate system definition came from the dictionary,
			   this shouldn't happen.  If the application got the cs_Csdef_
			   data from somewhere else, it is possible. */
			CS_erpt (cs_NO_REFERNCE);
			goto error;
		}
		dt_def = dtDefPtr;
	}
	
	if (el_def != 0)
	{
		if (CS_stricmp (dt_def->ell_knm,el_def->key_nm))
		{
			CS_erpt (cs_WKT_INCNSIST);
			goto error;
		}
	}

	/* Locate the projection in the projection table.  We need this for access
	   to the flag word for this projection. */
	for (prjPtr = cs_Prjtab;prjPtr->code != cs_PRJCOD_END;prjPtr += 1)
	{
		if (!strcmp (cs_def->prj_knm,prjPtr->key_nm)) break;
	}
	if (prjPtr->code == cs_PRJCOD_END)
	{
		CS_erpt (cs_UNKWN_PROJ);
		goto error;
	}
	prjCode = prjPtr->code;

	prjNmPtr = 0;
	if (prjCode == cs_PRJCOD_SWISS && (flavor == wktFlvrEsri || flavor == wktFlvrOracle))
	{
		prjNmPtr = CSwktPrjCode2Name (cs_PRJCOD_RSKEW,flavor);
	}
	else if (prjCode == cs_PRJCOD_LMTAN)
	{
		prjNmPtr = CSwktPrjCode2Name (cs_PRJCOD_LM1SP,flavor);
	}
	else if (prjPtr->code == cs_PRJCOD_UNITY)
	{
		prjNmPtr = "LL";
	}
	else
	{
		prjNmPtr = CSwktPrjCode2Name (prjCode,flavor);
	}
	if (prjNmPtr == 0 || *prjNmPtr == '\0')
	{
		/* This projection is not supported by this flavor of WKT. */
		CS_stncp (csErrnam,prjPtr->descr,MAXPATH);
		CS_erpt (cs_WKT_PRJSUPRT);
		goto error;
	}

	/* Locate the datum definition, if there is one.  We can't do anything
	   that isn't referenced to a datum. */
	if (dt_def == NULL)										/*lint !e774 */
	{
		/* The calling application did not provide a specific deatum definition.
		   We use the datum name in the Coordinate System definition to obtain
		   a definition fomr the dictionary. */
		if (cs_def->dat_knm [0] == '\0')
		{
			/* Oops!!! No datum definition in the coordinate system definition.
			   If we were to output something special for a cartographic definition,
			   i.e. a coordinate system referenced directly to an ellipsoid, we
			   would do that here. */
			CS_erpt (cs_NO_REFERNCE);	
			goto error;
		}
		dtDefPtr = CS_dtdef (cs_def->dat_knm);
		if (dtDefPtr == NULL)
		{
			/* If the coordinate system definition came from the dictionary,
			   this shouldn't happen.  If the application got the cs_Csdef_
			   data from somewhere else, it is possible. */
			CS_erpt (cs_NO_REFERNCE);
			goto error;
		}
		/* Capture the name of referenced datum which we will be using. */
		CS_stncp (refDtmName,cs_def->dat_knm,sizeof (refDtmName));
		
		/* I don't have to locate the ellipsoid, CSdt2WktEx will do that. */
		status = CSdt2WktEx (datmWkt,sizeof (datmWkt),geoTranWkt,sizeof (geoTranWkt),flavor,dtDefPtr,0,flags);
		CS_free (dtDefPtr);
		dtDefPtr = 0;
	}
	else
	{
		CS_stncp (refDtmName,dt_def->key_nm,sizeof (refDtmName));
		status = CSdt2WktEx (datmWkt,sizeof (datmWkt),geoTranWkt,sizeof (geoTranWkt),flavor,dt_def,el_def,flags);
	}
	if (status != 0)
	{
		/* CSdt2WktEx will have reported the nature of the error. */
		goto error;
	}

	/* Deal with the quad/axis situation. */
	geoAxis [0] = '\0';
	prjAxis [0] = '\0';
	if (cs_def->quad != 0 && cs_def->quad != 1)
	{
		if ((prjPtr->flags & cs_PRJFLG_GEOGR) != 0)
		{
			switch (cs_def->quad) {
			default:
			case 0:
			case 1:
				CS_stncp (geoAxis,",AXIS[\"Lon\",EAST],AXIS[\"Lat\",NORTH]",sizeof (prjAxis));
				break;
			case 2:
				CS_stncp (geoAxis,",AXIS[\"Lon\",WEST],AXIS[\"Lat\",NORTH]",sizeof (prjAxis));
				break;
			case 3:
				CS_stncp (geoAxis,",AXIS[\"Lon\",WEST],AXIS[\"Lat\",SOUTH]",sizeof (prjAxis));
				break;
			case 4:
				CS_stncp (geoAxis,",AXIS[\"Lon\",EAST],AXIS[\"Lat\",SOUTH]",sizeof (prjAxis));
				break;
			case -1:
				CS_stncp (geoAxis,",AXIS[\"Lat\",NORTH],AXIS[\"Lon\",EAST]",sizeof (prjAxis));
				break;
			case -2:
				CS_stncp (geoAxis,",AXIS[\"Lat\",NORTH],AXIS[\"Lon\",WEST]",sizeof (prjAxis));
				break;
			case -3:
				CS_stncp (geoAxis,",AXIS[\"Lat\",SOUTH],AXIS[\"Lon\",WEST]",sizeof (prjAxis));
				break;
			case -4:
				CS_stncp (geoAxis,",AXIS[\"Lat\",SOUTH],AXIS[\"Lon\",EAST]",sizeof (prjAxis));
				break;
			}
		}
		else
		{
			switch (cs_def->quad) {
			default:
			case 0:
			case 1:
				CS_stncp (prjAxis,",AXIS[\"X\",EAST],AXIS[\"Y\",NORTH]",sizeof (prjAxis));
				break;
			case 2:
				CS_stncp (prjAxis,",AXIS[\"X\",WEST],AXIS[\"Y\",NORTH]",sizeof (prjAxis));
				break;
			case 3:
				CS_stncp (prjAxis,",AXIS[\"X\",WEST],AXIS[\"Y\",SOUTH]",sizeof (prjAxis));
				break;
			case 4:
				CS_stncp (prjAxis,",AXIS[\"X\",EAST],AXIS[\"Y\",SOUTH]",sizeof (prjAxis));
				break;
			case -1:
				CS_stncp (prjAxis,",AXIS[\"Y\",NORTH],AXIS[\"X\",EAST]",sizeof (prjAxis));
				break;
			case -2:
				CS_stncp (prjAxis,",AXIS[\"Y\",NORTH],AXIS[\"X\",WEST]",sizeof (prjAxis));
				break;
			case -3:
				CS_stncp (prjAxis,",AXIS[\"Y\",SOUTH],AXIS[\"X\",WEST]",sizeof (prjAxis));
				break;
			case -4:
				CS_stncp (prjAxis,",AXIS[\"Y\",SOUTH],AXIS[\"X\",EAST]",sizeof (prjAxis));
				break;
			}
		}
	}

	/* Locate the base.  The base is what this coordinate system is referenced
	   to.  For example, the definition of UTM27-13 defines how to get from
	   LL27 to UTM27-13.  Therefore, LL27 is the base for that coordinate
	   system. */
	if ((prjPtr->flags & cs_PRJFLG_GEOGR) != 0)
	{
		/* This is a geographic coordinate system, so the base name is whatever
		   the coordinate system name is. */
		CS_stncp (baseName,cs_def->key_nm,sizeof (baseName));
	}
	else
	{
		/* Otherwise, basename is the name of a geographic coordinate system
		   referenced to the same datum as the projected coordinate system.
		   We have a function which will find this for us.  If we don't
		   have one, we are in trouble. */
		CSllCsFromDt (baseName,sizeof baseName,refDtmName);
		if (!CS_csIsValid (baseName))
		{
			CS_stncp (csErrnam,cs_def->key_nm,MAXPATH);
			CS_erpt (cs_WKT_NOLLBASE);
			return -1;
		}
	}

	/* Manufacture the prime meridian. */
	CS_stncp (pmerWkt,"PRIMEM[\"Greenwich\",0]",sizeof (pmerWkt));
	if ((prjPtr->flags & cs_PRJFLG_GEOGR) != 0 && cs_def->org_lng != 0.0)
	{
		int orgLng = (int)cs_def->org_lng;
		switch (orgLng) {
		case 0:
			primeMer = 0.0;
			CS_stncp (pmerWkt,"PRIMEM[\"Greenwich\",0]",sizeof (pmerWkt));
			break;
		case 2:
			primeMer = 2.337229166666667;
			CS_stncp (pmerWkt,"PRIMEM[\"Paris\",2.337229166666667]",sizeof (pmerWkt));
			break;
		case 9:
			primeMer = 9.13190611111111;
			CS_stncp (pmerWkt,"PRIMEM[\"Lisbon\",9.13190611111111]",sizeof (pmerWkt));
			break;
		case -17:
			primeMer = -17.4;
			CS_stncp (pmerWkt,"PRIMEM[\"Ferro\",-17.4]",sizeof (pmerWkt));
			break;
		case -74:
			primeMer = -74.08175;
			CS_stncp (pmerWkt,"PRIMEM[\"Bogota\",-74.08175]",sizeof (pmerWkt));
			break;
		default:
			break;
		}
	}

	/* We will always need the GEOGCS object.  If this is a geographic
	   coordinate system definition, than that's all we'll need.  If this is
	   a Projective coordinate system, the unit is the default for internal
	   coordinates within CS-MAP, namely the degree.  Only if this is a 
	   Geographic Coordinate system, is the actual unit of the definition
	   of importance to us here. */

   	kCp = CSmsiUnitName2WktName ("DEGREE",flavor);
   	if (kCp == 0 || *kCp == '\0')
   	{
		kCp = "Degree";
	}
	sprintf (unitWkt,"UNIT[\"%s\",0.017453292519943295]",kCp);
	if ((prjPtr->flags & cs_PRJFLG_GEOGR) != 0)
	{
		/* This is a geographic coordinate system, extract the unit information
		   from the definition. */
	   	kCp = CSmsiUnitName2WktName (cs_def->unit,flavor);
	   	if (kCp == 0)
	   	{
	   		/* Just in case the flavor does not define angular units... */
	   		kCp = "Degree";
			unitFactor = cs_Degree;
	   	}
	   	else
	   	{
			unitFactor = CS_unitlu (cs_UTYP_ANG,cs_def->unit) * cs_Degree;
		}
		sprintf (unitWkt,"UNIT[\"%s\",%.14f]",kCp,unitFactor);
	}
	
	/* If we are mapping names, the GCS name and the Datum name need to be
	   mapped, and then configured for the active flavor.
	   
	   First, we do the default in case anything goes wrong in the mapping
	   process. */
	sprintf (geogWkt,"GEOGCS[\"%s\",%s,%s,%s%s]",baseName,datmWkt,pmerWkt,unitWkt,geoAxis);
	if ((flags & cs_WKTFLG_MAPNAMES) != 0)
	{
		CS_stncp (dtmName,baseName,sizeof (dtmName));
		CS_stncp (gcsName,baseName,sizeof (gcsName));
		if (flavor == wktFlvrEsri)
		{
			kCp = CS_msiDtmName2Esri (dt_def->key_nm,0);
			if (kCp != 0)
			{
				if (*kCp != 'D' || *(kCp + 1) != '_')
				{
					CS_stcpy (dtmName,"D_");
					CS_stncp (&dtmName [2],kCp,sizeof (dtmName) - 2);

					CS_stcpy (gcsName,"GCS_");
					CS_stncp (&gcsName [4],kCp,sizeof (gcsName) - 4);
				}
				else
				{
					CS_stncp (dtmName,kCp,sizeof (dtmName));
					CS_stcpy (gcsName,"GCS_");
					CS_stncp (&gcsName [4],kCp+2,sizeof (gcsName) - 4);
				}
			}
		}
		else if (flavor == wktFlvrOracle)
		{
			kCp = CS_msiDtmName2Oracle (dt_def->key_nm,0);
			if (kCp != 0)
			{
				CS_stncp (dtmName,kCp,sizeof (dtmName));
				if ((prjPtr->flags & cs_PRJFLG_GEOGR) != 0)
				{
					sprintf (gcsName,"Longitude / Latitude (%s)",kCp);
				}
				else
				{
					CS_stncp (gcsName,kCp,sizeof (gcsName));
				}
			}
		}
		sprintf (geogWkt,"GEOGCS[\"%s\",%s,%s,%s%s]",gcsName,datmWkt,pmerWkt,unitWkt,geoAxis);
	}

	if ((prjPtr->flags & cs_PRJFLG_GEOGR) != 0)
	{
		/* If this is a geographic coordinate system, we're done. */
		CS_stncp (csWktBufr,geogWkt,(int)bufrSize);
	}
	else
	{
		/* We get here only if the coordinate system is of the projected type. */

		/* Do the linear unit for the projWkt. */
		unitFactor = CS_unitlu (cs_UTYP_LEN,cs_def->unit);
		kCp = CSmsiUnitName2WktName (cs_def->unit,flavor);
		if (kCp == 0 || *kCp == '\0')
		{
			CS_stncp (csErrnam,cs_def->unit,MAXPATH);
			CS_erpt (cs_WKT_UNITMAP);
			return -1;
		}
		sprintf (unitWkt,"UNIT[\"%s\",%.14f]",kCp,unitFactor);

		prmNmFalseEasting        = CSwktPrmEnum2Name (csWktPrmFalseEasting,flavor);
		prmNmFalseNorthing       = CSwktPrmEnum2Name (csWktPrmFalseNorthing,flavor);
		prmNmScaleFactor         = CSwktPrmEnum2Name (csWktPrmScaleAtCenter,flavor);
		prmNmCentralMeridian     = CSwktPrmEnum2Name (csWktPrmLongitudeOfOrg,flavor);
		prmNmLatitudeOfOrigin    = CSwktPrmEnum2Name (csWktPrmLatitudeOfOrg,flavor);
		prmNmStandardParallel1   = CSwktPrmEnum2Name (csWktPrmStdParallel1,flavor);
		prmNmStandardParallel2   = CSwktPrmEnum2Name (csWktPrmStdParallel2,flavor);
		prmNmYAxisAzimuth        = CSwktPrmEnum2Name (csWktPrmYaxisAzimuth,flavor);
		prmNmAzimuth             = CSwktPrmEnum2Name (csWktPrmAzimuth,flavor);
		prmNmLongitudeOfCenter   = CSwktPrmEnum2Name (csWktPrmLongitudeOfCtr,flavor);
		prmNmLatitudeOfCenter    = CSwktPrmEnum2Name (csWktPrmLatitudeOfCtr,flavor);
		prmNmLongitudeOf1stPoint = CSwktPrmEnum2Name (csWktPrmLngFirstPoint,flavor);
		prmNmLatitudeOf1stPoint  = CSwktPrmEnum2Name (csWktPrmLatFirstPoint,flavor);
		prmNmLongitudeOf2ndPoint = CSwktPrmEnum2Name (csWktPrmLngSecondPoint,flavor);
		prmNmLatitudeOf2ndPoint  = CSwktPrmEnum2Name (csWktPrmLatSecondPoint,flavor);
		prmNmLatitudeOfStdParall = CSwktPrmEnum2Name (csWktPrmLatOfStdParall,flavor);

		/* Build the projection and parameter portions of this thing. */ 
		parmWkt [0] = '\0';
		CS_stcpy (projection,prjNmPtr);
		switch (prjCode) {
		case  cs_PRJCOD_TRMER:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.12f]",prmNmScaleFactor,cs_def->scl_red);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLatitudeOfOrigin,cs_def->org_lat);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_ALBER:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmStandardParallel1,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmStandardParallel2,cs_def->prj_prm2);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLatitudeOfOrigin,cs_def->org_lat);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->org_lng);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_MRCAT:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmStandardParallel1,cs_def->prj_prm2);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLatitudeOfOrigin,cs_def->org_lat);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_AZMED:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmYAxisAzimuth,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->org_lng);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLatitudeOfOrigin,cs_def->org_lat);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_PLYCN:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLatitudeOfOrigin,cs_def->org_lat);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_AZMEA:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->org_lng);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLatitudeOfOrigin,cs_def->org_lat);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmYAxisAzimuth,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_EDCNC:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmStandardParallel1,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmStandardParallel2,cs_def->prj_prm2);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLatitudeOfOrigin,cs_def->org_lat);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_MILLR:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLatitudeOfOrigin,cs_def->org_lat);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_NZLND:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLatitudeOfOrigin,cs_def->org_lat);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->org_lng);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_SINUS:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_EDCYL:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmStandardParallel1,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLatitudeOfOrigin,cs_def->org_lat);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_VDGRN:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_CSINI:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLatitudeOfOrigin,cs_def->org_lat);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_ROBIN:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_BONNE:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmStandardParallel1,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_EKRT4:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_EKRT6:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_MOLWD:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_PSTRO:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLatitudeOfOrigin,cs_def->org_lat);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.12f]",prmNmScaleFactor,cs_def->scl_red);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_PSTROSL:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLatitudeOfOrigin,cs_def->org_lat);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmStandardParallel1,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			
			/* Kludge time again.  If the flavor is ESRI, we change the rpojection name based
			   on the origin latitude.  Sorry about that, but this WKT stuff is maddening. */
			if (flavor == wktFlvrEsri)
			{
				if (cs_def->org_lat < -89.0)
				{
					CS_stncp (projection,"Stereographic_South_Pole",sizeof (projection));
				}
				else if (cs_def->org_lat < -89.0)
				{
					CS_stncp (projection,"Stereographic_North_Pole",sizeof (projection));
				}
			}
			break;
		case  cs_PRJCOD_OSTRO:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLatitudeOfOrigin,cs_def->org_lat);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->org_lng);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.12f]",prmNmScaleFactor,cs_def->scl_red);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_LM1SP:
		case  cs_PRJCOD_LMTAN:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.12f]",prmNmScaleFactor,cs_def->scl_red);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->org_lng);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLatitudeOfOrigin,cs_def->org_lat);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_LM2SP:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->org_lng);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLatitudeOfOrigin,cs_def->org_lat);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmStandardParallel1,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmStandardParallel2,cs_def->prj_prm2);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_UTM:
			tmpDbl = 500000.00 / unitFactor;
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,tmpDbl);
			strcat (parmWkt,cTemp);
			tmpDbl = (cs_def->prj_prm2 >= 0.0) ? 0.0 : 10000000.0;
			tmpDbl /= unitFactor;
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,tmpDbl);
			strcat (parmWkt,cTemp);
			tmpDbl = (double)(-183 + (6 * (int)cs_def->prj_prm1)); 				/*lint !e790 */
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,tmpDbl);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",0.9996]",prmNmScaleFactor);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",0.000]",prmNmLatitudeOfOrigin);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_TRMRS:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.12f]",prmNmScaleFactor,cs_def->scl_red);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLatitudeOfOrigin,cs_def->org_lat);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_HOM1XY:
		case  cs_PRJCOD_RSKEW:
		case  cs_PRJCOD_RSKEWC:
		case  cs_PRJCOD_RSKEWO:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.12f]",prmNmScaleFactor,cs_def->scl_red);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmAzimuth,cs_def->prj_prm3);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLongitudeOfCenter,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLatitudeOfCenter,cs_def->prj_prm2);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_HOM2XY:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.12f]",prmNmScaleFactor,cs_def->scl_red);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLongitudeOf1stPoint,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLatitudeOf1stPoint,cs_def->prj_prm2);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLongitudeOf2ndPoint,cs_def->prj_prm3);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLatitudeOf2ndPoint,cs_def->prj_prm4);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLatitudeOfCenter,cs_def->org_lat);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_GAUSSK:
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.12f]",prmNmScaleFactor,cs_def->scl_red);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmCentralMeridian,cs_def->prj_prm1);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLatitudeOfOrigin,cs_def->org_lat);
			strcat (parmWkt,cTemp);
			break;
		case  cs_PRJCOD_SWISS:
			CS_stncp (projection,prjNmPtr,sizeof (projection));
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseEasting,cs_def->x_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.3f]",prmNmFalseNorthing,cs_def->y_off);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.12f]",prmNmScaleFactor,cs_One);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmAzimuth,cs_K90);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLongitudeOfCenter,cs_def->org_lng);
			strcat (parmWkt,cTemp);
			sprintf (cTemp,",PARAMETER[\"%s\",%.14f]",prmNmLatitudeOfCenter,cs_def->org_lat);
			strcat (parmWkt,cTemp);
			break;
		}												/*lint !e744 */

		/* Need to determine the name we will assign to this definition.  We
		generate a default value which is used if anything else fails. */
		CS_stncp (csysWktName,cs_def->key_nm,sizeof (csysWktName));
		if ((flags & cs_WKTFLG_MAPNAMES) != 0)
		{
			if (flavor == wktFlvrEsri)
			{
				kCp = CS_msiName2Esri (cs_def->key_nm);
				if (kCp != 0)
				{
					CS_stncp (csysWktName,kCp,sizeof (csysWktName));
				}
			}
			else if (flavor == wktFlvrOracle)
			{
				kCp = CS_msiName2Oracle (cs_def->key_nm);
				if (kCp != 0)
				{
					CS_stncp (csysWktName,kCp,sizeof (csysWktName));
				}
			}
		}

		/* Construct the final string. */
		sprintf (projWkt,"PROJCS[\"%s\",%s,PROJECTION[\"%s\"]%s,%s%s]",csysWktName,geogWkt,projection,parmWkt,unitWkt,prjAxis);
		CS_stncp (csWktBufr,projWkt,(int)bufrSize);
	}
	if (dtDefPtr != 0)
	{
		CS_free (dtDefPtr);
	}
	return 0;
error:
	if (dtDefPtr != 0)
	{
		CS_free (dtDefPtr);
	}
	return -1;
}
Beispiel #18
0
int CS_csDiff (FILE *rptStrm,struct cs_Csdef_ *was,struct cs_Csdef_ *is)
{
	extern struct cs_Prjtab_ cs_Prjtab [];		/* Projection Table */

	int flag = TRUE;
	int errCnt = 0;
	double okValue;

	struct cs_Prjtab_ *pp;

	char key_name [64];

	if (strcmp (was->dat_knm,is->dat_knm))
	{
		fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Datum Key Name (dat_knm):\n       was: %s\n    is now: %s\n",was->dat_knm,is->dat_knm);
	}
	if (strcmp (was->elp_knm,is->elp_knm))
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Ellipsoid Key Name (elp_knm):\n       was: %s\n    is now: %s\n",was->elp_knm,is->elp_knm);
	}
	if (strcmp (was->prj_knm,is->prj_knm))
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Projection Key Name (prj_knm):\n       was: %s\n    is now: %s\n",was->prj_knm,is->prj_knm);
	}
	if (strcmp (was->group,is->group))
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Group (group):\n       was: %s\n    is now: %s\n",was->group,is->group);
	}
	if (strcmp (was->locatn,is->locatn))
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Group (group):\n       was: %s\n    is now: %s\n",was->locatn,is->locatn);
	}
	if (strcmp (was->cntry_st,is->cntry_st))
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Political Location (cntry_st):\n       was: %s\n    is now: %s\n",was->cntry_st,is->cntry_st);
	}
	if (strcmp (was->unit,is->unit))
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Unit (unit):\n       was: %s\n    is now: %s\n",was->unit,is->unit);
	}

	/* Look this projection up in the projection table, we need to pass the
	   projection code to the parameter check function. */

	for (pp = cs_Prjtab;pp->key_nm [0] != '\0';pp += 1)
	{
		if (!CS_stricmp (was->prj_knm,pp->key_nm))
		{
			break;
		}
	}

	if (pp->check == NULL)
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;

		fprintf (rptStrm,"  %s has an invalid projection code name.",was->prj_knm);
	}
	else
	{
		/* Check all of the parameters. */

		if (flag) CS_stcpy (key_name,was->key_nm);
		else      key_name [0] = '\0';

		errCnt += CScmpPrjParm (rptStrm,key_name,pp, 1,was->prj_prm1 ,is->prj_prm1);
		errCnt += CScmpPrjParm (rptStrm,key_name,pp, 2,was->prj_prm2 ,is->prj_prm2);
		errCnt += CScmpPrjParm (rptStrm,key_name,pp, 3,was->prj_prm3 ,is->prj_prm3);
		errCnt += CScmpPrjParm (rptStrm,key_name,pp, 4,was->prj_prm4 ,is->prj_prm4);
		errCnt += CScmpPrjParm (rptStrm,key_name,pp, 5,was->prj_prm5 ,is->prj_prm5);
		errCnt += CScmpPrjParm (rptStrm,key_name,pp, 6,was->prj_prm6 ,is->prj_prm6);
		errCnt += CScmpPrjParm (rptStrm,key_name,pp, 7,was->prj_prm7 ,is->prj_prm7);
		errCnt += CScmpPrjParm (rptStrm,key_name,pp, 8,was->prj_prm8 ,is->prj_prm8);
		errCnt += CScmpPrjParm (rptStrm,key_name,pp, 9,was->prj_prm9 ,is->prj_prm9);
		errCnt += CScmpPrjParm (rptStrm,key_name,pp,10,was->prj_prm10,is->prj_prm10);
		errCnt += CScmpPrjParm (rptStrm,key_name,pp,11,was->prj_prm11,is->prj_prm11);
		errCnt += CScmpPrjParm (rptStrm,key_name,pp,12,was->prj_prm12,is->prj_prm12);
		errCnt += CScmpPrjParm (rptStrm,key_name,pp,13,was->prj_prm13,is->prj_prm13);
		errCnt += CScmpPrjParm (rptStrm,key_name,pp,14,was->prj_prm14,is->prj_prm14);
		errCnt += CScmpPrjParm (rptStrm,key_name,pp,15,was->prj_prm15,is->prj_prm15);
		errCnt += CScmpPrjParm (rptStrm,key_name,pp,16,was->prj_prm16,is->prj_prm16);
		errCnt += CScmpPrjParm (rptStrm,key_name,pp,17,was->prj_prm17,is->prj_prm17);
		errCnt += CScmpPrjParm (rptStrm,key_name,pp,18,was->prj_prm18,is->prj_prm18);
		errCnt += CScmpPrjParm (rptStrm,key_name,pp,19,was->prj_prm19,is->prj_prm19);
		errCnt += CScmpPrjParm (rptStrm,key_name,pp,20,was->prj_prm20,is->prj_prm20);
		errCnt += CScmpPrjParm (rptStrm,key_name,pp,21,was->prj_prm21,is->prj_prm21);
		errCnt += CScmpPrjParm (rptStrm,key_name,pp,22,was->prj_prm22,is->prj_prm22);
		errCnt += CScmpPrjParm (rptStrm,key_name,pp,23,was->prj_prm23,is->prj_prm23);
		errCnt += CScmpPrjParm (rptStrm,key_name,pp,24,was->prj_prm24,is->prj_prm24);
	}

	okValue = 1.0E-09;
	if (fabs (was->org_lng - is->org_lng) > okValue)
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Origin Longitude (org_lng):\n       was: %18.12f\n    is now: %18.12f\n",was->org_lng,is->org_lng);
	}
	if (fabs (was->org_lat - is->org_lat) > okValue)
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Origin Latitude (org_lat):\n       was: %18.12f\n    is now: %18.12f\n",was->org_lat,is->org_lat);
	}

	okValue = 1.0E-03;
	if (fabs (was->x_off - is->x_off) > okValue)
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  FALSE Easting (x_off):\n       was: %16.6f\n    is now: %16.6f\n",was->x_off,is->x_off);
	}
	if (fabs (was->y_off - is->y_off) > okValue)
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  FALSE Northing (y_off):\n       was: %16.6f\n    is now: %16.6f\n",was->y_off,is->y_off);
	}

	okValue = 1.0E-09;
	if (fabs (was->scl_red - is->scl_red) > okValue)
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Scale Reduction (scl_red):\n       was: %18.12f\n    is now: %18.12f\n",was->scl_red,is->scl_red);
	}

	if (!CS_stricmp (was->prj_knm,"LL"))
	{
		okValue = 1.0E-09;
		if (fabs (was->zero [0] - is->zero [0]) > okValue || fabs (was->zero [1] - is->zero [1]) > okValue)
		{
			if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
			flag = FALSE;
			errCnt += 1;
			fprintf (rptStrm,"  Miinimum Non Zero (zero):\n       was: %14.12f:%14.12f\n    is now: %14.12f:%14.12f\n",was->zero [0],was->zero[1],is->zero [0],is->zero [1]);
		}
	}
	else
	{
		okValue = 1.0E-03;
		if (fabs (was->zero [0] - is->zero [0]) > okValue || fabs (was->zero [1] - is->zero [1]) > okValue)
		{
			if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
			flag = FALSE;
			errCnt += 1;
			fprintf (rptStrm,"  Miinimum Non Zero (zero):\n       was: %8.6f:%8.6f\n    is now: %8.6f:%8.6f\n",was->zero [0],was->zero[1],is->zero [0],is->zero [1]);
		}
	}

	okValue = 1.0E-09;
	if (fabs (was->hgt_lng - is->hgt_lng) > okValue)
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Height Longitude (hgt_lng):\n       was: %18.12f\n    is now: %18.12f\n",was->hgt_lng,is->hgt_lng);
	}
	if (fabs (was->hgt_lat - is->hgt_lat) > okValue)
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Height Latitude (hgt_lat):\n       was: %18.12f\n    is now: %18.12f\n",was->hgt_lat,is->hgt_lat);
	}
	if (fabs (was->hgt_zz - is->hgt_zz) > okValue)
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Height Elevation (hgt_zz):\n       was: %12.6f\n    is now: %12.6f\n",was->hgt_zz,is->hgt_zz);
	}
	if (fabs (was->geoid_sep - is->geoid_sep) > okValue)
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Geoid Separation (geoid_sep):\n       was: %12.6f\n    is now: %12.6f\n",was->geoid_sep,is->geoid_sep);
	}

	okValue = 1.0E-08;
	if (fabs (was->ll_min [0] - is->ll_min [0]) > okValue || fabs (was->ll_min [1] - is->ll_min [1]) > okValue)
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Min Lat/Lng (ll_min):\n       was: %14.8f:%14.8f\n    is now: %14.8f:%14.8f\n",was->ll_min [0],was->ll_min[1],is->ll_min [0],is->ll_min [1]);
	}
	if (fabs (was->ll_max [0] - is->ll_max [0]) > okValue || fabs (was->ll_max [1] - is->ll_max [1]) > okValue)
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Max Lat/Lng (ll_max):\n       was: %14.8f:%14.8f\n    is now: %14.8f:%14.8f\n",was->ll_max [0],was->ll_max[1],is->ll_max [0],is->ll_max [1]);
	}

	okValue = 1.0E-03;
	if (fabs (was->xy_min [0] - is->xy_min [0]) > okValue || fabs (was->xy_min [1] - is->xy_min [1]) > okValue)
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Min X/Y (xy_min):\n       was: %14.4f:%14.4f\n    is now: %14.4f:%14.4f\n",was->xy_min [0],was->xy_min[1],is->xy_min [0],is->xy_min [1]);
	}
	if (fabs (was->xy_max [0] - is->xy_max [0]) > okValue || fabs (was->xy_max [1] - is->xy_max [1]) > okValue)
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Max X/Y (xy_max):\n       was: %14.4f:%14.4f\n    is now: %14.4f:%14.4f\n",was->xy_max [0],was->xy_max[1],is->xy_max [0],is->xy_max [1]);
	}

	if (strcmp (was->desc_nm,is->desc_nm))
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Descriptive Name (desc_nm):\n       was: %s\n    is now: %s\n",was->desc_nm,is->desc_nm);
	}
	if (strcmp (was->source,is->source))
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Source description (source):\n       was: %s\n    is now: %s\n",was->source,is->source);
	}

	if (was->quad != is->quad)
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Quadrant (quad):\n       was: %d\n    is now: %d\n",was->quad,is->quad);
	}
	if (was->order != is->order)
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Polynomial Order (order):\n       was: %d\n    is now: %d\n",was->order,is->order);
	}
	if (was->zones != is->zones)
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Zone Count (zones):\n       was: %d\n    is now: %d\n",was->zones,is->zones);
	}
	if (was->protect != is->protect)
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Protection Flag (protect):\n       was: %d\n    is now: %d\n",was->protect,is->protect);
	}
	if (was->epsg_qd != is->epsg_qd)
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Automatic Geoid Flag (epsg_qd):\n       was: %d\n    is now: %d\n",was->epsg_qd,is->epsg_qd);
	}
	if (was->srid != is->srid)
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  Elevation Technique (srid):\n       was: %d\n    is now: %d\n",was->srid,is->srid);
	}
	if (was->epsgNbr != is->epsgNbr)
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  EPSG (epsgNbr):\n       was: %d\n    is now: %d\n",was->epsgNbr,is->epsgNbr);
	}
	if (was->wktFlvr != is->wktFlvr)
	{
		if (flag) fprintf (rptStrm,"\n%s has changed:\n",is->key_nm);
		flag = FALSE;
		errCnt += 1;
		fprintf (rptStrm,"  WKT Flavor (wktFlvr):\n       was: %d\n    is now: %d\n",was->wktFlvr,is->wktFlvr);
	}
	return errCnt;
}