iOS_基于百度地图的开发

iOS_百度地图 步骤:

1.申请百度地图key.    http://lbsyun.baidu.com/apiconsole/key

2.下载百度开发包.      http://api.map.baidu.com/lbsapi/cloud/sdkiosdev-download.htm

3.新建项目.这部分设计添加lib以及资源文件,参考百度的IOS api开发指南做就行,那些内容已经在201310月份更新过了,照着里面做就能顺利通过编译。


4.ViewController.m改成.mm


5.在委托中.h文件中中加入

#import "BMapKit.h"

并声明变量

BMKMapManager* _mapManager;

.m委托中加入

_mapManager = [[BMKMapManager alloc]init];

// 如果要关注网络及授权验证事件,请设定 generalDelegate参数

BOOL ret = [_mapManager start:@"3102732B30E0D66EF51415C9E6CE055EC78FF07E" generalDelegate:nil];

if (!ret) {

    NSLog(@"manager start failed!");

}



6.注意:

在这里就开始运行程序的话,会出现[UIDevice uniqueGlobalDeviceIdentifier]: unrecognized selector sent to instance0x1ed19370

这么一个bug,解决办法很多,之一:加入4个文件NSString+MD5AdditionUIDevice+IdentifierAddition,直接加入到项目里面就可以,无需引入头文件

下载地址 http://www.kuaipan.cn/file/id_30491149655344975.htm


7.viewController.mm中的viewDidLoad改为如下代码

- (void)viewDidLoad

{

    [superviewDidLoad];

    BMKMapView* mapView = [[BMKMapView alloc]initWithFrame:CGRectMake(0,0, 320, 548)];

   self.view = mapView;

    // Do any additional setup after loading the view, typically from a nib.

}

保存后运行,一个简单的百度地图API应用就完成了

源代码下载http://www.kuaipan.cn/file/id_30491149655344976.htm



扩展:


1.功能五,搜索,用的很广泛,这个功能很强大,你可以搜索某一坐标点附近的加油站,停车场,宾馆,酒店,餐厅,甚至厕所都能搜索到,比如说你想查找5000米内的加油站,以及1000米内的停车场。

flag = [_search  poiSearchNearBy:@"加油站" center:coor1 radius:5000 pageIndex:0];

flag = [_search  poiSearchNearBy:@"停车场" center:coor1 radius:1000 pageIndex:0];

然后用委托

-(void)onGetPoiResult:(NSArray*)poiResultList searchType:(int)type errorCode:(int)error

输出结果。

2.将百度地图视角切换到某一坐标点

-(void)Region{

    CLLocationCoordinate2D coor;

    coor.latitude =self._latitude;

    coor.longitude =self._longitude;

   NSDictionary *tip =  BMKBaiduCoorForWgs84(coor);

    CLLocationCoordinate2D coor1=  BMKCoorDictionaryDecode(tip);

    BMKCoordinateRegion viewRegion = BMKCoordinateRegionMake(coor1, BMKCoordinateSpanMake(0.05,0.05));

    BMKCoordinateRegion adjustedRegion = [_mapView regionThatFits:viewRegion];

    [_mapView setRegion:adjustedRegion animated:YES];

}

3.清除地图上所有痕迹和路线

-(void)clereOldYJDH{

   NSArray* array = [NSArray arrayWithArray:_mapView.annotations];

    [_mapView removeAnnotations:array];

    array = [NSArray arrayWithArray:_mapView.overlays];

    [_mapView removeOverlays:array];

    [self Region];

}

//当选中一个annotation views时,调用此接口

- (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)view

{

    NSLog(@"选中一个annotation views:%f,%f",view.annotation.coordinate.latitude,view.annotation.coordinate.longitude);

}

//当取消选中一个annotation views时,调用此接口

- (void)mapView:(BMKMapView *)mapView didDeselectAnnotationView:(BMKAnnotationView *)view{

    NSLog(@"取消选中一个annotation views");

}

//mapView新添加annotation views时,调用此接口

- (void)mapView:(BMKMapView *)mapView didAddAnnotationViews:(NSArray *)views

{

    NSLog(@"mapView新添加annotation views");

}

//当点击annotation view弹出的泡泡时,调用此接口

- (void)mapView:(BMKMapView *)mapView annotationViewForBubble:(BMKAnnotationView *)view

{

    NSLog(@"点击annotation view弹出的泡泡");

}

//拖动annotation viewview的状态变化

-(void)mapView:(BMKMapView*)mapView annotationView:(BMKAnnotationView *)view didChangeDragState:(BMKAnnotationViewDragState)newStatefromOldState:(BMKAnnotationViewDragState)oldState

{

    NSLog(@"annotation viewview的状态变化");

}

//标注呈绿色样式大头钉

((BMKPinAnnotationView *)annotationView).pinColor = BMKPinAnnotationColorGreen;

//允许用户拖动

[annotationView setDraggable:YES];

//气泡框左侧显示的View,可自定义

annotationView.leftCalloutAccessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_location.png"]];

//气泡框右侧显示的View可自定义

annotationView.rightCalloutAccessoryView =selectButton;

//让标注在进入界面时就处于弹出气泡框的状态

