BMKGeometry.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. /* BMKGeometry.h
  2. * BMapKit
  3. *
  4. * Copyright 2011 Baidu Inc. All rights reserved.
  5. *
  6. */
  7. #import <BaiduMapAPI_Base/BMKTypes.h>
  8. #import <UIKit/UIKit.h>
  9. /**
  10. *构造BMKCoordinateSpan对象
  11. *@param latitudeDelta 纬度方向的变化量
  12. *@param longitudeDelta 经度方向的变化量
  13. *@return 根据指定参数生成的BMKCoordinateSpan对象
  14. */
  15. UIKIT_STATIC_INLINE BMKCoordinateSpan BMKCoordinateSpanMake(CLLocationDegrees latitudeDelta, CLLocationDegrees longitudeDelta)
  16. {
  17. BMKCoordinateSpan span;
  18. span.latitudeDelta = latitudeDelta;
  19. span.longitudeDelta = longitudeDelta;
  20. return span;
  21. }
  22. /**
  23. *构造BMKCoordinateRegion对象
  24. *@param centerCoordinate 中心点经纬度坐标
  25. *@param span 经纬度的范围
  26. *@return 根据指定参数生成的BMKCoordinateRegion对象
  27. */
  28. UIKIT_STATIC_INLINE BMKCoordinateRegion BMKCoordinateRegionMake(CLLocationCoordinate2D centerCoordinate, BMKCoordinateSpan span)
  29. {
  30. BMKCoordinateRegion region;
  31. region.center = centerCoordinate;
  32. region.span = span;
  33. return region;
  34. }
  35. /**
  36. *根据中心点和距离生成BMKCoordinateRegion
  37. *@param centerCoordinate 中心点坐标
  38. *@param latitudinalMeters 纬度方向的距离范围,单位:米
  39. *@param longitudinalMeters 经度方向的距离范围,单位:米
  40. *@return 根据中心点和距离生成BMKCoordinateRegion
  41. */
  42. UIKIT_EXTERN BMKCoordinateRegion BMKCoordinateRegionMakeWithDistance(CLLocationCoordinate2D centerCoordinate, CLLocationDistance latitudinalMeters, CLLocationDistance longitudinalMeters);
  43. /**
  44. *将经纬度坐标转换为投影后的直角地理坐标
  45. *@param coordinate 待转换的经纬度坐标
  46. *@return 转换后的直角地理坐标
  47. */
  48. UIKIT_EXTERN BMKMapPoint BMKMapPointForCoordinate(CLLocationCoordinate2D coordinate);
  49. /**
  50. *将投影后的直角地理坐标转换为经纬度坐标
  51. *@param mapPoint 投影后的直角地理坐标
  52. *@return 转换后的经纬度坐标
  53. */
  54. UIKIT_EXTERN CLLocationCoordinate2D BMKCoordinateForMapPoint(BMKMapPoint mapPoint);
  55. /**
  56. *计算在指定纬度下一个BMKMapPoint单位对应的米数
  57. *@param latitude 指定的纬度
  58. *@return 在指定纬度下一个BMKMapPoint单位对应的米数
  59. */
  60. UIKIT_EXTERN CLLocationDistance BMKMetersPerMapPointAtLatitude(CLLocationDegrees latitude);
  61. /**
  62. *计算在指定纬度下一米对应的MKMapPoint的单位数
  63. *@param latitude 指定的纬度
  64. *@return 在指定纬度下一米对应的MKMapPoint的单位数
  65. */
  66. UIKIT_EXTERN double BMKMapPointsPerMeterAtLatitude(CLLocationDegrees latitude);
  67. /**
  68. *计算指定两点之间的距离
  69. *@param a 第一个坐标点
  70. *@param b 第二个坐标点
  71. *@return 两点之间的距离,单位:米
  72. */
  73. UIKIT_EXTERN CLLocationDistance BMKMetersBetweenMapPoints(BMKMapPoint a, BMKMapPoint b);
  74. /**
  75. *构造BMKMapPoint对象
  76. *@param x 水平方向的坐标值
  77. *@param y 垂直方向的坐标值
  78. *@return 根据指定参数生成的BMKMapPoint对象
  79. */
  80. UIKIT_STATIC_INLINE BMKMapPoint BMKMapPointMake(double x, double y) {
  81. return (BMKMapPoint){x, y};
  82. }
  83. /**
  84. *构造BMKMapSize对象
  85. *@param width 宽度
  86. *@param height 高度
  87. *@return 根据指定参数生成的BMKMapSize对象
  88. */
  89. UIKIT_STATIC_INLINE BMKMapSize BMKMapSizeMake(double width, double height) {
  90. return (BMKMapSize){width, height};
  91. }
  92. /**
  93. *构造BMKMapRect对象
  94. *@param x 矩形左上顶点的x坐标值
  95. *@param y 矩形左上顶点的y坐标值
  96. *@param width 矩形宽度
  97. *@param height 矩形高度
  98. *@return 根据指定参数生成的BMKMapRect对象
  99. */
  100. UIKIT_STATIC_INLINE BMKMapRect BMKMapRectMake(double x, double y, double width, double height) {
  101. return (BMKMapRect){ BMKMapPointMake(x, y), BMKMapSizeMake(width, height)};
  102. }
  103. /**
  104. *获取指定矩形的x轴坐标最小值
  105. *@param rect 指定的矩形
  106. *@return x轴坐标最小值
  107. */
  108. UIKIT_STATIC_INLINE double BMKMapRectGetMinX(BMKMapRect rect) {
  109. return rect.origin.x;
  110. }
  111. /**
  112. *获取指定矩形的y轴坐标最小值
  113. *@param rect 指定的矩形
  114. *@return y轴坐标最小值
  115. */
  116. UIKIT_STATIC_INLINE double BMKMapRectGetMinY(BMKMapRect rect) {
  117. return rect.origin.y;
  118. }
  119. /**
  120. *获取指定矩形在x轴中点的坐标值
  121. *@param rect 指定的矩形
  122. *@return x轴中点的坐标值
  123. */
  124. UIKIT_STATIC_INLINE double BMKMapRectGetMidX(BMKMapRect rect) {
  125. return rect.origin.x + rect.size.width / 2.0;
  126. }
  127. /**
  128. *获取指定矩形在y轴中点的坐标值
  129. *@param rect 指定的矩形
  130. *@return y轴中点的坐标值
  131. */
  132. UIKIT_STATIC_INLINE double BMKMapRectGetMidY(BMKMapRect rect) {
  133. return rect.origin.y + rect.size.height / 2.0;
  134. }
  135. /**
  136. *获取指定矩形的x轴坐标最大值
  137. *@param rect 指定的矩形
  138. *@return x轴坐标最大值
  139. */
  140. UIKIT_STATIC_INLINE double BMKMapRectGetMaxX(BMKMapRect rect) {
  141. return rect.origin.x + rect.size.width;
  142. }
  143. /**
  144. *获取指定矩形的y轴坐标最大值
  145. *@param rect 指定的矩形
  146. *@return y轴坐标最大值
  147. */
  148. UIKIT_STATIC_INLINE double BMKMapRectGetMaxY(BMKMapRect rect) {
  149. return rect.origin.y + rect.size.height;
  150. }
  151. /**
  152. *获取指定矩形的宽度
  153. *@param rect 指定的矩形
  154. *@return 指定矩形的宽度
  155. */
  156. UIKIT_STATIC_INLINE double BMKMapRectGetWidth(BMKMapRect rect) {
  157. return rect.size.width;
  158. }
  159. /**
  160. *获取指定矩形的高度
  161. *@param rect 指定的矩形
  162. *@return 指定矩形的高度
  163. */
  164. UIKIT_STATIC_INLINE double BMKMapRectGetHeight(BMKMapRect rect) {
  165. return rect.size.height;
  166. }
  167. /**
  168. *判断两个点是否相等
  169. *@param point1 第一个点
  170. *@param point2 第二个点
  171. *@return 如果两点相等,返回YES,否则返回NO
  172. */
  173. UIKIT_STATIC_INLINE BOOL BMKMapPointEqualToPoint(BMKMapPoint point1, BMKMapPoint point2) {
  174. return point1.x == point2.x && point1.y == point2.y;
  175. }
  176. /**
  177. *判断两个矩形范围是否相等
  178. *@param size1 范围1
  179. *@param size2 范围2
  180. *@return 如果相等,返回YES,否则返回NO
  181. */
  182. UIKIT_STATIC_INLINE BOOL BMKMapSizeEqualToSize(BMKMapSize size1, BMKMapSize size2) {
  183. return size1.width == size2.width && size1.height == size2.height;
  184. }
  185. /**
  186. *判断两个矩形是否相等
  187. *@param rect1 矩形1
  188. *@param rect2 矩形2
  189. *@return 如果相等,返回YES,否则返回NO
  190. */
  191. UIKIT_STATIC_INLINE BOOL BMKMapRectEqualToRect(BMKMapRect rect1, BMKMapRect rect2) {
  192. return
  193. BMKMapPointEqualToPoint(rect1.origin, rect2.origin) &&
  194. BMKMapSizeEqualToSize(rect1.size, rect2.size);
  195. }
  196. /**
  197. *判断指定矩形是否为NULL
  198. *@param rect 指定矩形
  199. *@return 如果矩形为NULL,返回YES,否则返回NO
  200. */
  201. UIKIT_STATIC_INLINE BOOL BMKMapRectIsNull(BMKMapRect rect) {
  202. return isinf(rect.origin.x) || isinf(rect.origin.y);
  203. }
  204. /**
  205. *判断一个矩形是否为空矩形
  206. *@param rect 指定矩形
  207. *@return 如果矩形为空矩形,返回YES,否则返回NO
  208. */
  209. UIKIT_STATIC_INLINE BOOL BMKMapRectIsEmpty(BMKMapRect rect) {
  210. return BMKMapRectIsNull(rect) || (rect.size.width == 0.0 && rect.size.height == 0.0);
  211. }
  212. /**
  213. *将BMKMapPoint格式化为字符串
  214. *@param point 指定的标点
  215. *@return 返回转换后的字符串
  216. */
  217. UIKIT_STATIC_INLINE NSString *BMKStringFromMapPoint(BMKMapPoint point) {
  218. return [NSString stringWithFormat:@"{%.1f, %.1f}", point.x, point.y];
  219. }
  220. /**
  221. *将BMKMapSize格式化为字符串
  222. *@param size 指定的size
  223. *@return 返回转换后的字符串
  224. */
  225. UIKIT_STATIC_INLINE NSString *BMKStringFromMapSize(BMKMapSize size) {
  226. return [NSString stringWithFormat:@"{%.1f, %.1f}", size.width, size.height];
  227. }
  228. /**
  229. *将BMKMapRect格式化为字符串
  230. *@param rect 指定的rect
  231. *@return 返回转换后的字符串
  232. */
  233. UIKIT_STATIC_INLINE NSString *BMKStringFromMapRect(BMKMapRect rect) {
  234. return [NSString stringWithFormat:@"{%@, %@}", BMKStringFromMapPoint(rect.origin), BMKStringFromMapSize(rect.size)];
  235. }
  236. /**
  237. *计算两个矩形的并集
  238. *@param rect1 矩形1
  239. *@param rect2 矩形2
  240. *@return 两个矩形的并集
  241. */
  242. UIKIT_EXTERN BMKMapRect BMKMapRectUnion(BMKMapRect rect1, BMKMapRect rect2);
  243. /**
  244. *计算两个矩形的交集
  245. *@param rect1 矩形1
  246. *@param rect2 矩形2
  247. *@return 两个矩形的交集
  248. */
  249. UIKIT_EXTERN BMKMapRect BMKMapRectIntersection(BMKMapRect rect1, BMKMapRect rect2);
  250. /**
  251. *将矩形向内缩小dx,dy大小
  252. *@param rect 指定的矩形
  253. *@param dx x轴的变化量
  254. *@param dy y轴的变化量
  255. *@return 调整后的矩形
  256. */
  257. UIKIT_EXTERN BMKMapRect BMKMapRectInset(BMKMapRect rect, double dx, double dy);
  258. /**
  259. *将矩形原点偏移指定大小
  260. *@param rect 指定的矩形
  261. *@param dx x轴的偏移量
  262. *@param dy y轴的偏移量
  263. *@return 调整后的矩形
  264. */
  265. UIKIT_EXTERN BMKMapRect BMKMapRectOffset(BMKMapRect rect, double dx, double dy);
  266. /**
  267. *矩形分割,将一个矩形分割为两个矩形
  268. *@param rect 待分割的矩形
  269. *@param slice 指针,用来保存分割后被移除的矩形
  270. *@param remainder 指针,用来保存分割后剩下的矩形
  271. *@param amount 指定分割的大小,如果设置为负数,则将自动调整为0
  272. *@param edge 用来指定要从那条边开始分割
  273. */
  274. UIKIT_EXTERN void BMKMapRectDivide(BMKMapRect rect, BMKMapRect *slice, BMKMapRect *remainder, double amount, CGRectEdge edge);
  275. /**
  276. *判断指定点是否在某矩形内
  277. *@param rect 指定的矩形
  278. *@param point 指定的点
  279. *@return 如果包含,返回YES,否则,返回NO
  280. */
  281. UIKIT_EXTERN BOOL BMKMapRectContainsPoint(BMKMapRect rect, BMKMapPoint point);
  282. /**
  283. *判断矩形rect1是否包含矩形rect2
  284. *@param rect1 矩形1
  285. *@param rect2 矩形2
  286. *@return 如果包含,返回YES,否则,返回NO
  287. */
  288. UIKIT_EXTERN BOOL BMKMapRectContainsRect(BMKMapRect rect1, BMKMapRect rect2);
  289. /**
  290. *判断两矩形是否相交
  291. *@param rect1 矩形1
  292. *@param rect2 矩形2
  293. *@return 如果相交,返回YES,否则,返回NO
  294. */
  295. UIKIT_EXTERN BOOL BMKMapRectIntersectsRect(BMKMapRect rect1, BMKMapRect rect2);
  296. /**
  297. *将投影后的直角坐标矩形转换为泳经纬度表示的范围
  298. *@param rect 待转换的直角坐标矩形
  299. *@return 转换后的经纬度范围
  300. */
  301. UIKIT_EXTERN BMKCoordinateRegion BMKCoordinateRegionForMapRect(BMKMapRect rect);
  302. /**
  303. *判断指定的直角坐标矩形是否跨越了180度经线
  304. *@param rect 待判断的矩形
  305. *@return 如果跨越,返回YES,否则返回NO
  306. */
  307. UIKIT_EXTERN BOOL BMKMapRectSpans180thMeridian(BMKMapRect rect);
  308. /**
  309. *对于跨越了180经线的矩形,本函数将世界之外的部分进行分割,并将分割下来的矩形转换到地球对面,例如将-185度经线对应的区域转换到5度经线对应的区域,并将转换后的矩形返回
  310. *@param rect 待处理的矩形
  311. *@return 返回转换后的矩形
  312. */
  313. UIKIT_EXTERN BMKMapRect BMKMapRectRemainder(BMKMapRect rect);
  314. /**
  315. *判断点是否在圆内
  316. *@param point 待判断的平面坐标点
  317. *@param center 目标圆形的中心点平面坐标
  318. *@param radius 目标圆形的半径,单位m
  319. *@return 如果在内,返回YES,否则返回NO
  320. */
  321. UIKIT_EXTERN BOOL BMKCircleContainsPoint(BMKMapPoint point, BMKMapPoint center, double radius);
  322. /**
  323. *判断点是否在圆内
  324. *@param point 待判断的经纬度坐标点
  325. *@param center 目标圆形的中心点经纬度坐标
  326. *@param radius 目标圆形的半径,单位m
  327. *@return 如果在内,返回YES,否则返回NO
  328. */
  329. UIKIT_EXTERN BOOL BMKCircleContainsCoordinate(CLLocationCoordinate2D point, CLLocationCoordinate2D center, double radius);
  330. /**
  331. *判断点是否在多边形内
  332. *@param point 待判断的平面坐标点
  333. *@param polygon 目标多边形的顶点数组
  334. *@param count 目标多边形顶点数组元素个数
  335. *@return 如果在内,返回YES,否则返回NO
  336. */
  337. UIKIT_EXTERN BOOL BMKPolygonContainsPoint(BMKMapPoint point, BMKMapPoint *polygon, NSUInteger count);
  338. /**
  339. *判断点是否在多边形内
  340. *@param point 待判断的经纬度点
  341. *@param polygon 目标多边形的顶点数组
  342. *@param count 目标多边形顶点数组元素个数
  343. *@return 如果在内,返回YES,否则返回NO
  344. */
  345. UIKIT_EXTERN BOOL BMKPolygonContainsCoordinate(CLLocationCoordinate2D point, CLLocationCoordinate2D *polygon, NSUInteger count);
  346. /**
  347. *获取折线外某点到这线上距离最近的点
  348. *@param point 待判断的经纬度点
  349. *@param polyline 目标折线的顶点数组
  350. *@param count 目标折线顶点数组元素个数
  351. *@return 返回折线上的点(距离point最近)
  352. */
  353. UIKIT_EXTERN BMKMapPoint BMKGetNearestMapPointFromPolyline(BMKMapPoint point, BMKMapPoint* polyline, NSUInteger count);
  354. /**
  355. *计算地理矩形区域的面积
  356. *@param leftTop 左上角经纬度坐标点
  357. *@param rightBottom 右下角经纬度坐标点
  358. *@return 返回区域面积,单位:平方米
  359. */
  360. UIKIT_EXTERN double BMKAreaBetweenCoordinates(CLLocationCoordinate2D leftTop, CLLocationCoordinate2D rightBottom);
  361. /**
  362. *坐标转换函数,从原始GPS坐标,mapbar坐标,google坐标,51地图坐标,mapabc坐标转换为百度坐标(51地图坐标需要显出10000)
  363. *@param coordinate 待转换的坐标
  364. *@param type 待转换的坐标系类型,GPS为原始GPS坐标,COMMON为google坐标,51地图坐标,mapabc坐标
  365. *@return 返回的NSDictionry中包含“x”,“y”字段,各自对应经过base64加密之后的x,y坐标
  366. */
  367. UIKIT_EXTERN NSDictionary* BMKConvertBaiduCoorFrom(CLLocationCoordinate2D coordinate,BMK_COORD_TYPE type);
  368. /**
  369. *base64加密后的坐标字典解密函数
  370. *@param dictionary 带解密的NSDictionry,该NSDictionry中应包含“x”,“y”字段,各自对应经过base64加密之后的x,y坐标
  371. *@return 解密之后的坐标
  372. */
  373. UIKIT_EXTERN CLLocationCoordinate2D BMKCoorDictionaryDecode(NSDictionary* dictionary);