开发者社区> 科技小毛> 正文

iOS:地图:MapKit和CoreLocation

简介:
+关注继续查看

地图:MapKit和CoreLocation


简介:
现在很多的社交软件都引入了地图和定位功能,要想实现这2大功能,那就不得不学习其中的2个框架:MaKit和CoreLocation
CoreLocation框架可以使用硬件设备来进行定位服务
MapKit框架能够使应用程序做一些地图展示与交互的相关功能
几乎所有的iOS设备都支持位置服务,不过在使用位置服务之前,最好检查一下可用性
手机定位的三种方式:手机基站、WIFI、GPS
 
添加框架:

#import <MapKit/MapKit.h>

#import <CoreLocation/CoreLocation.h>

添加显示地图的MKMapView控件 :

地图的类型 :

可以通过设置MKMapView的mapViewType设置地图类型
MKMapTypeStandard 普通地图(左图)
MKMapTypeSatellite 卫星云图 (中图)
MKMapTypeHybrid 普通地图覆盖于卫星云图之上(右图) 
 
   
MapView的代理:
MapView会将一些事件传递给它的代理(遵守MKMapViewDelegate协议),代理方法如下:
mapViewWillStartLoadingMap: 当地图界面将要加载时调用
mapView:viewForAnnotation: 当地图上有一些动画效果展示\加载时调用
mapViewWillStartLocatingUser:当准备进行一个位置定位时调用
mapView:regionDidChangeAnimated: 当显示的区域发生变化时调用
mapView:didUpdateUserLocation:当用户位置发生变化时调用
 

如何添加大头针(地标):

通过MapView的addAnnotation方法可以添加一个大头针到地图上
通过MapView的addAnnotations方法可以添加多个大头针到地图上
–(void)addAnnotation:(id <MKAnnotation>)annotation;

 

说明:需要传入一个遵守了MKAnnotation协议的对象
 
基本步骤为:
<1>新建一个遵守MKAnnotation协议的类:

@interface MyAnnotation : NSObject <MKAnnotation>

@property (nonatomic, assign) CLLocationCoordinate2D coordinate;

@property (nonatomic, copy) NSString *title;

@property (nonatomic, copy) NSString *subtitle;

@end

<2>添加Annotation:

MyAnnotation *anno = [[MyAnnotation alloc] init];

anno.title = @“中国";

anno.subtitle = @“北京;

//经度和纬度

anno.coordinate = CLLocationCoordinate2DMake(40, 110);

//添加大头针到地图中

[_mapView addAnnotation:anno];

// 让地图挪动到对应的位置(经纬度交叉处)

[_mapView setCenterCoordinate:anno.coordinate animated:YES];

 

自定义大头针:

实现MapView的代理方法

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation

{

    static NSString *ID = @"anno";

    MKPinAnnotationView *annoView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:ID];

    if (annoView == nil) {

        annoView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ID];

        // 显示气泡

        annoView.canShowCallout = YES;

        // 设置绿色

        annoView.pinColor = MKPinAnnotationColorGreen;

    }

    return annoView;

}

注意:可以通过设置MapAnnotationView的image属性来自定义大头针显示的图片
 
 
请求用户批准定位:
在iOS8,要想获得用户的位置,必须经过用户批准授权
开发者可以在Info.plist中添加两个配置项
–NSLocationAlwaysUsageDescription
–NSLocationWhenInUseUsageDescription
 
通过两个实例方法获取授权
–requestWhenInUseAuthorization
–requestAlwaysAuthorization
 
 
获得用户的位置:

// 定位管理器

_mgr = [[CLLocationManager alloc] init];

// 获取授权

[_mgr requestAlwaysAuthorization];

// 设置代理

_mgr.delegate = self;

// 设置精度

_mgr.desiredAccuracy = kCLLocationAccuracyBest;

// 开始获取用户的位置

[_mgr startUpdatingLocation];

 

定位管理器的代理方法:

当用户的位置发生改变时,就会不断调用代理方法,比如

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

当定位失败时,会调用

 

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

 

通过地址获得经纬度 :

CLGeocoder:地理信息编解码

地址 -> 经纬度 -> 大头针显示

_geocoder = [[CLGeocoder alloc] init];

[_geocoder geocodeAddressString:@“东三旗" completionHandler:^(NSArray *placemarks, NSError *error) {

     //没有找到符合要求的地址

    if (placemarks.count == 0) return;

    // 取出位置

    CLPlacemark *firstPlacemark = placemarks[0];  

    // 添加大头针

    MyAnnotation *anno = [[MyAnnotation alloc] init];

    anno.title = firstPlacemark.name; // 名称

    anno.subtitle = firstPlacemark.country; // 国家

    anno.coordinate = firstPlacemark.location.coordinate; // 坐标

    [_mapView addAnnotation:anno];

 

 }];

   

 
 

   

 

   

 
 
 
程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!
分类: iOS高级
 
 
本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4893027.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
19980 0
iOS 版百度地图 SDK 满视口显示一组大头针
iOS 版百度地图 SDK 满视口显示一组大头针 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循“署名-非商业用途-保持一致”创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。
1191 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
23523 0
我的Android进阶之旅------&gt;Android使用百度地图时,关于android.permission.BAIDU_LOCATION_SERVICE的声明警告。
【重要提醒】 定位SDKv3.1版本之后,以下权限已不需要,请取消声明,否则将由于Android 5.0多帐户系统加强权限管理而导致应用安装失败。 声明和使用以下权限 来源于百度:http://developer.
1189 0
postgres+socket.io+nodejs实时地图应用实践
nodejs一直以异步io著称,其语言特性尤其擅长于在realtime应用中,如聊天室等。在进行实时应用开发时,必不可少的需要用到 socket.io库,可以说,nodejs+socket.io在实时应用中具有较好的表现能力。
1040 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
16589 0
[Windwos Phone] 实作地图缩放 MapAnimationKind 属性效果
原文:[Windwos Phone] 实作地图缩放 MapAnimationKind 属性效果 [前言] 使用经纬度来定位地图的位置,以及使用 MapAnimationKind 属性来设定地图缩放时的动画。
829 0
+关注
580
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载