/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. #import "proj_api.h"
  28. #import "RMTransform.h"
  29. #import "RMProjection.h"
  30. @implementation RMTransform
  31. -(id) initFrom: (RMProjection*)_source To: (RMProjection*)_dest
  32. {
  33. if (![super init])
  34. return nil;
  35. source = [_source retain];
  36. destination = [_dest retain];
  37. is_source_latlong = pj_is_latlong(source.internalProjection);
  38. is_dest_latlong = pj_is_latlong(destination.internalProjection);
  39. if (source == nil || destination == nil)
  40. {
  41. [self release];
  42. return nil;
  43. }
  44. return self;
  45. }
  46. -(void) dealloc
  47. {
  48. [source release];
  49. [destination release];
  50. [super dealloc];
  51. }
  52. -(CLLocationCoordinate2D) projectForward: (CLLocationCoordinate2D)point AtZoom: (double)z
  53. {
  54. double zo = z;
  55. if (is_source_latlong)
  56. {
  57. point.latitude *= DEG_TO_RAD;
  58. point.longitude *= DEG_TO_RAD;
  59. }
  60. int retval = pj_transform(source.internalProjection, destination.internalProjection, 1, 0,
  61. &point.longitude, &point.latitude, &z);
  62. if (is_dest_latlong)
  63. {
  64. point.latitude *= RAD_TO_DEG;
  65. point.longitude *= RAD_TO_DEG;
  66. }
  67. if (z != zo)
  68. {
  69. RMLog(@"z changed....");
  70. }
  71. if (retval != 0)
  72. { // This should be fixed to handle these errors...
  73. RMLog(@"Error occured during pj_transform: %s", pj_strerrno(retval));
  74. }
  75. return point;
  76. }
  77. -(CLLocationCoordinate2D) projectInverse: (CLLocationCoordinate2D)point AtZoom: (double)z
  78. {
  79. pj_transform(destination.internalProjection, source.internalProjection, 1, 0,
  80. &point.longitude,&point.latitude,&z);
  81. return point;
  82. }
  83. @end