MAGeometry.h 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. //
  2. // MAGeometry.h
  3. // MAMapKit
  4. //
  5. // Created by AutoNavi.
  6. // Copyright (c) 2013年 AutoNavi. All rights reserved.
  7. //
  8. #import <CoreGraphics/CoreGraphics.h>
  9. #import <CoreLocation/CoreLocation.h>
  10. #import <UIKit/UIKit.h>
  11. #ifdef __cplusplus
  12. extern "C" {
  13. #endif
  14. typedef struct {
  15. CLLocationCoordinate2D northEast;
  16. CLLocationCoordinate2D southWest;
  17. } MACoordinateBounds;
  18. typedef struct {
  19. CLLocationDegrees latitudeDelta;
  20. CLLocationDegrees longitudeDelta;
  21. } MACoordinateSpan;
  22. typedef struct {
  23. CLLocationCoordinate2D center;
  24. MACoordinateSpan span;
  25. } MACoordinateRegion;
  26. static inline MACoordinateBounds MACoordinateBoundsMake(CLLocationCoordinate2D northEast,CLLocationCoordinate2D southWest)
  27. {
  28. return (MACoordinateBounds){northEast, southWest};
  29. }
  30. static inline MACoordinateSpan MACoordinateSpanMake(CLLocationDegrees latitudeDelta, CLLocationDegrees longitudeDelta)
  31. {
  32. return (MACoordinateSpan){latitudeDelta, longitudeDelta};
  33. }
  34. static inline MACoordinateRegion MACoordinateRegionMake(CLLocationCoordinate2D centerCoordinate, MACoordinateSpan span)
  35. {
  36. return (MACoordinateRegion){centerCoordinate, span};
  37. }
  38. /*!
  39. @brief 生成一个新的MACoordinateRegion
  40. @param centerCoordinate 中心点坐标
  41. @param latitudinalMeters 垂直跨度(单位 米)
  42. @param longitudinalMeters 水平跨度(单位 米)
  43. @return 新的MACoordinateRegion
  44. */
  45. extern MACoordinateRegion MACoordinateRegionMakeWithDistance(CLLocationCoordinate2D centerCoordinate, CLLocationDistance latitudinalMeters, CLLocationDistance longitudinalMeters);
  46. /** 平面投影坐标结构定义 */
  47. typedef struct {
  48. double x;
  49. double y;
  50. } MAMapPoint;
  51. /** 平面投影大小结构定义 */
  52. typedef struct {
  53. double width;
  54. double height;
  55. } MAMapSize;
  56. /** 平面投影矩形结构定义 */
  57. typedef struct {
  58. MAMapPoint origin;
  59. MAMapSize size;
  60. } MAMapRect;
  61. /**
  62. 比例关系:MAZoomScale = Screen Point / MAMapPoint, 当MAZoomScale = 1时, 1 screen point = 1 MAMapPoint, 当MAZoomScale = 0.5时, 1 screen point = 2 MAMapPoints
  63. */
  64. typedef double MAZoomScale;
  65. /*!
  66. const常量定义
  67. */
  68. extern const MAMapSize MAMapSizeWorld;
  69. extern const MAMapRect MAMapRectWorld;
  70. extern const MAMapRect MAMapRectNull;
  71. extern const MAMapRect MAMapRectZero;
  72. /*!
  73. @brief 经纬度坐标转平面投影坐标
  74. @param coordinate 要转化的经纬度坐标
  75. @return 平面投影坐标
  76. */
  77. extern MAMapPoint MAMapPointForCoordinate(CLLocationCoordinate2D coordinate);
  78. /*!
  79. @brief 平面投影坐标转经纬度坐标
  80. @param mapPoint 要转化的平面投影坐标
  81. @return 经纬度坐标
  82. */
  83. extern CLLocationCoordinate2D MACoordinateForMapPoint(MAMapPoint mapPoint);
  84. /*!
  85. @brief 平面投影矩形转region
  86. @param mapPoint 要转化的平面投影矩形
  87. @return region
  88. */
  89. extern MACoordinateRegion MACoordinateRegionForMapRect(MAMapRect rect);
  90. /*!
  91. @brief region转平面投影矩形
  92. @param region 要转化的region
  93. @return 平面投影矩形
  94. */
  95. extern MAMapRect MAMapRectForCoordinateRegion(MACoordinateRegion region);
  96. /*!
  97. @brief 单位投影的距离
  98. */
  99. extern CLLocationDistance MAMetersPerMapPointAtLatitude(CLLocationDegrees latitude);
  100. /*!
  101. @brief 1米对应的投影
  102. */
  103. extern double MAMapPointsPerMeterAtLatitude(CLLocationDegrees latitude);
  104. /*!
  105. @brief 投影两点之间的距离
  106. */
  107. extern CLLocationDistance MAMetersBetweenMapPoints(MAMapPoint a, MAMapPoint b);
  108. /*!
  109. @brief 经纬度间的面积(单位 平方米)
  110. */
  111. extern double MAAreaBetweenCoordinates(CLLocationCoordinate2D northEast, CLLocationCoordinate2D southWest);
  112. /*!
  113. @brief 获取Inset后的MAMapRect
  114. */
  115. extern MAMapRect MAMapRectInset(MAMapRect rect, double dx, double dy);
  116. /*!
  117. @brief 合并两个MAMapRect
  118. */
  119. extern MAMapRect MAMapRectUnion(MAMapRect rect1, MAMapRect rect2);
  120. /*!
  121. @brief 判断size1是否包含size2
  122. */
  123. extern BOOL MAMapSizeContainsSize(MAMapSize size1, MAMapSize size2);
  124. /*!
  125. @brief 判断点是否在矩形内
  126. */
  127. extern BOOL MAMapRectContainsPoint(MAMapRect rect, MAMapPoint point);
  128. /*!
  129. @brief 判断两矩形是否相交
  130. */
  131. extern BOOL MAMapRectIntersectsRect(MAMapRect rect1, MAMapRect rect2);
  132. /*!
  133. @brief 判断矩形rect1是否包含矩形rect2
  134. */
  135. extern BOOL MAMapRectContainsRect(MAMapRect rect1, MAMapRect rect2);
  136. /*!
  137. @brief 判断点是否在圆内
  138. */
  139. extern BOOL MACircleContainsPoint(MAMapPoint point, MAMapPoint center, double radius);
  140. /*!
  141. @brief 判断经纬度点是否在圆内
  142. */
  143. extern BOOL MACircleContainsCoordinate(CLLocationCoordinate2D point, CLLocationCoordinate2D center, double radius);
  144. /*!
  145. @brief 判断点是否在多边形内
  146. */
  147. extern BOOL MAPolygonContainsPoint(MAMapPoint point, MAMapPoint *polygon, NSUInteger count);
  148. /*!
  149. @brief 判断经纬度点是否在多边形内
  150. */
  151. extern BOOL MAPolygonContainsCoordinate(CLLocationCoordinate2D point, CLLocationCoordinate2D *polygon, NSUInteger count);
  152. /*!
  153. 获取在lineStart和lineEnd组成的线段上距离point距离最近的点.
  154. @param lineStart 线段起点.
  155. @param lineEnd 线段终点.
  156. @param point 测试点.
  157. @return 距离point最近的点坐标.
  158. */
  159. extern MAMapPoint MAGetNearestMapPointFromLine(MAMapPoint lineStart, MAMapPoint lineEnd, MAMapPoint point);
  160. /*!
  161. 获取墨卡托投影切块回调block,如果是无效的映射,则返回(-1, -1, 0, 0, 0, 0).
  162. @param offsetX 左上点距离所属tile的位移X, 单位像素.
  163. @param offsetY 左上点距离所属tile的位移Y, 单位像素.
  164. @param minX 覆盖tile的最小x.
  165. @param maxX 覆盖tile的最大x.
  166. @param minY 覆盖tile的最小y.
  167. @param maxY 覆盖tile的最大y.
  168. */
  169. typedef void (^AMapTileProjectionBlock)(int offsetX, int offsetY, int minX, int maxX, int minY, int maxY);
  170. /*!
  171. 根据所给经纬度区域获取墨卡托投影切块信息.
  172. @param bounds 经纬度区域.
  173. @param levelOfDetails 对应缩放级别, 取值0-20。
  174. @param tileProjection 返回的切块信息block.
  175. */
  176. extern void MAGetTileProjectionFromBounds(MACoordinateBounds bounds, int levelOfDetails, AMapTileProjectionBlock tileProjection);
  177. static inline MAMapPoint MAMapPointMake(double x, double y)
  178. {
  179. return (MAMapPoint){x, y};
  180. }
  181. static inline MAMapSize MAMapSizeMake(double width, double height)
  182. {
  183. return (MAMapSize){width, height};
  184. }
  185. static inline MAMapRect MAMapRectMake(double x, double y, double width, double height)
  186. {
  187. return (MAMapRect){MAMapPointMake(x, y), MAMapSizeMake(width, height)};
  188. }
  189. static inline double MAMapRectGetMinX(MAMapRect rect)
  190. {
  191. return rect.origin.x;
  192. }
  193. static inline double MAMapRectGetMinY(MAMapRect rect)
  194. {
  195. return rect.origin.y;
  196. }
  197. static inline double MAMapRectGetMidX(MAMapRect rect)
  198. {
  199. return rect.origin.x + rect.size.width / 2.0;
  200. }
  201. static inline double MAMapRectGetMidY(MAMapRect rect)
  202. {
  203. return rect.origin.y + rect.size.height / 2.0;
  204. }
  205. static inline double MAMapRectGetMaxX(MAMapRect rect)
  206. {
  207. return rect.origin.x + rect.size.width;
  208. }
  209. static inline double MAMapRectGetMaxY(MAMapRect rect)
  210. {
  211. return rect.origin.y + rect.size.height;
  212. }
  213. static inline double MAMapRectGetWidth(MAMapRect rect)
  214. {
  215. return rect.size.width;
  216. }
  217. static inline double MAMapRectGetHeight(MAMapRect rect)
  218. {
  219. return rect.size.height;
  220. }
  221. static inline BOOL MAMapPointEqualToPoint(MAMapPoint point1, MAMapPoint point2) {
  222. return point1.x == point2.x && point1.y == point2.y;
  223. }
  224. static inline BOOL MAMapSizeEqualToSize(MAMapSize size1, MAMapSize size2) {
  225. return size1.width == size2.width && size1.height == size2.height;
  226. }
  227. static inline BOOL MAMapRectEqualToRect(MAMapRect rect1, MAMapRect rect2) {
  228. return
  229. MAMapPointEqualToPoint(rect1.origin, rect2.origin) &&
  230. MAMapSizeEqualToSize(rect1.size, rect2.size);
  231. }
  232. static inline BOOL MAMapRectIsNull(MAMapRect rect) {
  233. return isinf(rect.origin.x) || isinf(rect.origin.y);
  234. }
  235. static inline BOOL MAMapRectIsEmpty(MAMapRect rect) {
  236. return MAMapRectIsNull(rect) || (rect.size.width == 0.0 && rect.size.height == 0.0);
  237. }
  238. static inline NSString *MAStringFromMapPoint(MAMapPoint point) {
  239. return [NSString stringWithFormat:@"{%.1f, %.1f}", point.x, point.y];
  240. }
  241. static inline NSString *MAStringFromMapSize(MAMapSize size) {
  242. return [NSString stringWithFormat:@"{%.1f, %.1f}", size.width, size.height];
  243. }
  244. static inline NSString *MAStringFromMapRect(MAMapRect rect) {
  245. return [NSString stringWithFormat:@"{%@, %@}", MAStringFromMapPoint(rect.origin), MAStringFromMapSize(rect.size)];
  246. }
  247. #ifdef __cplusplus
  248. }
  249. #endif
  250. @interface NSValue (NSValueMAGeometryExtensions)
  251. + (NSValue *)valueWithMAMapPoint:(MAMapPoint)mapPoint;
  252. + (NSValue *)valueWithMAMapSize:(MAMapSize)mapSize;
  253. + (NSValue *)valueWithMAMapRect:(MAMapRect)mapRect;
  254. + (NSValue *)valueWithMACoordinate:(CLLocationCoordinate2D)coordinate;
  255. - (MAMapPoint)MAMapPointValue;
  256. - (MAMapSize)MAMapSizeValue;
  257. - (MAMapRect)MAMapRectValue;
  258. - (CLLocationCoordinate2D)MACoordinateValue;
  259. @end