This is MiscUTMConstants.m in view mode; [Download] [Up]
/*=========================== MiscUTMConstants.m ============================*/
/* MiscUTMConstants class contains and supports the constants required for
calculating a Universal Transverse Mercator grid point.
For information on the underlying mathematics, refer to:
1- Ordinance Survey Information, "Transverse Mercator Projection,
Constants, Formula and Methods", March 1983
2- Ordinance Survey, "Tables for the Transverse Mercator Projection
of Ireland", 1953, reprinted 1971
Note: Convergence could be made settable if there is ever any reason to
do so.
DMA Release 0.8, Copyright @1993 by Genesis Project, Ltd. All Rights
Reserved. For further information on terms and conditions see:
Documentation/GISKit/Agreements-Legal-README
HISTORY
22-Feb-93 Dale Amon at GPL
Created.
*/
#import <math.h>
#import <misckit/miscgiskit.h>
@implementation MiscUTMConstants
/*===========================================================================*/
/* Class methods */
/*===========================================================================*/
/* Initialize the class */
+ initialize {[MiscUTMConstants setVersion:MISC_UTM_CONSTANTS_VERSION_ID]; return self;}
/*===========================================================================*/
/* Internal methods */
/*===========================================================================*/
/* Calculate the constants used in meridian arc calculations */
- (void) setMeridianConstants
{ double nSqrd; /* n squared */
double nCubed; /* n cubed */
nSqrd = n*n;
nCubed = nSqrd*n;
M1 = 1.0 + n + (5.0/4.0 * nSqrd) + (5.0/4.0 * nCubed);
M2 = (3.0 * n) + (3.0 * nSqrd) + (21.0/8.0 * nCubed);
M3 = (15.0/8.0 * nSqrd) + (15.0/8.0 * nCubed);
M4 = 35.0/24.0 * nCubed;
return;
}
/*===========================================================================*/
/* Initialization methods */
/*===========================================================================*/
/* Some old grids have rounded or even incorrectly calculated values. This
method allows the correctly calculated ones to be overriden. M1-M4 are
also recalculated.
*/
- override_eSqrd:(double)new_eSqrd n: (double)new_n
{
eSqrd = new_eSqrd;
n = new_n;
[self setMeridianConstants];
return self;
}
/*---------------------------------------------------------------------------*/
/* DESIGNATED INITIALIZER */
- initGridName: (const char *) name
trueOrigin: (double) deg_latitude : (double) deg_longitude
inGrid: (double) e0: (double) n0
onSphere: (double) a0: (double) b0
centralMeridianScaling: (double) f0
{ double aa;
[super init];
noFree = NO; /* object is deletable by default */
gridName = (name) ?
NXCopyStringBufferFromZone(name, [self zone]) :
(char*)NULL;
convergence = MISC_CONVERGENCE_CRITERIA;
/* Load primary constants */
phi0 = [MiscCoord degreesToRadians: deg_latitude];
lambda0 = [MiscCoord degreesToRadians: deg_longitude];
E0 = e0; N0 = n0;
a = a0; b = b0;
F0 = f0;
aF0 = a * F0;
bF0 = b * F0;
aa = aF0*aF0;
eSqrd = (aa - bF0*bF0)/aa;
n = (aF0 - bF0)/(aF0 + bF0);
[self setMeridianConstants];
return self;
}
/*---------------------------------------------------------------------------*/
/* free the string */
- free
{ if (noFree) return self;
if (gridName) free((void*)gridName);
return ([super free]);
}
/*---------------------------------------------------------------------------*/
/* Disable use of the designated initializer from the Object class */
- init
{
[self error:" %s objects should not be sent '%s' messages\n",
[[self class] name], sel_getName(_cmd)];
return self;
}
/*---------------------------------------------------------------------------*/
/* lock a constants object against ever being free'd. This should not be undone
because the assumption is that you are locking it because there are many
pointers to the same object floating around.
*/
- setProtected {noFree = YES; return self;}
- setUnprotected {noFree = NO; return self;}
/*===========================================================================*/
/* UTM grid constants */
/*===========================================================================*/
- (const char *) gridName {return gridName;}
/*---------------------------------------------------------------------------*/
/* Two UTM constants objects are identical if they are either the same
object or if their primary constants are the same. convergence is ignored
because it may affect conversion accuracy, but does not represent a
difference in the coordinate system.
*/
- (BOOL)isEqual:anObject
{ MiscUTMConstants *ptr;
if (anObject == self) return YES;
if ([anObject isKindOf:[self class]])
{ ptr = (MiscUTMConstants*) anObject;
if (a != ptr->a) return NO;
if (b != ptr->b) return NO;
if (F0 != ptr->F0) return NO;
if (phi0 != ptr->phi0) return NO;
if (lambda0 != ptr->lambda0) return NO;
if (E0 != ptr->E0) return NO;
if (N0 != ptr->N0) return NO;
if (aF0 != ptr->aF0) return NO;
if (bF0 != ptr->bF0) return NO;
if (eSqrd != ptr->eSqrd) return NO;
if (n != ptr->n) return NO;
if (M1 != ptr->M1) return NO;
if (M2 != ptr->M2) return NO;
if (M3 != ptr->M3) return NO;
if (M4 != ptr->M4) return NO;
}
return YES;
}
/*===========================================================================*/
/* Archive methods */
/*===========================================================================*/
- write: (NXTypedStream *) stream
{ [super write: stream];
NXWriteTypes(stream, "ddddddddifddddddd",
&a,&b,&F0,&phi0,&lambda0,&E0,&N0,&convergence,
(int*)&noFree,
&n, &aF0, &bF0, &eSqrd,&M1,&M2,&M3,&M4);
return self;
}
/*---------------------------------------------------------------------------*/
- read: (NXTypedStream *) stream
{ [super read: stream];
NXReadTypes(stream, "ddddddddifddddddd",
&a,&b,&F0,&phi0,&lambda0,&E0,&N0,&convergence,
(int*)&noFree,
&n, &aF0, &bF0, &eSqrd,&M1,&M2,&M3,&M4);
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.