地图和定位的基本使用

近些天用到了有关定位的功能,所以顺便把自己用到的一些相关知识整理如下.

一.定位要使用" CoreLocation "框架

想要定位,大概需要使用以下5个步骤:

1.首先创建一个"强引用"的位置管理器CLLocationManager

2.设置位置管理器的代理

3.请求用户授权(iOS8后方法)

>设置方法requestWhenInUseAuthorization    或requestAlwaysAuthorization

>配置plist文件 NSLocationWhenInUseUsageDescription  或  NSLocationAlwaysUsageDescription

>注意1对1对应

4.开启定位

startUpdatingLocation  对应的有停止定位stopUpdatingLocation

5.实现didUpdateLocations代理方法

>代理方法一直调用,会非常耗电。除非特殊需求(如导航),可以使用stopUpdatingLocation停止定位,实现一次定位

>除了停止定位,还可以设置管理器的distanceFilter,当用户改变位置一定值后才会调用。(如后面跟50,即改变50米后调用一次代理方法)-->持续定位

>desiredAccuracy-->定位精度-->将周围一定值的范围看作一个地点

比较两点之间的距离使用CLLocation的distanceFromLocation方法--  注意计算出来的是直线距离

iOS9新特性-->后台定位-->allowsBackgroundLocationUpdates

>当用户授权为使用期间时,可以设置这个属性为YES,在plist中添加"Required background modes"  在字典中添加值"App registers for location updates".

二.地理编码和反地理编码都使用CLGeocoder类来实现.

地理编码使用 geocodeAddressString: completionHandler: 方法.将一个地名字符串转换为经纬度。

在此方法中得到一个装着CLPlacemark的数组。一个CLPlacemark表示一个地理坐标,有位置信息(经纬度),以及地理位置的详情,如下:

name                    地名

thoroughfare            街道

subThoroughfare        街道相关信息,例如门牌等

locality                城市

subLocality            城市相关信息,例如标志性建筑

administrativeArea      直辖市

subAdministrativeArea  其他行政区域信息(自治区等)

postalCode              邮编

ISOcountryCode          国家编码

country                国家

inlandWater            水源,湖泊

ocean                  海洋

areasOfInterest        关联的或利益相关的地标

将CLPlacemark中的经纬度取出,就完成了地理编码

反地理编码使用reverseGeocodeLocation: completionHandler: 方法.将一个包含经纬度的CLLocation传进去,得到位置信息,就是反地理编码。

在得到的CLPlacemark中取出name信息即可。

三.mapView的基本使用需要用到  "MapKit 框架

注意:在storyBoard中使用到非UIKit的框架,要在项目的TARGETS-->General-->Linked Frameworks and Libraries中点击+号添加框架

1.定位到用户位置

1.1 创建位置管理器并请求用户授权

1.2 设置mapView的跟踪模式userTrackingMode

MKUserTrackingModeNone  //不跟踪

MKUserTrackingModeFollow //跟踪位置

MKUserTrackingModeFollowWithHeading //跟踪位置和移动方向

2.设置用户位置大头针的属性

2.1 设置mapView的代理,实现协议,在didUpdateUserLocation方法中拿到MKUserLocation类型的大头针

2.2 userLocation有location、title、subtitle属性,根据location反地理编码拿到CLPlacemark并赋值给title和subtitle即可

3.回到用户当前位置

3.1 确定当前位置(region-->MKCoordinateRegion)

确定一个区域和确定一个圆类似,需要且只需要确定两个元素:1.中心点经纬度CLLocationCoordinate2D-->self.mapView.userLocation.coordinate  2.经纬度跨度span-->MKCoordinateSpan  两个都是结构体,直接make。

3.2 如何确定系统默认经纬度跨度 --> 在mapView的代理方法regionDidChangeAnimated中,当地图区域改变时回自动调用,在此方法中打印经纬度跨度。

如果需要动画回到当前位置,调用mapView的 setRegion: animated:

4.放大(缩小)地图

放大和缩小地图其实就是:"当前"地图显示的中心点经纬度不变,经纬度跨度(span)缩小或增大2倍;

