百度地图常用功能

参考:http://www.jianshu.com/p/9f00911bf530

前言:以前做项目用高德地图SDK,需要注册账号和AppID,然后下载SDK集成到项目中,比较麻烦,看了下苹果自带的MapKit框架,感觉挺好用,官方文档也介绍得很详细,实现地图的显示、显示用户当前位置、放置大头针、弹出气泡等基本功能。希望能帮到刚接触MapKit的朋友~干货点这里

导入主头文件:

#import

MapKit框架使用须知:

MapKit框架中所有数据类型的前缀都是MK。

MapKit有一个比较重要的UI控件 :MKMapView,专门用于地图显示。

跟踪显示用户的位置

设置MKMapView的userTrackingMode属性可以跟踪显示用户的当前位置

MKUserTrackingModeNone:不跟踪用户的位置              

MKUserTrackingModeFollow:跟踪并在地图上显示用户的当前位置

MKUserTrackingModeFollowWithHeading:跟踪并在地图上显示用户的当前位置,地图会跟随用户的前进方向进行旋转                                                                                      

蓝色发光圆点就是用户的当前位置                                                                                     蓝色发光原点,专业术语叫做“大头针”

地图的类型

可以通过设置MKMapView的mapType设置地图类型                           MKMapTypeStandard:普通地图

MKMapTypeSatellite:卫星云图

MKMapTypeHybrid:混合模式(普通地图覆盖于卫星云图之上)

MKMapTypeSatelliteFlyover:3D立体卫星(iOS9.0)

MKMapTypeHybridFlyover:3D立体混合(iOS9.0)

设置地图的其他属性

1.操作项:

<1.>是否可缩放 :zoomEnabled

<2.>是否可滚动 :scrollEnabled

<3.>是否可旋转 :rotateEnabled

2.显示项:

<1.>是否显示指南针 :showsCompass (iOS9.0)

<2.>是否显示比例尺 :showsScale (iOS9.0)

<3.>是否显示交通 :showsTraffic (iOS9.0)

<4.>是否显示建筑 :showsBuildings

使用注意:设置对应的属性时,注意该属性是从哪个系统版本开始引入的,做好不同系统版本的适配

 


 

追踪用户的位置

设置MKMapView的userTrackingMode属性可以跟踪显示用户的当前位置

MKUserTrackingModeNone:不跟踪用户的位置

MKUserTrackingModeFollow:跟踪并在地图上显示用户的当前位置

MKUserTrackingModeFollowWithHeading:跟踪并在地图上显示用户的当前位置,地图会跟随用户的前进方向进行旋转

注意:iOS8.0之后,追踪用户位置需要用户进行定位授权

备注:

iOS8.0-,地图不会自动滚动到用户所在位置

iOS8.0+,地图会自动放大到合适比例,并显示出用户位置

MKMapView的代理

MKMapView可以设置一个代理对象,用来监听地图的相关行为

常见的代理方法有

1.调用非常频繁,不断监测用户的当前位置每次调用,都会把用户的最新位置(userLocation参数)传进来                                                                                                              - (void)mapView:(MKMapView*)mapViewdidUpdateUserLocation:(MKUserLocation*)userLocation;

2.地图的显示区域即将发生改变的时候调用                                                                        - (void)mapView:(MKMapView*)mapViewregionWillChangeAnimated:(BOOL)animated;

3.地图的显示区域已经发生改变的时候调用                                                                      - (void)mapView:(MKMapView*)mapViewregionDidChangeAnimated:(BOOL)animated;

MKUserLocation(MKUserLocation其实是个大头针模型,包括以下属性)

@property(nonatomic,copy)NSString*title;显示在大头针上的标题

@property(nonatomic,copy)NSString*subtitle;显示在大头针上的子标题

@property(readonly,nonatomic)CLLocation*location;地理位置信息(大头针钉在什么地方?)

设置地图的显示

通过MKMapView的下列方法,可以设置地图显示的位置和区域

1.设置地图的中心点位置          @property(nonatomic)CLLocationCoordinate2DcenterCoordinate;

