百度地图 - demo

时间:2024-01-02 17:32:50

项目需要集成百度地图,那么关于如何集成百度地图的事,就自己去百度开放平台查看文档吧,这是非常简单的事,在这里就不多说了。

那么下面我就说说我在这个demo里所做的事。

首先,项目需要具备定位及计算两地的距离

其次,项目需要根据两个地点来拿到所有路线,并且可根据不同的策略拿到对应的最佳路线。

最后,需要拿到打车相关信息

那么这里我就自己写了一个单例类,这是在内部处理所有的代理,外部可以非常方便地调用,如果有好的建议,请在评论中赐教,谢谢!

  1. //
  2. //  HYBBaiduMapHelper.h
  3. //  BaiduMapDemo
  4. //
  5. //  Created by 黄仪标 on 14/11/18.
  6. //  Copyright (c) 2014年 黄仪标. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. #import "BMapKit.h"
  10. typedef void (^HYBUserLocationCompletion)(BMKUserLocation *userLocation);
  11. typedef void (^HYBRouteSearchCompletion)(BMKTransitRouteResult *result);
  12. /*!
  13. * @brief 百度地图相关API操作类
  14. *
  15. * @author huangyibiao
  16. */
  17. @interface HYBBaiduMapHelper : NSObject
  18. + (HYBBaiduMapHelper *)shared;
  19. ///
  20. /// 该方法在appdelegate的调用,在应用启动时,请求授权百度地图
  21. - (BOOL)startWithAppKey:(NSString *)appKey;
  22. ///
  23. /// 下面的几个方法是定位使用
  24. - (void)locateInView:(UIView *)mapSuerView
  25. frame:(CGRect)frame
  26. withCompletion:(HYBUserLocationCompletion)completion;
  27. - (void)viewWillAppear;
  28. - (void)viewWillDisappear;
  29. - (void)viewDidDeallocOrReceiveMemoryWarning;
  30. ///
  31. /// 下面的方法是计算两地的距离
  32. /// 返回距离单位为米
  33. - (CLLocationDistance)distanceWithStartPoint:(CLLocationCoordinate2D)startPoint
  34. endPoint:(CLLocationCoordinate2D)endPoint;
  35. ///
  36. /// 下面的方法是路线规划获取操作
  37. /// 注意:不能同时调用下面的这三个方法,必须是先调用完一个,返回结果后,再继续调用别的,否则会覆盖前一个操作的数据
  38. /// 公交检索方法
  39. /// 前两个参数,分别表示起点和终点的位置名称
  40. /// 第三个参数,表示在哪个城市里检索
  41. - (void)transitRouteSearchFrom:(BMKPlanNode *)startNode
  42. to:(BMKPlanNode *)endNode
  43. city:(NSString *)city
  44. transitPolicy:(BMKTransitPolicy)transitPolicy
  45. completion:(HYBRouteSearchCompletion)completion;
  46. /// 驾乘检索方法
  47. /// 前两个参数,分别表示起点和终点的位置名称
  48. - (void)driveRouteSearchFrom:(BMKPlanNode *)startNode
  49. to:(BMKPlanNode *)endNode
  50. drivePolicy:(BMKDrivingPolicy)drivePolicy
  51. completion:(HYBRouteSearchCompletion)completion;
  52. /// 步行检索方法
  53. /// 前两个参数,分别表示起点和终点的位置名称
  54. - (void)walkRouteSearchFrom:(BMKPlanNode *)startNode
  55. to:(BMKPlanNode *)endNode
  56. completion:(HYBRouteSearchCompletion)completion;
  57. @end
  1. //
  2. //  HYBBaiduMapHelper.m
  3. //  BaiduMapDemo
  4. //
  5. //  Created by 黄仪标 on 14/11/18.
  6. //  Copyright (c) 2014年 黄仪标. All rights reserved.
  7. //
  8. #import "HYBBaiduMapHelper.h"
  9. @interface HYBBaiduMapHelper () <BMKLocationServiceDelegate,
  10. BMKGeneralDelegate,
  11. BMKMapViewDelegate,
  12. BMKRouteSearchDelegate> {
  13. BMKMapManager             *_mapManager;
  14. HYBUserLocationCompletion _locationCompletion;
  15. HYBRouteSearchCompletion  _routeSearchCompletion;
  16. BMKMapView                *_mapView;
  17. BMKLocationService        *_locationService;
  18. BMKRouteSearch            *_routeSearch;
  19. }
  20. @end
  21. @implementation HYBBaiduMapHelper
  22. + (HYBBaiduMapHelper *)shared {
  23. static HYBBaiduMapHelper *baiduMapHelper = nil;
  24. static dispatch_once_t onceToken = 0;
  25. dispatch_once(&onceToken, ^{
  26. if (!baiduMapHelper) {
  27. baiduMapHelper = [[[self class] alloc] init];
  28. }
  29. });
  30. return baiduMapHelper;
  31. }
  32. - (instancetype)init {
  33. if (self = [super init]) {
  34. _mapManager = [[BMKMapManager alloc] init];
  35. }
  36. return self;
  37. }
  38. - (BOOL)startWithAppKey:(NSString *)appKey {
  39. if (![appKey isKindOfClass:[NSString class]] || appKey.length == 0 || appKey == nil) {
  40. return NO;
  41. }
  42. return [_mapManager start:appKey generalDelegate:self];
  43. }
  44. - (void)locateInView:(UIView *)mapSuerView frame:(CGRect)frame withCompletion:(HYBUserLocationCompletion)completion {
  45. _locationCompletion = [completion copy];
  46. [_locationService stopUserLocationService];
  47. _locationService = nil;
  48. _locationService.delegate = nil;
  49. _locationService = [[BMKLocationService alloc] init];
  50. [_locationService startUserLocationService];
  51. if (_mapView) {
  52. [_mapView removeFromSuperview];
  53. _mapView = nil;
  54. }
  55. _mapView.delegate = nil;
  56. _mapView.showsUserLocation = NO;
  57. _mapView = [[BMKMapView alloc] initWithFrame:frame];
  58. [mapSuerView addSubview:_mapView];
  59. _mapView.delegate = self;
  60. // 先关闭显示的定位图层
  61. _mapView.showsUserLocation = NO;
  62. // 设置定位的状态
  63. _mapView.userTrackingMode = BMKUserTrackingModeNone;
  64. _mapView.showsUserLocation = YES;
  65. return;
  66. }
  67. - (void)viewWillAppear {
  68. [_mapView viewWillAppear];
  69. _mapView.delegate = self;
  70. _locationService.delegate = self;
  71. _routeSearch.delegate = self;
  72. return;
  73. }
  74. - (void)viewWillDisappear {
  75. [_mapView viewWillDisappear];
  76. _mapView.delegate = nil;
  77. _locationService.delegate = nil;
  78. _routeSearch.delegate = nil;
  79. return;
  80. }
  81. - (void)viewDidDeallocOrReceiveMemoryWarning {
  82. [self viewWillDisappear];
  83. _mapView.showsUserLocation = NO;
  84. [_locationService stopUserLocationService];
  85. [_mapView removeFromSuperview];
  86. _mapView = nil;
  87. _locationService = nil;
  88. _routeSearch.delegate = nil;
  89. _routeSearch = nil;
  90. return;
  91. }
  92. ///
  93. /// 计算两点的距离
  94. - (CLLocationDistance)distanceWithStartPoint:(CLLocationCoordinate2D)startPoint endPoint:(CLLocationCoordinate2D)endPoint {
  95. BMKMapPoint point1 = BMKMapPointForCoordinate(startPoint);
  96. BMKMapPoint point2 = BMKMapPointForCoordinate(endPoint);
  97. CLLocationDistance distance = BMKMetersBetweenMapPoints(point1, point2);
  98. return distance;
  99. }
  100. ///
  101. /// 下面的方法是路线规划获取操作
  102. /// 公交检索方法
  103. /// 前两个参数,分别表示起点和终点的位置名称
  104. /// 第三个参数,表示在哪个城市里检索
  105. - (void)transitRouteSearchFrom:(BMKPlanNode *)startNode
  106. to:(BMKPlanNode *)endNode
  107. city:(NSString *)city
  108. transitPolicy:(BMKTransitPolicy)transitPolicy
  109. completion:(HYBRouteSearchCompletion)completion {
  110. _routeSearchCompletion = [completion copy];
  111. if (_routeSearch == nil) {
  112. _routeSearch = [[BMKRouteSearch alloc] init];
  113. }
  114. _routeSearch.delegate = self;
  115. // 公交检索
  116. BMKTransitRoutePlanOption *transitRoutePlan = [[BMKTransitRoutePlanOption alloc] init];
  117. transitRoutePlan.city = city;
  118. transitRoutePlan.from = startNode;
  119. transitRoutePlan.to = endNode;
  120. transitRoutePlan.transitPolicy = transitPolicy;
  121. if ([_routeSearch transitSearch:transitRoutePlan]) {
  122. NSLog(@"bus检索发送成功");
  123. } else {
  124. NSLog(@"bus检索发送失败");
  125. }
  126. return;
  127. }
  128. /// 驾乘检索方法
  129. /// 前两个参数,分别表示起点和终点的位置名称
  130. - (void)driveRouteSearchFrom:(BMKPlanNode *)startNode
  131. to:(BMKPlanNode *)endNode
  132. drivePolicy:(BMKDrivingPolicy)drivePolicy
  133. completion:(HYBRouteSearchCompletion)completion {
  134. _routeSearchCompletion = [completion copy];
  135. if (_routeSearch == nil) {
  136. _routeSearch = [[BMKRouteSearch alloc] init];
  137. }
  138. _routeSearch.delegate = self;
  139. // 公交检索
  140. BMKDrivingRoutePlanOption *driveRoutePlan = [[BMKDrivingRoutePlanOption alloc] init];
  141. driveRoutePlan.from = startNode;
  142. driveRoutePlan.to = endNode;
  143. driveRoutePlan.drivingPolicy = drivePolicy;
  144. if ([_routeSearch drivingSearch:driveRoutePlan]) {
  145. NSLog(@"drive 检索发送成功");
  146. } else {
  147. NSLog(@"drive 检索发送失败");
  148. }
  149. return;
  150. }
  151. /// 步行检索方法
  152. /// 前两个参数,分别表示起点和终点的位置名称
  153. - (void)walkRouteSearchFrom:(BMKPlanNode *)startNode
  154. to:(BMKPlanNode *)endNode
  155. completion:(HYBRouteSearchCompletion)completion {
  156. _routeSearchCompletion = [completion copy];
  157. if (_routeSearch == nil) {
  158. _routeSearch = [[BMKRouteSearch alloc] init];
  159. }
  160. _routeSearch.delegate = self;
  161. // 公交检索
  162. BMKWalkingRoutePlanOption *walkRoutePlan = [[BMKWalkingRoutePlanOption alloc] init];
  163. walkRoutePlan.from = startNode;
  164. walkRoutePlan.to = endNode;
  165. if ([_routeSearch walkingSearch:walkRoutePlan]) {
  166. NSLog(@"walk 检索发送成功");
  167. } else {
  168. NSLog(@"walk 检索发送失败");
  169. }
  170. return;
  171. }
  172. #pragma mark - BMKGeneralDelegate
  173. - (void)onGetNetworkState:(int)iError {
  174. if (0 == iError) {
  175. NSLog(@"联网成功");
  176. } else {
  177. NSLog(@"onGetNetworkState %d",iError);
  178. }
  179. return;
  180. }
  181. - (void)onGetPermissionState:(int)iError {
  182. if (0 == iError) {
  183. NSLog(@"百度地图授权成功");
  184. } else {
  185. NSLog(@"onGetPermissionState %d",iError);
  186. }
  187. return;
  188. }
  189. #pragma mark - BMKLocationServiceDelegate
  190. /**
  191. *在将要启动定位时,会调用此函数
  192. */
  193. - (void)willStartLocatingUser {
  194. NSLog(@"location start");
  195. return;
  196. }
  197. /**
  198. *在停止定位后,会调用此函数
  199. */
  200. - (void)didStopLocatingUser {
  201. NSLog(@"user location stop");
  202. return;
  203. }
  204. /**
  205. *用户方向更新后,会调用此函数
  206. *@param userLocation 新的用户位置
  207. */
  208. - (void)didUpdateUserHeading:(BMKUserLocation *)userLocation {
  209. NSLog(@"user derection change");
  210. [_mapView updateLocationData:userLocation];
  211. return;
  212. }
  213. /**
  214. *用户位置更新后,会调用此函数
  215. *@param userLocation 新的用户位置
  216. */
  217. - (void)didUpdateUserLocation:(BMKUserLocation *)userLocation {
  218. NSLog(@"didUpdateUserLocation lat %f,long %f",
  219. userLocation.location.coordinate.latitude,
  220. userLocation.location.coordinate.longitude);
  221. [_mapView updateLocationData:userLocation];
  222. if (_locationCompletion) {
  223. _locationCompletion(userLocation);
  224. }
  225. [_locationService stopUserLocationService];
  226. return;
  227. }
  228. /**
  229. *定位失败后,会调用此函数
  230. *@param error 错误号
  231. */
  232. - (void)didFailToLocateUserWithError:(NSError *)error {
  233. if (_locationCompletion) {
  234. _locationCompletion(nil);
  235. }
  236. [_locationService stopUserLocationService];
  237. return;
  238. }
  239. #pragma mark - BMKRouteSearchDelegate
  240. - (void)onGetTransitRouteResult:(BMKRouteSearch *)searcher
  241. result:(BMKTransitRouteResult *)result
  242. errorCode:(BMKSearchErrorCode)error {
  243. if (error == BMK_SEARCH_NO_ERROR) { // 检索成功的处理
  244. for (BMKTransitRouteLine *line in result.routes) {
  245. NSLog(@"-----------------------------------------------------");
  246. NSLog(@"  时间:%2d %2d:%2d:%2d 长度: %d米",
  247. line.duration.dates,
  248. line.duration.hours,
  249. line.duration.minutes,
  250. line.duration.seconds,
  251. line.distance);
  252. for (BMKTransitStep *step in line.steps) {
  253. NSLog(@"%@     %@    %@    %@    %@",
  254. step.entrace.title,
  255. step.exit.title,
  256. step.instruction,
  257. (step.stepType == BMK_BUSLINE ? @"公交路段" : (step.stepType == BMK_SUBWAY ? @"地铁路段" : @"步行路段")),
  258. [NSString stringWithFormat:@"名称:%@  所乘站数:%d   全程价格:%d  区间价格:%d",
  259. step.vehicleInfo.title,
  260. step.vehicleInfo.passStationNum,
  261. step.vehicleInfo.totalPrice,
  262. step.vehicleInfo.zonePrice]);
  263. }
  264. }
  265. // 打车信息
  266. NSLog(@"打车信息------------------------------------------");
  267. NSLog(@"路线打车描述信息:%@  总路程: %d米    总耗时:约%f分钟  每千米单价:%f元  全程总价:约%d元",
  268. result.taxiInfo.desc,
  269. result.taxiInfo.distance,
  270. result.taxiInfo.duration / 60.0,
  271. result.taxiInfo.perKMPrice,
  272. result.taxiInfo.totalPrice);
  273. } else if (error == BMK_SEARCH_AMBIGUOUS_ROURE_ADDR) { // 检索地址有岐义,可获取推荐地址
  274. // 获取建议检索起终点
  275. NSLog(@"无检索结果,返回了建议检索信息");
  276. NSLog(@"起点推荐信息:--------------------------------");
  277. for (BMKPoiInfo *info in result.suggestAddrResult.startPoiList) {
  278. NSLog(@"POI名称:%@     POI地址:%@     POI所在城市:%@", info.name, info.address, info.city);
  279. }
  280. NSLog(@"终点推荐信息:--------------------------------");
  281. for (BMKPoiInfo *info in result.suggestAddrResult.endPoiList) {
  282. NSLog(@"POI名称:%@     POI地址:%@     POI所在城市:%@", info.name, info.address, info.city);
  283. }
  284. } else {
  285. NSLog(@"无公交检索结果 ");
  286. }
  287. // 回调block根据实际需要返回,可修改返回结构
  288. if (_routeSearchCompletion) {
  289. _routeSearchCompletion(nil); // 这里只是返回空,这个需要根据实际需要返回
  290. }
  291. return;
  292. }
  293. - (void)onGetDrivingRouteResult:(BMKRouteSearch *)searcher
  294. result:(BMKDrivingRouteResult *)result
  295. errorCode:(BMKSearchErrorCode)error {
  296. if (error == BMK_SEARCH_NO_ERROR) { // 检索成功的处理
  297. for (BMKDrivingRouteLine *line in result.routes) {
  298. NSLog(@"-----------------------------------------------------");
  299. NSLog(@"  时间:%2d %2d:%2d:%2d 长度: %d米",
  300. line.duration.dates,
  301. line.duration.hours,
  302. line.duration.minutes,
  303. line.duration.seconds,
  304. line.distance);
  305. for (BMKDrivingStep *step in line.steps) {
  306. NSLog(@"入口:%@   出口:%@   路段总体指示信息:%@    入口信息:%@    出口信息:%@  转弯数:%d",
  307. step.entrace.title,
  308. step.exit.title,
  309. step.instruction,
  310. step.entraceInstruction,
  311. step.exitInstruction,
  312. step.numTurns);
  313. }
  314. }
  315. } else if (error == BMK_SEARCH_AMBIGUOUS_ROURE_ADDR) { // 检索地址有岐义,可获取推荐地址
  316. // 获取建议检索起终点
  317. NSLog(@"无检索结果,返回了建议检索信息");
  318. NSLog(@"起点推荐信息:--------------------------------");
  319. for (BMKPoiInfo *info in result.suggestAddrResult.startPoiList) {
  320. NSLog(@"POI名称:%@     POI地址:%@     POI所在城市:%@", info.name, info.address, info.city);
  321. }
  322. NSLog(@"终点推荐信息:--------------------------------");
  323. for (BMKPoiInfo *info in result.suggestAddrResult.endPoiList) {
  324. NSLog(@"POI名称:%@     POI地址:%@     POI所在城市:%@", info.name, info.address, info.city);
  325. }
  326. } else {
  327. NSLog(@"无公交检索结果 ");
  328. }
  329. // 回调block根据实际需要返回,可修改返回结构
  330. if (_routeSearchCompletion) {
  331. _routeSearchCompletion(nil); // 这里只是返回空,这个需要根据实际需要返回
  332. }
  333. return;
  334. }
  335. - (void)onGetWalkingRouteResult:(BMKRouteSearch *)searcher
  336. result:(BMKWalkingRouteResult *)result
  337. errorCode:(BMKSearchErrorCode)error {
  338. if (error == BMK_SEARCH_NO_ERROR) { // 检索成功的处理
  339. for (BMKDrivingRouteLine *line in result.routes) {
  340. NSLog(@"步行检索结果 :-----------------------------------------------------");
  341. NSLog(@"  时间:%2d %2d:%2d:%2d 长度: %d米",
  342. line.duration.dates,
  343. line.duration.hours,
  344. line.duration.minutes,
  345. line.duration.seconds,
  346. line.distance);
  347. for (BMKWalkingStep *step in line.steps) {
  348. NSLog(@"入口:%@   出口:%@   路段总体指示信息:%@    入口信息:%@    出口信息:%@",
  349. step.entrace.title,
  350. step.exit.title,
  351. step.instruction,
  352. step.entraceInstruction,
  353. step.exitInstruction);
  354. }
  355. }
  356. } else if (error == BMK_SEARCH_AMBIGUOUS_ROURE_ADDR) { // 检索地址有岐义,可获取推荐地址
  357. // 获取建议检索起终点
  358. NSLog(@"无检索结果,返回了建议检索信息");
  359. NSLog(@"起点推荐信息:--------------------------------");
  360. for (BMKPoiInfo *info in result.suggestAddrResult.startPoiList) {
  361. NSLog(@"POI名称:%@     POI地址:%@     POI所在城市:%@", info.name, info.address, info.city);
  362. }
  363. NSLog(@"终点推荐信息:--------------------------------");
  364. for (BMKPoiInfo *info in result.suggestAddrResult.endPoiList) {
  365. NSLog(@"POI名称:%@     POI地址:%@     POI所在城市:%@", info.name, info.address, info.city);
  366. }
  367. } else {
  368. NSLog(@"无公交检索结果 ");
  369. }
  370. // 回调block根据实际需要返回,可修改返回结构
  371. if (_routeSearchCompletion) {
  372. _routeSearchCompletion(nil); // 这里只是返回空,这个需要根据实际需要返回
  373. }
  374. return;
  375. }
  376. @end

