PageRenderTime 71ms CodeModel.GetById 56ms app.highlight 13ms RepoModel.GetById 1ms app.codeStats 0ms

/MapView/Map/RMTransform.m

http://github.com/route-me/route-me
Objective C | 101 lines | 57 code | 18 blank | 26 comment | 11 complexity | 24e12a3ac3d5cc02eced9093087724b8 MD5 | raw file
  1//
  2//  RMTransform.m
  3//
  4// Copyright (c) 2008-2009, Route-Me Contributors
  5// All rights reserved.
  6//
  7// Redistribution and use in source and binary forms, with or without
  8// modification, are permitted provided that the following conditions are met:
  9//
 10// * Redistributions of source code must retain the above copyright notice, this
 11//   list of conditions and the following disclaimer.
 12// * Redistributions in binary form must reproduce the above copyright notice,
 13//   this list of conditions and the following disclaimer in the documentation
 14//   and/or other materials provided with the distribution.
 15//
 16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 17// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 18// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 19// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 20// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 21// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 22// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 23// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 24// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 25// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 26// POSSIBILITY OF SUCH DAMAGE.
 27
 28#import "proj_api.h"
 29#import "RMTransform.h"
 30#import "RMProjection.h"
 31
 32@implementation RMTransform
 33
 34-(id) initFrom: (RMProjection*)_source To: (RMProjection*)_dest
 35{
 36	if (![super init])
 37		return nil;
 38	
 39	source = [_source retain];
 40	destination = [_dest retain];
 41	
 42	is_source_latlong = pj_is_latlong(source.internalProjection);
 43	is_dest_latlong = pj_is_latlong(destination.internalProjection);
 44	
 45	if (source == nil || destination == nil)
 46	{
 47		[self release];
 48		return nil;
 49	}
 50	
 51	return self;
 52}
 53
 54-(void) dealloc
 55{
 56	[source release];
 57	[destination release];
 58	
 59	[super dealloc];
 60}
 61
 62-(CLLocationCoordinate2D) projectForward: (CLLocationCoordinate2D)point AtZoom: (double)z
 63{
 64	double zo = z;
 65	
 66	if (is_source_latlong)
 67	{
 68		point.latitude *= DEG_TO_RAD;
 69		point.longitude *= DEG_TO_RAD;
 70	}
 71	
 72	int retval = pj_transform(source.internalProjection, destination.internalProjection, 1, 0,
 73				 &point.longitude, &point.latitude, &z);
 74	
 75	if (is_dest_latlong)
 76	{
 77		point.latitude *= RAD_TO_DEG;
 78		point.longitude *= RAD_TO_DEG;
 79	}
 80	
 81	if (z != zo)
 82	{
 83		RMLog(@"z changed....");
 84	}
 85	if (retval != 0)
 86	{	// This should be fixed to handle these errors...
 87		RMLog(@"Error occured during pj_transform: %s", pj_strerrno(retval));
 88	}
 89	
 90	return point;
 91}
 92
 93-(CLLocationCoordinate2D) projectInverse: (CLLocationCoordinate2D)point AtZoom: (double)z
 94{
 95	pj_transform(destination.internalProjection, source.internalProjection, 1, 0,
 96				 &point.longitude,&point.latitude,&z);
 97	
 98	return point;
 99}
100
101@end