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的定位服务用到的框架是#import <CoreLocation/CoreLocation.h> 定位中用到的类是CLLocationManager 一.iOS8.0之前的定位 向用 ...
- 关于iOS地图定位中点击设置->隐私->定位服务 闪退问题
iOS8之后,如果应用中用到了地图定位,那么点击设置->隐私->定位服务 再点击该应用有时候会出现闪退问题,其原因是iOS8之后定位中添加了 NSLocationWhenInUseDesc ...
- iOS 地图定位及大头针的基本使用
地图 Part1 - 定位及大头针的基本使用 一.MapKit 作用 : 用于地图展示 如大头针,路线,覆盖层展示等(着重界面展示) 使用步骤 导入头文件 #import <MapKit/Map ...
- iOS地图 -- 定位中的CLLocation的介绍与小练习
通过定位练习,熟悉CLLocation 在上篇笔记中提到了CLLocation类,这里通过练习来讲解一下这个类,类中包含了获取到的用户位置的信息 coordinate --> 坐标,经度和纬度 ...
- ios8版本地图定位注意点
学习ios地图定位 我先定义一个属性: @property (weak, nonatomic) IBOutlet MKMapView *mapV; 然后在项目运行时初始化该属性一些参数: //设置地图 ...
- iOS之定位与地图
概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用 和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一 ...
- IOS中使用百度地图定位后获取城市坐标,城市名称,城市编号信息
IOS中使用百度地图定位后获取城市坐标,城市名称,城市编号信息 /**当获取到定位的坐标后,回调函数*/ - (void)didUpdateBMKUserLocation:(BMKUserLocati ...
- iOS 获取用户授权的用户隐私保护-地图定位
获取用户授权的用户隐私保护地图定位示例://导入定位框架#import<CoreLocation/CoreLocation.h>@interfaceViewController()< ...
- iOS 地图坐标系之间的转换WGS-84世界标准坐标、GCJ-02中国国测局(火星坐标,高德地图)、BD-09百度坐标系转换
开发过程中遇到地图定位不准确,存在偏差.首先确认你获取到的坐标所在坐标系跟地图数据是不是相匹配的. 常用的地图SDK:高德地图使用的是GCJ-02(也就是火星坐标系),百度使用的是BD-09百度坐标系 ...
随机推荐
- 初学Hadoop之中文词频统计
1.安装eclipse 准备 eclipse-dsl-luna-SR2-linux-gtk-x86_64.tar.gz 安装 1.解压文件. 2.创建图标. ln -s /opt/eclipse/ec ...
- Session&Cookie 简介及使用
Cookie cookie 是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie.你可以使用 JavaScript 或其它语言来创建和取回 cookie ...
- Web前端面试指导(九):盒子模型你是怎么理解的?
问题分析 这道题问得比较宽泛,一定要找准切入点,如果切入点找不准,很容易乱答,甚至答偏,所以找准切入点是非常的重要的. 解答思路 1)盒子模型有两种,W3C和IE盒子模型 (1)W3C定义的盒子模型包 ...
- Js浮动广告效果实现
第一种 漂浮广告 不符合W3CJavaScript漂浮广告代码,很不错,代码精简,不过一次只有漂一个,复制就能用了.希望站长朋友喜欢. <html> <head> <ti ...
- 跨平台移动开发_PhoneGap 使用Geolocation基于所在地理位置坐标调用百度地图API
使用Geolocation基于所在地理位置坐标调用百度地图API 效果图 示例代码 <!DOCTYPE html> <html> <head> <title& ...
- t d x 示例z
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServi ...
- 记录项目代码迁移后,UI测试框架的搭建(配置文件的修改、测试脚本试运行)
前文:记录一次项目代码迁移过程 上文代码迁移的目的就是为了新增vue脚手架自带的UI测试框架,工具有了,就需要实践运行在项目中了(修改配置文件.编写测试脚本等). 一.单元测试 测试框架 karma ...
- Angular5+ 自定义表单验证器
Angular5+ 自定义表单验证器 Custom Validators 标签(空格分隔): Angular 首先阐述一下遇到的问题: 怎样实现"再次输入密码"的验证(两个cont ...
- ubuntu安装google test
google test 简称gtest,是一个C/C++的单元测试框架,它的代码在github仓库,使用起来还是挺方便的. 安装 先确保PC上有安装cmake: sudo cmake --versio ...
- Oracle 通过undo块查看事务信息
数据库版本:Oracle 11.2.0.3 RAC 实验目的:通过undo块查看Oracle事务信息 实验细节:1 开始一个事务SQL> select * from t1; ID NAME--- ...