注意:在回到当前位置设置region时的中心点经纬度是定位到用户的经纬度(userLocation),而放大缩小地图的中心点经纬度是当前地图界面的中心点经纬度。

四.添加大头针模型设计

1.导入框架

-->在模型类中导入mapKit框架

2.遵守协议

-->遵守MKAnnotation协议

3.实现属性

-->实现title\subtitle\coordinate(可直接跳进头文件复制,注意删除readonly修饰)

添加大头针 -->mapView的addAnnotation: 方法

#pragma mark 修改大头针颜色,动画掉落

mapView的viewForAnnotation代理方法中实现,这块和cell的创建基本一样

1.首先创建一个唯一的标识符ID

static NSString *ID = @"annotation"

2.根据ID去缓存池取:

MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:ID];

3.如果取不到(为空),再创建

annotationView = [[MKAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:ID];

MKAnnotationView默认是没有界面的,MKPinAnnotationView继承自MKAnnotationView,可以设置大头针颜色,动画掉落效果。而父类MKAnnotationView中的属性方法其子类都有,如:

canShowCallout --> 能否显示大头针详情

leftCalloutAccessoryView \ rightCalloutAccessoryView \ detailCalloutAccessoryView-->分别对应左\右\详情的视图.

注意如果大头针没有设置title属性,就不能显示左右和详情视图。如果同时设置了大头针的subtitle和detailCalloutAccessoryView,会显示detailCalloutAccessoryView。

在代理方法中如果直接return nil  系统会默认创建一个系统样式的大头针--> 当需要系统蓝光圈的大头针时,可以判断代理方法中参数的类型,匹配就return nil

#pragma mark  自定义实现动画掉落效果

自定义动画效果在mapView的代理方法didAddAnnotationViews 中实现,此方法在加载完大头针的view时系统自动调用

自定义动画掉落思路: 1.保存大头针位置    2.修改大头针位置的Y值    3.动画返回到大头针默认位置

注意:如果要取消系统默认蓝光圈(MKModernUserLocationView类型)的动画掉落效果,在didAddAnnotationViews 代理方法中判断传进来的MKAnnotationView类型(MKModernUserLocationView是私有方法,用NSClassFromString方法替代 [MKModernUserLocationView class])

#pragma mark  封装代码

这里的封装代码和tableViewCell类似,不再赘述.

只是要注意如果不给大头针添加模型,系统会自动调用set方法,所以在工作中处理数据的代码可以放在set方法中。注意调用父类方法[super setAnnotation:annotation];

五.实现导航

地图导航所需的数据拿不到,交由苹果处理,在中国苹果交友高德地图处理。由于封装的比较好,我们本质上只需要一行代码:

MKMapItem openMapsWithItems: launchOptions:

根据所需传入的参数倒推即可。

所需正序步骤:

1.地理编码目的地位置

>>使用CLGeocoder进行地理编码,得到CLPlacemark

2.转换CLPlacemark --> MKPlacemark

MKPlacemark *mkPlacemark = [[MKPlacemark alloc] initWithPlacemark:placemark];

3.获取当前位置和目的地mapItem

//目的地的item

MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:mkPlacemark];

//当前位置的item

MKMapItem *currentmapItem = [MKMapItem mapItemForCurrentLocation];

4.开始导航

MKMapItem openMapsWithItems: launchOptions:

第一个参数传入目的地和当前位置的数组,第二个是选项的字典。如下:

//keys

MKLaunchOptionsMapCenterKey:地图中心的坐标(NSValue)

MKLaunchOptionsMapSpanKey:地图显示的范围(NSValue)

MKLaunchOptionsShowsTrafficKey:是否显示交通信息(boolean NSNumber)

//MKLaunchOptionsDirectionsModeKey: 导航类型(NSString)

{

MKLaunchOptionsDirectionsModeDriving:驾车

MKLaunchOptionsDirectionsModeWalking:步行

}

//MKLaunchOptionsMapTypeKey:地图类型(NSNumber)

enum {

MKMapTypeStandard = 0,

MKMapTypeSatellite,

MKMapTypeHybrid

};//MKLaunchOptionsCameraKey  3D地图效果

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容