/*=========================== MiscZoneUTMCoord.m ============================*/
/* MiscZoneUTMCoord class contains and supports values representing locations
   in any zone of the world wide Universal Transverse Mercator coordinate
   system. Constants are from:

	Ordinance Survey Information
	Transverse Mercator Projection
	Constants, Formulae and Methods
	March 1983

  Zones are 6 degrees apart starting at 3 degrees east of Longitude 180 and
  proceeding East. Greenwich is bracketed by Zone 30 and 31.
  Zone Numbering starts from 1 and ends at 60.

   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
26-Mar-93  Dale Amon at GPL
	   Created.
*/

#import <misckit/miscgiskit.h>

@implementation MiscZoneUTMCoord

static id gridZones[60];

/*===========================================================================*/
/* Class methods */
/*===========================================================================*/
/* Initialize the class */

+ initialize {[MiscZoneUTMCoord setVersion:MISC_ZONE_COORD_VERSION_ID]; return self;}


/*===========================================================================*/
/* Initialization methods. If we don't already have a UTM constants object
   for the specified zone, create one instance that all will share and that
   cannot be deleted.

   Zone's are 1-60. Zone 0 will be treated as Zone 1. A zone greater than
   60 will be set to Zone 60.
*/
/*===========================================================================*/
/* internal method for setting up the constants from the zone */

+ (unsigned int) makeZone: (unsigned int) utmzone
  {  double	longitude;
     char	buf[20];

     if (utmzone == 0) utmzone++;
     else if (utmzone > 60) utmzone = 60;

     if (!gridZones[utmzone])
	{
	 longitude = 6.0 * (double) utmzone - 3.0 - 180.0;
	 sprintf(buf,"UTM Zone %2u",utmzone);
	 gridZones[utmzone] = [[MiscUTMConstants allocFromZone: [self zone]]
		       initGridName: buf
			 trueOrigin: 0.0 : longitude
			     inGrid: 500000.0    : 0.0
			   onSphere: 6378388.000 : 6356911.946
	     centralMeridianScaling: 0.9996];
	 [gridZones[utmzone] setProtected];
	}

     return utmzone;
  }


/*---------------------------------------------------------------------------*/
/* DESIGNATED INITIALIZER */

-initDescription: (char *) txt zone: (unsigned int) utmzone
 {
	zoneNumber = [MiscZoneUTMCoord makeZone: utmzone];
	return [super initDescription: txt constants: gridZones[utmzone]];
 }


/*---------------------------------------------------------------------------*/
/* Block the designated initializer of our parent class */

-initDescription: (char *) txt constants: anObject
 {	[self error:"  %s class should not be sent '%s' messages\n",
            [[self class] name], sel_getName(_cmd)];
	return self;
 }


/*===========================================================================*/
/* Archive methods */
/*===========================================================================*/
- write: (NXTypedStream *) stream
  {	[super write: stream];
	NXWriteType(stream, "i",(int*)&zoneNumber);
	return self;
  }

/*---------------------------------------------------------------------------*/
- read: (NXTypedStream *) stream
  {	[super read: stream];
	NXReadType(stream, "i",(int*)&zoneNumber);
	return self;
  }


/*---------------------------------------------------------------------------*/
- awake
{	[super awake];
	[constants setUnprotected];
	[constants free];
	[MiscZoneUTMCoord makeZone: zoneNumber];
	return self;
}

@end
