在IOS开发中,最常见的功能之一就是地图定位功能,不单单是百度地图,高德地图等专业的地图导航软件,还有美团,咕咚等一些美食购物类和运动类也需要这样的功能,所以学会这项技能是一名IOS开发工程师必须的.





分享一些比较基础的关于定位方面的小知识.

关于定位有两个框架

1.CoreLocation ---->用于地理定位

2.Map Kit ---->用于地图展示

两个热词:

LBS: location based service

SLM: social local mobile

使用CoreLocation定位

首先在之前需要导入corelocation框架,然后在头文件导入corelocation.h头文件.

注意:coordinate是坐标,latitude是纬度,longitude是经度.

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 1.创建位置管理者
    CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    self.locationManager = locationManager;
    // 在iO8之前,只要导入CoreLocation 会自动申请权限
    // 在iOS8之后需要程序员手写     // 2.请求用户授权    必须要配置info.plist文件
//在info里面配置NSLocationAlwaysUsageDescription或者
//NSLocationWhenInUseUsageDescription
    // 请求app始终授权  无论程序在前台还是在后台运行  都可以使用定位
//    [locationManager requestAlwaysAuthorization];
    // 请求app在使用期间授权   在前台使用时才可以使用定位
    [locationManager requestWhenInUseAuthorization];
    
    if ([UIDevice currentDevice].systemVersion.floatValue >= 9.0) {
        // 临时开启后台定位  配置info.plist文件  不配置直接崩溃
        locationManager.allowsBackgroundLocationUpdates = YES;
    }
    // 3.设置属性(两个属性是为了让程序可以持续的进行定位)
//    // 距离筛选  单位:米  当用户移动100.5米后调用定位方法
//    locationManager.distanceFilter = 100.5;
//    // 期望精度  单位:米  系统默认将100米范围内作为一个位置
//    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    // 4.设置代理
    locationManager.delegate = self;
    // 5.开启定位
    [locationManager startUpdatingLocation];
    // 开始更新移动方向
//    [locationManager startUpdatingHeading]; //代理方法,一旦开启定位,会自动调用这个代理方法
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
    // 获取数据
//    NSLog(@"%@",locations);
    // 停止定位  省电
//    [manager stopUpdatingLocation];
} // 比较位置的距离  比较的是两点之间的直线距离
- (void)compareDistance
{
    // 北京的位置
    CLLocation *location = [[CLLocation alloc] initWithLatitude:39 longitude:115];
    // 上海的位置
    CLLocation *location1 = [[CLLocation alloc] initWithLatitude:30 longitude:120];
    // 比较北京到上海的位置(直线距离)
    double distance = [location distanceFromLocation:location1];
    // 单位:米
    NSLog(@"%f",distance / 1000);
}
    
使用MapKit定位

修改地图类型   mapView.mapType

地图实时交通状态 mapView.showsTraffic

设置用户跟踪模式  mapView.userTrackingMode

代理方法,

//显示在地图中用户定位的位置

-(void)mapView:(MKMapView\*)mapView didUpdateUserLocation:(MKUserLocation \*)userLocation

//获取实时地图变化的区域变化(中心点,区域跨度)

-(void)mapView:(MKMapView \*)mapView regionDidChangeAnimated:(BOOL)animated

注意:这里需要导入的是MapKit框架和MapKit.h头文件.

- (void)viewDidLoad {
    [super viewDidLoad];
     
    // 修改地图类型
    /*
     MKMapTypeStandard    标准(默认)
     MKMapTypeSatellite   卫星
     MKMapTypeHybrid      混合
     MKMapTypeSatelliteFlyover  在中国暂时不能使用
     MKMapTypeHybridFlyover 在中国暂时不能使用
     */
    self.mapView.mapType = MKMapTypeStandard;
    
    // 实时交通状况 iOS9新增
    self.mapView.showsTraffic = YES;
    
    // 创建位置管理者
    self.locationManager = [[CLLocationManager alloc] init];
    // 请求用户授权  配置info.plist
    [self.locationManager requestWhenInUseAuthorization];
    // 设置用户的跟踪模式
    /*
     MKUserTrackingModeFollow  跟踪用户的位置   MKUserTrackingModeFollowWithHeading  跟踪用户的位置和方向
     */
    self.mapView.userTrackingMode = MKUserTrackingModeFollow;
    
    // 设置代理
    self.mapView.delegate = self;
} // 跟踪到用户位置时调用
// mapView:地图
// userLocation:用户位置的大头针模型
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    // 1.反地理编码
    // 1.1创建地理编码对象
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    // 1.2反地理编码
    [geocoder reverseGeocodeLocation:userLocation.location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        // 1.3防错处理
        if (error) {
            NSLog(@"%@",error);
            return ;
        }
        // 1.4获取地标
        CLPlacemark *placemark = [placemarks firstObject];
        // 2.给标题和子标题赋值
        userLocation.title = placemark.locality;
        userLocation.subtitle = placemark.name;
    }];
} // 回到当前用户的位置
- (IBAction)backToCurrentLocation
{
    
    // 获取当前的跨度
    MKCoordinateSpan span = MKCoordinateSpanMake(0.024967, 0.015407);
    // 设置回到用户刚开始的区域 region(结构体) --1.中心点经纬度(结构体)--> 经度和纬度  2.经纬度跨度(结构体)-->经度跨度和纬度跨度
    // 设置区域并使用动画
    [self.mapView setRegion:MKCoordinateRegionMake(self.mapView.userLocation.location.coordinate, span) animated:YES];
} - (IBAction)biggerMap
{
    // 修改经纬度跨度
    CGFloat latitudeDelta = self.mapView.region.span.latitudeDelta * 0.5;
    CGFloat longitudeDelta = self.mapView.region.span.longitudeDelta * 0.5;
    MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta);
    // 确定放大地图后的区域
    [self.mapView setRegion:MKCoordinateRegionMake(self.mapView.centerCoordinate, span) animated:YES];
}
- (IBAction)smallerMap
{
    // 修改经纬度跨度
    CGFloat latitudeDelta = self.mapView.region.span.latitudeDelta * 2;
    CGFloat longitudeDelta = self.mapView.region.span.longitudeDelta * 2;
    MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta);
    [self.mapView setRegion:MKCoordinateRegionMake(self.mapView.centerCoordinate, span) animated:YES];
}