- (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate animated:(BOOL)animated;

2.设置地图的显示区域                                           @property(nonatomic)MKCoordinateRegionregion;                                                                - (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated;

 


 

 

大头针的基本操作

添加一个大头针:- (void)addAnnotation:(id)annotation;

添加多个大头针:- (void)addAnnotations:(NSArray*)annotations;

移除一个大头针:- (void)removeAnnotation:(id)annotation;

移除多个大头针:- (void)removeAnnotations:(NSArray*)annotations;

(id)annotation参数是什么东西?                                                                                       大头针模型对象:用来封装大头针的数据,比如大头针的位置、标题、子标题等数据

大头针模型

新建一个大头针模型类

#import

@interfaceMJTuangouAnnotation :NSObject

/**坐标位置*/                    @property(nonatomic,assign)CLLocationCoordinate2Dcoordinate;

/**标题*/                                                              @property(nonatomic,copy)NSString*title;

/**子标题*/                                                      @property(nonatomic,copy)NSString*subtitle;

@end

添加大头针

EdTuangouAnnotation*anno = [[MJTuangouAnnotationalloc]init];

anno.title=@"热爱iOS的狗";

anno.subtitle=@"全部课程15折,会员20折,老学员30折";

anno.coordinate=CLLocationCoordinate2DMake(40,116);

[self.mapViewaddAnnotation:anno];

MKAnnotationView:地图上的大头针控件是MKAnnotationView

MKAnnotationView的属性

@property(nonatomic,strong)id annotation :大头针模型

@property(nonatomic,strong)UIImage*image:显示的图片

@property(nonatomic)BOOLcanShowCallout:是否显示标注

@property(nonatomic)CGPointcalloutOffset:标注的偏移量

@property(strong,nonatomic)UIView*rightCalloutAccessoryView:标注右边显示什么控件

@property(strong,nonatomic)UIView*leftCalloutAccessoryView:标注左边显示什么控件

MKPinAnnotationView

MKPinAnnotationView是MKAnnotationView的子类

MKPinAnnotationView比MKAnnotationView多了2个属性

@property(nonatomic)MKPinAnnotationColorpinColor:大头针颜色

@property(nonatomic)BOOLanimatesDrop:大头针第一次显示时是否从天而降


 

 

MKMapItem调用系统APP进行导航

主要方法:[MKMapItem openMapsWithItems:items launchOptions:md];

示例代码

1.根据两个地标对象进行调用系统导航                                                                                         - (void)beginNavWithBeginPlacemark:(CLPlacemark*)beginPlacemark andEndPlacemark:(CLPlacemark *)endPlacemark

{

2.创建起点:根据CLPlacemark地标对象创建MKPlacemark地标对象                                   MKPlacemark *itemP1 = [[MKPlacemark alloc]

initWithPlacemark:beginPlacemark];

MKMapItem *item1 = [[MKMapItem alloc]initWithPlacemark:itemP1];

3.创建终点:根据CLPlacemark地标对象创建MKPlacemark地标对象                                 MKPlacemark *itemP2 = [[MKPlacemark alloc]initWithPlacemark:endPlacemark];

MKMapItem *item2 = [[MKMapItem alloc]initWithPlacemark:itemP2];

NSDictionary *launchDic = @{

4.设置导航模式参数                                                              MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving,

5.设置地图类型                                                                              MKLaunchOptionsMapTypeKey :@(MKMapTypeHybridFlyover),

6.设置是否显示交通

MKLaunchOptionsShowsTrafficKey : @(YES),

};

7.根据MKMapItem数组和启动参数字典来调用系统地图进行导航

[MKMapItem openMapsWithItems:@[item1, item2]

launchOptions:launchDic];

}

MKMapCamera地图街景

主要方法:self.mapView.camera = camera;

示例代码

1.创建视角中心坐标:CLLocationCoordinate2D

center = CLLocationCoordinate2DMake(23.132931, 113.375924);

2.创建3D视角:

MKMapCamera *camera = [MKMapCameracameraLookingAtCenterCoordinate:center

fromEyeCoordinate:CLLocationCoordinate2DMake(center.latitude + 0.001,

center.longitude + 0.001) eyeAltitude:1];

3.设置到地图上显示:self.mapView.camera = camera;

MKMapSnapshotter地图截图

1.主要方法

[snapshotter startWithCompletionHandler:^(MKMapSnapshot

* _Nullable snapshot, NSError * _Nullable error) { }];

示例代码

截图附加选项:MKMapSnapshotOptions *options = [[MKMapSnapshotOptions alloc] init];

1.设置截图区域(在地图上的区域,作用在地图):

options.region =self.mapView.region;

options.mapRect =self.mapView.visibleMapRect;

2.设置截图后的图片大小(作用在输出图像)

options.size =self.mapView.frame.size;

3.设置截图后的图片比例(默认是屏幕比例,作用在输出图像)

options.scale = [[UIScreen mainScreen] scale];

MKMapSnapshotter *snapshotter = [[MKMapSnapshotter alloc]

initWithOptions:options];

[snapshotter startWithCompletionHandler:^(MKMapSnapshot *_Nullablesnapshot,

NSError*_Nullableerror) {

if(error) {

NSLog(@"截图错误:%@",error.localizedDescription);

}else

{

4.设置屏幕上图片显示

self.snapshootImageView.image = snapshot.image;

将图片保存到指定路径(此处是桌面路径,需要根据个人电脑不同进行修改)

NSData *data = UIImagePNGRepresentation(snapshot.image);

[data writeToFile:@"/Users/wangshunzi/Desktop/snap.png"atomically:YES];

}

}];

MKDirections获取导航路线信息

主要方法

[directions calculateDirectionsWithCompletionHandler:

^(MKDirectionsResponse * _Nullable response,

NSError * _Nullable error) {

}];

绘制路线,添加覆盖层等

主要方法:(这里不像添加大头针那样,只要我们添加了大头针模型,默认就会在地图上添加系统的大头针视图)

1.添加覆盖层,需要我们实现对应的代理方法,在代理方法中返回对应的覆盖层[self.mapViewaddOverlay:overlay];

2.调用了以上方法后,会调用以下代理方法获取对应的渲染涂层                                                     -(MKOverlayRenderer *)mapView:(MKMapView*)mapView rendererForOverlay:(id)overlay



文/百度工程师阿伟(简书作者)
原文链接:http://www.jianshu.com/p/9f00911bf530
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
posted @ 2016-05-24 11:38  勇猛的小黑  阅读(2607)  评论(0编辑  收藏  举报