Map地图

作者: keelZJP | 来源:发表于2017-02-13 16:57 被阅读26次

    MapKit:用于地图展示

    CoreLocation:用于地理定位

    CoreLocation框架的使用

    CLLocationManager

    CLLocationManager的常用操作

    开始用户定位

    - (void)startUpdatingLocation;

    停止用户定位

    - (void)stopUpdatingLocation;

    当调用了startUpdatingLocation方法后,就开始不断地定位用户的位置,中途会频繁地调用代理的下面方法

    - (void)locationManager:(CLLocationManager*)managerdidUpdateLocations:(NSArray*)locations;

    locations参数里面装着CLLocation对象

    CLLocation

    CLLocation用来表示某个位置的地理信息,比如经纬度、海拔等等

    @property(readonly,nonatomic)CLLocationCoordinate2Dcoordinate;

    经纬度

    @property(readonly,nonatomic)CLLocationDistancealtitude;

    海拔

    @property(readonly,nonatomic)CLLocationDirectioncourse;

    路线,航向(取值范围是0.0°~359.9°,0.0°代表正北方向)

    @property(readonly,nonatomic)CLLocationSpeedspeed;

    行走速度(单位是m/s)

    用- (CLLocationDistance)distanceFromLocation:(constCLLocation*)location方法可以计算2个位置之间的距离

    CLLocationManager

    @property(assign,nonatomic)CLLocationDistancedistanceFilter;

    每隔多少米定位一次 例如:locationManager.distanceFilter = 1000.0f;

    @property(assign,nonatomic)CLLocationAccuracydesiredAccuracy;

    定位精确度(越精确就越耗电)例如:desiredAccuracy=10那么精确度就是10米

    CLLocationCoordinate2D

    CLLocationCoordinate2D是一个用来表示经纬度的结构体,定义如下

    typedefstruct{

    CLLocationDegreeslatitude;//纬度

    CLLocationDegreeslongitude;//经度

    } CLLocationCoordinate2D;

    一般用CLLocationCoordinate2DMake函数来创建CLLocationCoordinate2D

    用户隐私的保护

    开发者可以在Info.plist中设置NSLocationUsageDescription说明定位的目的(Privacy - Location Usage Description)

    一旦用户选择了“Don’tAllow”,意味着你的应用以后就无法使用定位功能

    为了严谨起见,最好在使用定位功能之前判断当前应用的定位功能是否可用

    CLLocationManager有个类方法可以判断当前应用的定位功能是否可用

    + (BOOL)locationServicesEnabled;

    CLGeocoder

    使用CLGeocoder可以完成“地理编码”和“反地理编码”

    地理编码:根据给定的地名,获得具体的位置信息(比如经纬度、地址的全称等)

    反地理编码:根据给定的经纬度,获得具体的位置信息

    地理编码方法

    - (void)geocodeAddressString:(NSString*)addressStringcompletionHandler:(CLGeocodeCompletionHandler)completionHandler;

    反地理编码方法

    - (void)reverseGeocodeLocation:(CLLocation*)locationcompletionHandler:(CLGeocodeCompletionHandler)completionHandler;

    CLGeocodeCompletionHandler

    当地理\反地理编码完成时,就会调用CLGeocodeCompletionHandler

    typedefvoid(^CLGeocodeCompletionHandler)(NSArray*placemarks,NSError*error);

    这个block传递2个参数

    error:当编码出错时(比如编码不出具体的信息)有值

    placemarks:里面装着CLPlacemark对象

    CLPlacemark

    CLPlacemark的字面意思是地标,封装详细的地址位置信息

    @property(nonatomic,readonly)CLLocation*location;

    地理位置

    @property(nonatomic,readonly)CLRegion*region;

    区域

    @property(nonatomic,readonly)NSDictionary*addressDictionary;

    详细的地址信息

    @property(nonatomic,readonly)NSString*name;

    地址名称

    @property(nonatomic,readonly)NSString*locality;

    城市

    MapKit框架的使用

    跟踪显示用户的位置

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

    MKUserTrackingModeNone:不跟踪用户的位置

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

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

    下图是跟踪效果

    蓝色发光圆点就是用户的当前位置

    蓝色发光原点,专业术语叫做“大头针”

    地图的类型

    可以通过设置MKMapView的mapViewType设置地图类型

    MKMapTypeStandard:普通地图(左图)

    MKMapTypeSatellite:卫星云图 (中图)

    MKMapTypeHybrid:普通地图覆盖于卫星云图之上

    MKMapView的代理

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

    常见的代理方法有

    - (void)mapView:(MKMapView*)mapViewdidUpdateUserLocation:(MKUserLocation*)userLocation;

    调用非常频繁,不断监测用户的当前位置

    每次调用,都会把用户的最新位置(userLocation参数)传进来

    - (void)mapView:(MKMapView*)mapViewregionWillChangeAnimated:(BOOL)animated;

    地图的显示区域即将发生改变的时候调用

    - (void)mapView:(MKMapView*)mapViewregionDidChangeAnimated:(BOOL)animated;

    地图的显示区域已经发生改变的时候调用

    MKUserLocation

    @property(nonatomic,copy)NSString*title;

    显示在大头针上的标题

    @property(nonatomic,copy)NSString*subtitle;

    显示在大头针上的子标题

    @property(readonly,nonatomic)CLLocation*location;

    地理位置信息

    设置地图的显示

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

    设置地图的中心点位置

    @property(nonatomic)CLLocationCoordinate2DcenterCoordinate;

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

    设置地图的显示区域

    @property(nonatomic)MKCoordinateRegionregion;

    - (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated;

    MKCoordinateRegion

    MKCoordinateRegion是一个用来表示区域的结构体,定义如下

    typedefstruct{

    CLLocationCoordinate2Dcenter;//区域的中心点位置

    MKCoordinateSpanspan;//区域的跨度

    }MKCoordinateRegion;

    MKCoordinateSpan的定义

    typedefstruct{

    CLLocationDegreeslatitudeDelta;//纬度跨度

    CLLocationDegreeslongitudeDelta;//经度跨度

    }MKCoordinateSpan;

    大头针的基本操作

    添加一个大头针

    - (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

    添加大头针

    MJTuangouAnnotation*anno = [[MJTuangouAnnotationalloc]init];

    anno.title=@“大头针";

    anno.subtitle=@“这真的是大头针";

    anno.coordinate=CLLocationCoordinate2DMake(40,116);

    [self.mapViewaddAnnotation:anno];

    自定义大头针

    如何自定义大头针

    设置MKMapView的代理

    实现下面的代理方法,返回大头针控件

    - (MKAnnotationView*)mapView:(MKMapView*)mapViewviewForAnnotation:(id)annotation;

    根据传进来的(id)annotation参数创建并返回对应的大头针控件

    代理方法的使用注意

    如果返回nil,显示出来的大头针就采取系统的默认样式

    标识用户位置的蓝色发光圆点,它也是一个大头针,当显示这个大头针时,也会调用代理方法

    因此,需要在代理方法中分清楚(id)annotation参数代表自定义的大头针还是蓝色发光圆点

    - (MKAnnotationView*)mapView:(MKMapView*)mapViewviewForAnnotation:(id)annotation

    {

    //判断annotation的类型

    if(![annotationisKindOfClass:[MJTuangouAnnotationclass]])returnnil;

    //创建MKAnnotationView

    staticNSString*ID =@"tuangou";

    MKAnnotationView*annoView= [mapViewdequeueReusableAnnotationViewWithIdentifier:ID];

    if(annoView==nil) {

    annoView= [[MKAnnotationViewalloc]initWithAnnotation:annotationreuseIdentifier:ID];

    annoView.canShowCallout=YES;

    }

    //传递模型数据

    annoView.annotation= annotation;

    //设置图片

    MJTuangouAnnotation*tuangouAnnotation= annotation;

    annoView.image= [UIImageimageNamed:tuangouAnnotation.icon];

    returnannoView;

    }

    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是MKAnnotationView的子类

    MKPinAnnotationView比MKAnnotationView多了2个属性

    @property(nonatomic)MKPinAnnotationColorpinColor;

    大头针颜色

    @property(nonatomic)BOOLanimatesDrop;

    大头针第一次显示时是否从天而降

    相关文章

      网友评论

          本文标题:Map地图

          本文链接:https://www.haomeiwen.com/subject/blltwttx.html