下面就是测试一个我们的数据是否真的拿到了:

  1. //
  2. //  RootViewController.m
  3. //  BaiduMapDemo
  4. //
  5. //  Created by 黄仪标 on 14/11/18.
  6. //  Copyright (c) 2014年 黄仪标. All rights reserved.
  7. //
  8. #import "RootViewController.h"
  9. #import "HYBBaiduMapHelper.h"
  10. #import "BMapKit.h"
  11. @interface RootViewController ()
  12. @end
  13. @implementation RootViewController
  14. - (void)viewDidLoad {
  15. [super viewDidLoad];
  16. // 功能1、定位
  17. [[HYBBaiduMapHelper shared] locateInView:self.view frame:self.view.bounds withCompletion:^(BMKUserLocation *userLocation) {
  18. NSLog(@"%f  %f", userLocation.location.coordinate.latitude, userLocation.location.coordinate.longitude);
  19. }];
  20. // 功能2:”计算距离
  21. CLLocationDistance distance = [[HYBBaiduMapHelper shared] distanceWithStartPoint:CLLocationCoordinate2DMake(39.915,116.404)
  22. endPoint:CLLocationCoordinate2DMake(38.915,115.404)];
  23. NSLog(@"distance = %fm", distance);
  24. // 功能3:公交检索
  25. BMKPlanNode *startNode = [[BMKPlanNode alloc] init];
  26. startNode.name = @"梆子井";
  27. startNode.cityName = @"北京";
  28. BMKPlanNode *endNode = [[BMKPlanNode alloc] init];
  29. endNode.name = @"金长安大厦";
  30. endNode.cityName = @"北京";
  31. // 功能3:公交检索
  32. [[HYBBaiduMapHelper shared] transitRouteSearchFrom:startNode to:endNode city:@"北京" transitPolicy:BMK_TRANSIT_TRANSFER_FIRST completion:^(BMKTransitRouteResult *result) {
  33. // 功能4:驾乘检索
  34. [[HYBBaiduMapHelper shared] driveRouteSearchFrom:startNode to:endNode drivePolicy:BMK_DRIVING_TIME_FIRST  completion:^(BMKTransitRouteResult *result) {
  35. // 功能5:步行检索
  36. [[HYBBaiduMapHelper shared] walkRouteSearchFrom:startNode to:endNode completion:^(BMKTransitRouteResult *result) {
  37. ;
  38. }];
  39. }];
  40. }];
  41. return;
  42. }
  43. - (void)viewWillAppear:(BOOL)animated {
  44. [super viewWillAppear:animated];
  45. [[HYBBaiduMapHelper shared] viewWillAppear];
  46. return;
  47. }
  48. - (void)viewWillDisappear:(BOOL)animated {
  49. [super viewWillDisappear:animated];
  50. [[HYBBaiduMapHelper shared] viewWillDisappear];
  51. return;
  52. }
  53. - (void)didReceiveMemoryWarning {
  54. [super didReceiveMemoryWarning];
  55. [[HYBBaiduMapHelper shared] viewDidDeallocOrReceiveMemoryWarning];
  56. return;
  57. }
  58. - (void)dealloc {
  59. [[HYBBaiduMapHelper shared] viewDidDeallocOrReceiveMemoryWarning];
  60. return;
  61. }
  62. @end

想要深入研究的同学,可以去官网看官方提供的Demo,

如果想在我的demo之上进一步追加或者修改功能,可以下载本demo

来源:http://blog.csdn.net/woaifen3344/article/details/41284495