iOS | 地图定位

时间:2021-12-15 15:44:30

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

iOS | 地图定位

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 | 地图定位

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

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

iOS | 地图定位

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

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

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

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

    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中使用百度地图定位后获取城市坐标&comma;城市名称&comma;城市编号信息

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

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

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

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

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

随机推荐

  1. Spark Programming--WordCount

    首先在$SPARK_HOME主目录下建立一个test文件夹,里面放一些文件(注意文件全部内容都可被hadoop用户访问,否则运行会出现permission denied的错误) 打开pyspark: ...

  2. 创建性能监视器(logman)

    在本地计算机上抓取性能信息 Logman.exe create counter Perf-1Second -f bincirc -max 500 -c "\Processor(*)\% Pr ...

  3. 华为G520联通版刷机包 基于MIUI CM11新 平稳 稳定

    ROM介绍 刷先配置双卡:"设定-安卓原生设置-双卡套-配置订阅",否则,无信号 使开发人员选项方法:"设定-安卓原生设置-关于手机-发布"连续点击版本 启用A ...

  4. JDK1&period;8源码阅读系列之三:Vector

    本篇随笔主要描述的是我阅读 Vector 源码期间的对于 Vector 的一些实现上的个人理解,用于个人备忘,有不对的地方,请指出- 先来看一下 Vector 的继承图: 可以看出,Vector 的直 ...

  5. 关于c&num;邮件发送的简单例子

    这里所说的发送邮件,以发送qq邮件为例. 首先我们先要在自己的邮箱配置好如下选项:

  6. &OpenCurlyDoubleQuote;最美天气”版本II

    抓取实时天气前需要首先获得所有地区的cityCode,因为在最后queryWeather的时候需要传递这个参数. 最美天气获取全部cityCode及cityName的方法: 1.获取34个省及直辖市的 ...

  7. 4&period;ElasticSearch的基本api操作

    1. ElasticSearch的Index 1. 索引初始化 在创建索引之前 对索引进行初始化操作 指定shards数量和replicas数量 curl -XPUT 'http://192.168. ...

  8. &lbrack;Swift&rsqb;LeetCode889&period; 根据前序和后序遍历构造二叉树 &vert; Construct Binary Tree from Preorder and Postorder Traversal

    Return any binary tree that matches the given preorder and postorder traversals. Values in the trave ...

  9. Docker Kubernetes 常用命令

    Docker Kubernetes 常用命令 增 # 通过文件名或标准输入创建资源. kubectl create # 读取指定文件内容,进行创建.(配置文件可指定json,yaml文件). kube ...

  10. JDBC事务的处理-----模拟银行转账业务

    定义: 数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成. 概要: 一个数据库事务通常包含了一个序列的对数据库的读/写操作.它的存在包含有以下两个目的: ...