[annotationView setSelected:YES animated:YES];

//整个标注的偏移量

annotationView.centerOffset = CGPointMake(0, -(annotationView.frame.size.height *0.5));

annotationView.annotation = annotation;//绑定对应的标点经纬度

annotationView.canShowCallout =TRUE;//允许点击弹出气泡框



4.在地图上定制标注替代大头钉,可以将文字图片所有能加到view中的,都可以以大头钉的形式显示出来,需要将view转换为image主要代码,最重要的是知道这个原理,然后实现起来就很简单:

- (BMKAnnotationView *)mapView:(BMKMapView *)view viewForAnnotation:(id <BMKAnnotation>)annotation

在这个委托中实现如下代码

UIView *viewForImage=[[UIView alloc]initWithFrame:CGRectMake(0,0, 132, 64)];

UIImageView *imageview=[[UIImageViewalloc]initWithFrame:CGRectMake(0,0, 32,64)];

[imageview setImage:[UIImage imageNamed:@"车位置.png"]];

[viewForImage addSubview:imageview];


UILabel *label=[[UILabelalloc]initWithFrame:CGRectMake(32,0, 100,64)];

label.text=@"陈双超";

label.backgroundColor=[UIColor clearColor];

[viewForImage addSubview:label];

annotationView.image=[self getImageFromView:viewForImage];



-(UIImage *)getImageFromView:(UIView *)view{

    UIGraphicsBeginImageContext(view.bounds.size);

    [view.layerrenderInContext:UIGraphicsGetCurrentContext()];

    UIImage *image =UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

   return image;

}


在网上发现别人专门建立view来定制气泡和专门建立文件来定制大头钉,觉得那方法对代码管理起来更简单,可读性强。

http://www.kuaipan.cn/file/id_30491149655345085.htm

@interface KYBubbleView : UIScrollView {  //UIView是气泡view的本质

    NSDictionary *_infoDict;

    UILabel         *titleLabel;//标题label

    UILabel         *detailLabel;//副标题label

    UILabel         *contactLabel;   //联系人

    UILabel         *homeAddresslabel;  //家庭地址

    UIButton        *rightButton;

    NSUInteger      index;

}

#import "BMKPointAnnotation.h"


@interface KYPointAnnotation : BMKPointAnnotation {

    NSUInteger _tag;

}


@property NSUInteger tag;


@end

扩展: 当前为iOS提供的SKD版本为1.2.1,这里主要讲一下这个版本存在的一些问题,以及开发注意事项。


1.  BMKMapView是百度地图类,当创建多个BMKMapView对象时,这些对象会共享一些数据(没有仔细研究具体共享哪些数据),因此会产生以下问题:

    A. 当对其中一个BMKMapView通过手势来进行放大、缩小、移动等操作时,其他的BMKMapView对象会自动进行放大、缩小、移动。

    B. 启动应用程序时,首先显示出来的BMKMapView可以得到用户的当前位置,其他的BMKMapView可能要等一段时间或者完全无法得到用户当前的位置。


2.  为了解决1.B中的问题,可以只使用一个BMKMapView对象,比如在两个不同的UIView中共享同一个BMKMapView对象。此外,有一个方法可以基本上解决1.A的问题。假设UIView AUIView B均有BMKMapView(可以为不同或同一个对象),在UIView AUIVIew B之间进行切换时,记录下各自当前BMKMapViewFrame,然后在显示的时候再通过设置Frame来恢复到切换前的状态。这个方法的缺点是,在切换很快的时候,ViewDidAppear不一定会被调用,ViewWillDisapper的调用顺序不确定,不过可以满足普通操作的要求。


3.  BMKSearch提供了搜索、地址解析等功能。百度通过回调来响应搜索结果,关键的问题是,有时回调并不会被调用(个人感觉是BMKSearch之后,百度的SDK无法正确找到回调函数,比如处于不同的线程等等)。为了能让百度SDK正确找到回调,建议如下:


    A. 在没有得到回调之前,不要释放BMKSearch对象,最好做成全局对象。(必须)

    B. 在搜索路线时,如果起始位置是通过经纬度来表示的,那么节点信息中除了设置经纬度pt信息外,一定要设置name信息(不能为空字符串)。(必须)

    C. 不能同时进行多个搜索。(必须)

    D. 在每次通过BMKSearch对象进行搜索之前,最好是将其delegate设置为nil,然后进行release,然后再alloc,然后再进行搜索。(强烈建议)

    E. 所有的搜索的操作均不要通过委托或其他线程的回调等等来发起,应该是由本对象主动发起,并且本对象作为搜索代理,这样百度SDK才能正确找到回调函数。(强烈建议)


4.  有时需要判断当前用户经纬度是否是在国内,可以通过BMKSearch的地址反解析之后的回调来判断,如果返回的错误码为BMKErrorResultNotFound,那么有可能不在国内,因为其他的原因也可能导致返回此错误码。


5.  其实,最好的解决方法是采用AutoNavi高德地图api,如果是iOS6,那么直接可以直接使用MKMapView,其采用的就是AutoNavi接口。目前AutoNavi接口不足之处是没有步行路线,据说还在开发中,相信以后会支持的。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值