演示

说到底,其实苹果官方的框架已经做得不错了,该有的功能基本都具备,而且使用起来不是怎么困难,掌握起来也非常快.我这里只是分享一些比较基础的功能,欢迎工程师们赐教.

另外附上地理编码的小演示.

iOS | 地图定位的更多相关文章

  1. iOS地图 -- 定位初使用

    iOS的定位服务用到的框架是#import <CoreLocation/CoreLocation.h> 定位中用到的类是CLLocationManager 一.iOS8.0之前的定位 向用 ...

  2. 关于iOS地图定位中点击设置->隐私->定位服务 闪退问题

    iOS8之后,如果应用中用到了地图定位,那么点击设置->隐私->定位服务 再点击该应用有时候会出现闪退问题,其原因是iOS8之后定位中添加了 NSLocationWhenInUseDesc ...

  3. iOS 地图定位及大头针的基本使用

    地图 Part1 - 定位及大头针的基本使用 一.MapKit 作用 : 用于地图展示 如大头针,路线,覆盖层展示等(着重界面展示) 使用步骤 导入头文件 #import <MapKit/Map ...

  4. iOS地图 -- 定位中的CLLocation的介绍与小练习

    通过定位练习,熟悉CLLocation 在上篇笔记中提到了CLLocation类,这里通过练习来讲解一下这个类,类中包含了获取到的用户位置的信息 coordinate --> 坐标,经度和纬度 ...

  5. ios8版本地图定位注意点

    学习ios地图定位 我先定义一个属性: @property (weak, nonatomic) IBOutlet MKMapView *mapV; 然后在项目运行时初始化该属性一些参数: //设置地图 ...

  6. iOS之定位与地图

    概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用 和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一 ...

  7. IOS中使用百度地图定位后获取城市坐标,城市名称,城市编号信息

    IOS中使用百度地图定位后获取城市坐标,城市名称,城市编号信息 /**当获取到定位的坐标后,回调函数*/ - (void)didUpdateBMKUserLocation:(BMKUserLocati ...

  8. iOS 获取用户授权的用户隐私保护-地图定位

    获取用户授权的用户隐私保护地图定位示例://导入定位框架#import<CoreLocation/CoreLocation.h>@interfaceViewController()< ...

  9. iOS 地图坐标系之间的转换WGS-84世界标准坐标、GCJ-02中国国测局(火星坐标,高德地图)、BD-09百度坐标系转换

    开发过程中遇到地图定位不准确,存在偏差.首先确认你获取到的坐标所在坐标系跟地图数据是不是相匹配的. 常用的地图SDK:高德地图使用的是GCJ-02(也就是火星坐标系),百度使用的是BD-09百度坐标系 ...

随机推荐

  1. 1个示例 学会 mvc 常用标签

    HtmlHelper用法大全3:Html.LabelFor.Html.EditorFor.Html.RadioButtonFor.Html.CheckBoxFor  @Html.***For:为由指定 ...

  2. 使用Access作数据库

    import java.sql.*; public class ConnectAccess { public static void main(String args[]){ ConnectAcces ...

  3. NodeJs异步上传multer插件报Multipart: Boundary not found错误解决方法

    NodeJs-express架构下实现文件上传两大利器: 1.前端异步插件h5uploader https://github.com/wewoor/h5uploader 2.后端处理multer ht ...

  4. redis的有序集合(Sorted Sets)数据类型

    和Sets相比,Sorted Sets增加了一个权重参数score,使得集合中的元素能够按score进行有序排列,比如一个存储全班同学成绩的Sorted Sets,其集合value可以是同学的学号,而 ...

  5. oracle学习篇三:SQL查询

    select * from emp; --1.找出部门30的员工select * from emp where deptno = 30; --2.列出所有办事员(CLERK)的姓名,变化和部门编号se ...

  6. log4.j

    导入第三方jar包 第一步:右击工程名,新建一个文件夹(Fold),名字为lib. 第二步:把第三方jar包复制到lib目录下. 第三步:右击工程名---->properties ----> ...

  7. 转:如何利用已有的切片文件生成TPK

    Tpk是ArcGIS 10.1即将推出的一种新的数据文件类型,主要是用于将切片文件打包形成离线地图包.Tpk可以在ArcGIS Runtime中作为切片底图被加载.在ArcGIS 10.1中Tpk的生 ...

  8. Shader之性能优化

    1.像素>>顶点数>>物体个数:shader中的计算应首先考虑放在script,其次vert,最后frag中 2.尽量用精度小的类型替换精度大的类型(特别是在frag中,要尽可 ...

  9. 栈帧示意图:stack pointer、frame pointer

    更多参考:http://www.embeddedrelated.com/usenet/embedded/show/31646-1.php 一: The calling convention descr ...

  10. JSP禁用缓存的方式 response.setHeader( "Pragma", "no-cache" ); setDateHeader("Expires", 0);

    JSP禁用缓存的方式    使用服务器端控制AJAX页面缓存:        response.setHeader( "Pragma", "no-cache" ...