aboutsummaryrefslogtreecommitdiff
path: root/src/nad_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nad_init.c')
-rw-r--r--src/nad_init.c194
1 files changed, 8 insertions, 186 deletions
diff --git a/src/nad_init.c b/src/nad_init.c
index cdc13d41..77e267e2 100644
--- a/src/nad_init.c
+++ b/src/nad_init.c
@@ -28,6 +28,9 @@
******************************************************************************
*
* $Log$
+ * Revision 1.7 2003/03/15 06:02:02 warmerda
+ * preliminary NTv2 support, major restructure of datum shifting
+ *
* Revision 1.6 2002/07/08 02:32:05 warmerda
* ensure clean C++ builds
*
@@ -50,171 +53,13 @@
#include <assert.h>
#include <string.h>
-static int byte_order_test = 1;
-#define IS_LSB (((unsigned char *) (&byte_order_test))[0] == 1)
-
-/************************************************************************/
-/* local_order() */
-/* */
-/* Convert the given words into local order in place. */
-/************************************************************************/
-
-static void local_order( unsigned char *data, int word_size, int word_count )
-
-{
- /* We only need to do work on LSB machines. Perhaps we should
- convert the data files into LSB order to cut workload! */
-
- if( IS_LSB )
- {
- int word;
-
- for( word = 0; word < word_count; word++ )
- {
- int i;
-
- for( i = 0; i < word_size/2; i++ )
- {
- int t;
-
- t = data[i];
- data[i] = data[word_size-i-1];
- data[word_size-i-1] = t;
- }
-
- data += word_size;
- }
- }
-}
-
-/************************************************************************/
-/* nad_load_ntv1() */
-/* */
-/* Load an NTv1 style Canadian grid shift file. */
-/************************************************************************/
-
-static struct CTABLE *nad_load_ntv1( FILE * fid )
-
-{
- unsigned char header[176];
- struct CTABLE *ct;
- LP ur;
- double *row_buf;
- int row;
-
- assert( sizeof(int) == 4 );
- assert( sizeof(double) == 8 );
- if( sizeof(int) != 4 || sizeof(double) != 8 )
- {
- fprintf( stderr,
- "basic types of inappropraiate size in nad_load_ntv1()\n" );
- pj_errno = -38;
- return NULL;
- }
-
-/* -------------------------------------------------------------------- */
-/* Read the header. */
-/* -------------------------------------------------------------------- */
- if( fread( header, sizeof(header), 1, fid ) != 1 )
- {
- fclose( fid );
- pj_errno = -38;
- return 0;
- }
-
-/* -------------------------------------------------------------------- */
-/* Regularize fields of interest. */
-/* -------------------------------------------------------------------- */
- local_order( header+8, 4, 1 );
- local_order( header+24, 8, 1 );
- local_order( header+40, 8, 1 );
- local_order( header+56, 8, 1 );
- local_order( header+72, 8, 1 );
- local_order( header+88, 8, 1 );
- local_order( header+104, 8, 1 );
-
- if( *((int *) (header+8)) != 12 )
- {
- pj_errno = -38;
- printf("NTv1 grid shift file has wrong record count, corrupt?\n");
- return NULL;
- }
-
-/* -------------------------------------------------------------------- */
-/* Fill in CTABLE structure. */
-/* -------------------------------------------------------------------- */
- ct = (struct CTABLE *) pj_malloc(sizeof(struct CTABLE));
- strcpy( ct->id, "NTv1 Grid Shift File" );
-
- ct->ll.lam = - *((double *) (header+72));
- ct->ll.phi = *((double *) (header+24));
- ur.lam = - *((double *) (header+56));
- ur.phi = *((double *) (header+40));
- ct->del.lam = *((double *) (header+104));
- ct->del.phi = *((double *) (header+88));
- ct->lim.lam = (int) (fabs(ur.lam-ct->ll.lam)/ct->del.lam + 0.5) + 1;
- ct->lim.phi = (int) (fabs(ur.phi-ct->ll.phi)/ct->del.phi + 0.5) + 1;
-
- ct->ll.lam *= DEG_TO_RAD;
- ct->ll.phi *= DEG_TO_RAD;
- ct->del.lam *= DEG_TO_RAD;
- ct->del.phi *= DEG_TO_RAD;
-
-/* -------------------------------------------------------------------- */
-/* Fill the data array. */
-/* */
-/* We process one line at a time. Note that the array storage */
-/* direction (e-w) is different in the NTv1 file and what */
-/* the CTABLE is supposed to have. The phi/lam are also */
-/* reversed, and we have to be aware of byte swapping. */
-/* -------------------------------------------------------------------- */
- row_buf = (double *) pj_malloc(ct->lim.lam * sizeof(double) * 2);
- ct->cvs = (FLP *) pj_malloc(ct->lim.lam*ct->lim.phi*sizeof(FLP));
- if( row_buf == NULL || ct->cvs == NULL )
- return NULL;
-
- for( row = 0; row < ct->lim.phi; row++ )
- {
- int i;
- FLP *cvs;
- double *diff_seconds;
-
- if( fread( row_buf, sizeof(double), ct->lim.lam * 2, fid )
- != 2 * ct->lim.lam )
- {
- pj_dalloc( row_buf );
- pj_dalloc( ct->cvs );
- pj_errno = -38;
- return NULL;
- }
-
- local_order( (unsigned char *) row_buf, 8, ct->lim.lam * 2 );
-
- /* convert seconds to radians */
- diff_seconds = row_buf;
-
- for( i = 0; i < ct->lim.lam; i++ )
- {
- cvs = ct->cvs + (row) * ct->lim.lam
- + (ct->lim.lam - i - 1);
-
- cvs->phi = *(diff_seconds++) * ((PI/180.0) / 3600.0);
- cvs->lam = *(diff_seconds++) * ((PI/180.0) / 3600.0);
- }
- }
-
- pj_dalloc( row_buf );
-
- return ct;
-}
-
/************************************************************************/
/* nad_load_ctable() */
/* */
/* Load a datum shift file already in "CTABLE" format. */
/************************************************************************/
-static struct CTABLE *nad_load_ctable( FILE * fid )
+struct CTABLE *nad_load_ctable( FILE * fid )
{
struct CTABLE *ct;
int a_size, id_end;
@@ -283,32 +128,7 @@ struct CTABLE *nad_init(char *name)
return 0;
}
-/* -------------------------------------------------------------------- */
-/* Load a header, to determine the file type. */
-/* -------------------------------------------------------------------- */
- if( fread( header, sizeof(header), 1, fid ) != 1 )
- {
- fclose( fid );
- pj_errno = -38;
- return 0;
- }
-
- fseek( fid, SEEK_SET, 0 );
-
-/* -------------------------------------------------------------------- */
-/* Determine file type. */
-/* -------------------------------------------------------------------- */
- if( strncmp(header + 0, "HEADER", 6) == 0
- && strncmp(header + 96, "W GRID", 6) == 0
- && strncmp(header + 144, "TO NAD83 ", 16) == 0 )
- {
- ct = nad_load_ntv1( fid );
- }
-
- else
- {
- ct = nad_load_ctable( fid );
- }
+ ct = nad_load_ctable( fid );
fclose(fid);
return ct;
@@ -323,7 +143,9 @@ struct CTABLE *nad_init(char *name)
void nad_free(struct CTABLE *ct)
{
if (ct) {
- pj_dalloc(ct->cvs);
+ if( ct->cvs != NULL )
+ pj_dalloc(ct->cvs);
+
pj_dalloc(ct);
}
}